Example usage for org.joda.time Interval withEnd

List of usage examples for org.joda.time Interval withEnd

Introduction

In this page you can find the example usage for org.joda.time Interval withEnd.

Prototype

public Interval withEnd(ReadableInstant end) 

Source Link

Document

Creates a new interval with the specified end instant.

Usage

From source file:com.addthis.basis.time.Dates.java

License:Apache License

/**
 * Truncate interval start and end by current time
 * (start/end values after current time are set to current time)
 * <p/>/*from   w w  w.j  a va 2  s.  co  m*/
 * Truncate interval start by a specified number of period types
 * (eg. 30 days, 52 weeks, etc.)
 * <p/>
 * If type is null, no truncation is performed.
 * <p/>
 * When no truncation is performed, the input interval is returned
 * (this is useful for efficiently testing if truncation was performed).
 *
 * @param interval
 * @param limit    number of TYPE periods above which interval should be truncated
 * @param type     single field period type (the result of this method is undefined for multi-field period types)
 * @return
 */
public static Interval truncateInterval(Interval interval, int limit, PeriodType type) {
    Interval truncatedInterval = interval;
    if (type != null) {
        // Truncate end
        DateTime now = new DateTime();
        if (interval.getEnd().isAfter(now)) {
            if (interval.getStart().isAfter(now)) {
                truncatedInterval = new Interval(now, now);
            } else {
                truncatedInterval = interval.withEnd(now);
            }
        }

        // Truncate start
        if (truncatedInterval.toPeriod(type).getValue(0) > --limit) {
            Period limitPeriod = period(limit, type);
            DateTime truncatedStart = truncatedInterval.getEnd().minus(limitPeriod);
            truncatedInterval = truncatedInterval.withStart(truncatedStart);
        }
    }
    return truncatedInterval;
}

From source file:com.metamx.druid.index.v1.IncrementalIndexStorageAdapter.java

License:Open Source License

@Override
public Iterable<Cursor> makeCursors(final Filter filter, final Interval interval, final QueryGranularity gran) {
    Interval actualIntervalTmp = interval;
    Interval dataInterval = getInterval();
    if (!actualIntervalTmp.overlaps(dataInterval)) {
        return ImmutableList.of();
    }//www. ja  v a2  s .  c o m

    if (actualIntervalTmp.getStart().isBefore(dataInterval.getStart())) {
        actualIntervalTmp = actualIntervalTmp.withStart(dataInterval.getStart());
    }
    if (actualIntervalTmp.getEnd().isAfter(dataInterval.getEnd())) {
        actualIntervalTmp = actualIntervalTmp.withEnd(dataInterval.getEnd());
    }

    final Interval actualInterval = actualIntervalTmp;

    return new Iterable<Cursor>() {
        @Override
        public Iterator<Cursor> iterator() {
            return FunctionalIterator.create(
                    gran.iterable(actualInterval.getStartMillis(), actualInterval.getEndMillis()).iterator())
                    .transform(new Function<Long, Cursor>() {
                        EntryHolder currEntry = new EntryHolder();
                        private final ValueMatcher filterMatcher;

                        {
                            filterMatcher = makeFilterMatcher(filter, currEntry);
                        }

                        @Override
                        public Cursor apply(@Nullable final Long input) {
                            final long timeStart = Math.max(input, actualInterval.getStartMillis());

                            return new Cursor() {
                                private Iterator<Map.Entry<IncrementalIndex.TimeAndDims, Aggregator[]>> baseIter;
                                private ConcurrentNavigableMap<IncrementalIndex.TimeAndDims, Aggregator[]> cursorMap;
                                final DateTime time;
                                int numAdvanced = -1;
                                boolean done;

                                {
                                    cursorMap = index.getSubMap(
                                            new IncrementalIndex.TimeAndDims(timeStart, new String[][] {}),
                                            new IncrementalIndex.TimeAndDims(Math
                                                    .min(actualInterval.getEndMillis(), gran.next(timeStart)),
                                                    new String[][] {}));
                                    time = gran.toDateTime(input);

                                    reset();
                                }

                                @Override
                                public DateTime getTime() {
                                    return time;
                                }

                                @Override
                                public void advance() {
                                    if (!baseIter.hasNext()) {
                                        done = true;
                                        return;
                                    }

                                    while (baseIter.hasNext()) {
                                        currEntry.set(baseIter.next());

                                        if (filterMatcher.matches()) {
                                            return;
                                        }
                                    }

                                    if (!filterMatcher.matches()) {
                                        done = true;
                                    }
                                }

                                @Override
                                public boolean isDone() {
                                    return done;
                                }

                                @Override
                                public void reset() {
                                    baseIter = cursorMap.entrySet().iterator();

                                    if (numAdvanced == -1) {
                                        numAdvanced = 0;
                                        while (baseIter.hasNext()) {
                                            currEntry.set(baseIter.next());
                                            if (filterMatcher.matches()) {
                                                return;
                                            }

                                            numAdvanced++;
                                        }
                                    } else {
                                        Iterators.skip(baseIter, numAdvanced);
                                        if (baseIter.hasNext()) {
                                            currEntry.set(baseIter.next());
                                        }
                                    }

                                    done = cursorMap.size() == 0 || !baseIter.hasNext();

                                }

                                @Override
                                public DimensionSelector makeDimensionSelector(String dimension) {
                                    final String dimensionName = dimension.toLowerCase();
                                    final IncrementalIndex.DimDim dimValLookup = index
                                            .getDimension(dimensionName);
                                    if (dimValLookup == null) {
                                        return null;
                                    }

                                    final int maxId = dimValLookup.size();
                                    final int dimIndex = index.getDimensionIndex(dimensionName);

                                    return new DimensionSelector() {
                                        @Override
                                        public IndexedInts getRow() {
                                            final ArrayList<Integer> vals = Lists.newArrayList();
                                            if (dimIndex < currEntry.getKey().getDims().length) {
                                                final String[] dimVals = currEntry.getKey().getDims()[dimIndex];
                                                if (dimVals != null) {
                                                    for (String dimVal : dimVals) {
                                                        int id = dimValLookup.getId(dimVal);
                                                        if (id < maxId) {
                                                            vals.add(id);
                                                        }
                                                    }
                                                }
                                            }

                                            return new IndexedInts() {
                                                @Override
                                                public int size() {
                                                    return vals.size();
                                                }

                                                @Override
                                                public int get(int index) {
                                                    return vals.get(index);
                                                }

                                                @Override
                                                public Iterator<Integer> iterator() {
                                                    return vals.iterator();
                                                }
                                            };
                                        }

                                        @Override
                                        public int getValueCardinality() {
                                            return dimValLookup.size();
                                        }

                                        @Override
                                        public String lookupName(int id) {
                                            return dimValLookup.getValue(id);
                                        }

                                        @Override
                                        public int lookupId(String name) {
                                            return dimValLookup.getId(name);
                                        }
                                    };
                                }

                                @Override
                                public FloatMetricSelector makeFloatMetricSelector(String metric) {
                                    final String metricName = metric.toLowerCase();
                                    final Integer metricIndexInt = index.getMetricIndex(metricName);
                                    if (metricIndexInt == null) {
                                        return new FloatMetricSelector() {
                                            @Override
                                            public float get() {
                                                return 0.0f;
                                            }
                                        };
                                    }

                                    final int metricIndex = metricIndexInt;

                                    return new FloatMetricSelector() {
                                        @Override
                                        public float get() {
                                            return currEntry.getValue()[metricIndex].getFloat();
                                        }
                                    };
                                }

                                @Override
                                public ComplexMetricSelector makeComplexMetricSelector(String metric) {
                                    final String metricName = metric.toLowerCase();
                                    final Integer metricIndexInt = index.getMetricIndex(metricName);
                                    if (metricIndexInt == null) {
                                        return null;
                                    }

                                    final int metricIndex = metricIndexInt;

                                    final ComplexMetricSerde serde = ComplexMetrics
                                            .getSerdeForType(index.getMetricType(metricName));

                                    return new ComplexMetricSelector() {
                                        @Override
                                        public Class classOfObject() {
                                            return serde.getObjectStrategy().getClazz();
                                        }

                                        @Override
                                        public Object get() {
                                            return currEntry.getValue()[metricIndex].get();
                                        }
                                    };
                                }
                            };
                        }
                    });
        }
    };
}

From source file:com.metamx.druid.index.v1.IndexStorageAdapter.java

License:Open Source License

@Override
public Iterable<Cursor> makeCursors(final Filter filter, final Interval interval, final QueryGranularity gran) {
    Interval actualIntervalTmp = interval;
    if (!actualIntervalTmp.overlaps(index.dataInterval)) {
        return ImmutableList.of();
    }//w  ww. j  av  a 2  s . c om

    if (actualIntervalTmp.getStart().isBefore(index.dataInterval.getStart())) {
        actualIntervalTmp = actualIntervalTmp.withStart(index.dataInterval.getStart());
    }
    if (actualIntervalTmp.getEnd().isAfter(index.dataInterval.getEnd())) {
        actualIntervalTmp = actualIntervalTmp.withEnd(index.dataInterval.getEnd());
    }

    final Interval actualInterval = actualIntervalTmp;

    final Pair<Integer, Integer> intervalStartAndEnd = computeTimeStartEnd(actualInterval);

    return new Iterable<Cursor>() {
        @Override
        public Iterator<Cursor> iterator() {
            final Offset baseOffset;
            if (filter == null) {
                baseOffset = new ArrayBasedOffset(ids, intervalStartAndEnd.lhs);
            } else {
                baseOffset = new StartLimitedOffset(
                        new ConciseOffset(filter.goConcise(new IndexBasedBitmapIndexSelector(index))),
                        intervalStartAndEnd.lhs);
            }

            final Map<String, Object> metricHolderCache = Maps.newHashMap();

            // This after call is not perfect, if there is an exception during processing, it will never get called,
            // but it's better than nothing and doing this properly all the time requires a lot more fixerating
            return MoreIterators.after(FunctionalIterator.create(
                    gran.iterable(actualInterval.getStartMillis(), actualInterval.getEndMillis()).iterator())
                    .keep(new Function<Long, Cursor>() {
                        @Override
                        public Cursor apply(final Long intervalStart) {
                            final Offset offset = new TimestampCheckingOffset(baseOffset, index.timeOffsets,
                                    Math.min(actualInterval.getEndMillis(), gran.next(intervalStart)));

                            return new Cursor() {

                                private final Offset initOffset = offset.clone();
                                private Offset cursorOffset = offset;
                                private final DateTime timestamp = gran.toDateTime(intervalStart);

                                @Override
                                public DateTime getTime() {
                                    return timestamp;
                                }

                                @Override
                                public void advance() {
                                    cursorOffset.increment();
                                }

                                @Override
                                public boolean isDone() {
                                    return !cursorOffset.withinBounds();
                                }

                                @Override
                                public void reset() {
                                    cursorOffset = initOffset.clone();
                                }

                                @Override
                                public DimensionSelector makeDimensionSelector(String dimension) {
                                    final String dimensionName = dimension.toLowerCase();
                                    final String[] nameLookup = index.reverseDimLookup.get(dimensionName);
                                    if (nameLookup == null) {
                                        return null;
                                    }

                                    return new DimensionSelector() {
                                        final Map<String, Integer> dimValLookup = index.dimIdLookup
                                                .get(dimensionName);
                                        final DimensionColumn dimColumn = index.dimensionValues
                                                .get(dimensionName);
                                        final int[][] dimensionExpansions = dimColumn.getDimensionExpansions();
                                        final int[] dimensionRowValues = dimColumn.getDimensionRowValues();

                                        @Override
                                        public IndexedInts getRow() {
                                            return new ArrayBasedIndexedInts(
                                                    dimensionExpansions[dimensionRowValues[cursorOffset
                                                            .getOffset()]]);
                                        }

                                        @Override
                                        public int getValueCardinality() {
                                            return nameLookup.length;
                                        }

                                        @Override
                                        public String lookupName(int id) {
                                            return nameLookup[id];
                                        }

                                        @Override
                                        public int lookupId(String name) {
                                            final Integer retVal = dimValLookup.get(name);

                                            return retVal == null ? -1 : retVal;
                                        }
                                    };
                                }

                                @Override
                                public FloatMetricSelector makeFloatMetricSelector(String metric) {
                                    String metricName = metric.toLowerCase();
                                    IndexedFloats cachedFloats = (IndexedFloats) metricHolderCache.get(metric);
                                    if (cachedFloats == null) {
                                        MetricHolder holder = index.metricVals.get(metricName);
                                        if (holder == null) {
                                            return new FloatMetricSelector() {
                                                @Override
                                                public float get() {
                                                    return 0.0f;
                                                }
                                            };
                                        }

                                        cachedFloats = holder.getFloatType();
                                        metricHolderCache.put(metricName, cachedFloats);
                                    }

                                    final IndexedFloats metricVals = cachedFloats;
                                    return new FloatMetricSelector() {
                                        @Override
                                        public float get() {
                                            return metricVals.get(cursorOffset.getOffset());
                                        }
                                    };
                                }

                                @Override
                                public ComplexMetricSelector makeComplexMetricSelector(String metric) {
                                    final String metricName = metric.toLowerCase();
                                    Indexed cachedComplex = (Indexed) metricHolderCache.get(metricName);
                                    if (cachedComplex == null) {
                                        MetricHolder holder = index.metricVals.get(metricName);
                                        if (holder != null) {
                                            cachedComplex = holder.getComplexType();
                                            metricHolderCache.put(metricName, cachedComplex);
                                        }
                                    }

                                    if (cachedComplex == null) {
                                        return null;
                                    }

                                    final Indexed vals = cachedComplex;
                                    return new ComplexMetricSelector() {
                                        @Override
                                        public Class classOfObject() {
                                            return vals.getClazz();
                                        }

                                        @Override
                                        public Object get() {
                                            return vals.get(cursorOffset.getOffset());
                                        }
                                    };
                                }
                            };
                        }
                    }), new Runnable() {
                        @Override
                        public void run() {
                            for (Object object : metricHolderCache.values()) {
                                if (object instanceof Closeable) {
                                    Closeables.closeQuietly((Closeable) object);
                                }
                            }
                        }
                    });
        }
    };
}

From source file:com.metamx.druid.index.v1.MMappedIndexStorageAdapter.java

License:Open Source License

@Override
public Iterable<Cursor> makeCursors(Filter filter, Interval interval, QueryGranularity gran) {
    Interval actualInterval = interval;
    if (!actualInterval.overlaps(index.dataInterval)) {
        return ImmutableList.of();
    }/*  w w w .j  a v  a  2  s  . com*/

    if (actualInterval.getStart().isBefore(index.dataInterval.getStart())) {
        actualInterval = actualInterval.withStart(index.dataInterval.getStart());
    }
    if (actualInterval.getEnd().isAfter(index.dataInterval.getEnd())) {
        actualInterval = actualInterval.withEnd(index.dataInterval.getEnd());
    }

    final Iterable<Cursor> iterable;
    if (filter == null) {
        iterable = new NoFilterCursorIterable(index, actualInterval, gran);
    } else {
        Offset offset = new ConciseOffset(filter.goConcise(new MMappedBitmapIndexSelector(index)));

        iterable = new CursorIterable(index, actualInterval, gran, offset);
    }

    return FunctionalIterable.create(iterable).keep(Functions.<Cursor>identity());
}

From source file:com.metamx.druid.index.v1.QueryableIndexStorageAdapter.java

License:Open Source License

@Override
public Iterable<Cursor> makeCursors(Filter filter, Interval interval, QueryGranularity gran) {
    Interval actualInterval = interval;
    final Interval dataInterval = getInterval();
    if (!actualInterval.overlaps(dataInterval)) {
        return ImmutableList.of();
    }/*from  w w w . ja v a2 s . c  o m*/

    if (actualInterval.getStart().isBefore(dataInterval.getStart())) {
        actualInterval = actualInterval.withStart(dataInterval.getStart());
    }
    if (actualInterval.getEnd().isAfter(dataInterval.getEnd())) {
        actualInterval = actualInterval.withEnd(dataInterval.getEnd());
    }

    final Iterable<Cursor> iterable;
    if (filter == null) {
        iterable = new NoFilterCursorIterable(index, actualInterval, gran);
    } else {
        Offset offset = new ConciseOffset(filter.goConcise(new MMappedBitmapIndexSelector(index)));

        iterable = new CursorIterable(index, actualInterval, gran, offset);
    }

    return FunctionalIterable.create(iterable).keep(Functions.<Cursor>identity());
}

From source file:com.sheepdog.mashmesh.models.VolunteerProfile.java

License:Apache License

private List<Interval> getAvailableIntervals(DateTime aroundDateTime) {
    List<Interval> intervals = new ArrayList<Interval>();
    Map<Integer, DateTime> adjacentDays = new HashMap<Integer, DateTime>(3);

    // Construct a map from days of the week to DateTimes representing adjacent days.
    for (int i = -1; i <= 1; i++) {
        DateTime dateTime = aroundDateTime.plusDays(i);
        int day = dateTime.getDayOfWeek();
        adjacentDays.put(day, dateTime);
    }//  w  w w.ja  va2s .  c o m

    // Construct Intervals from time periods in adjacent days.
    for (AvailableTimePeriod availableTimePeriod : availableTimePeriods) {
        if (adjacentDays.containsKey(availableTimePeriod.getDay())) {
            LocalDate date = adjacentDays.get(availableTimePeriod.getDay()).toLocalDate();
            DateTime start = date.toDateTime(availableTimePeriod.getStartTime(), aroundDateTime.getZone());
            DateTime end = date.toDateTime(availableTimePeriod.getEndTime(), aroundDateTime.getZone());

            // Allow 00:00 - 00:00 to express 00:00 - 24:00 as we can't serialize a
            //  LocalTime representing 24:00.
            if (end.compareTo(start) <= 0) {
                end = end.plusDays(1);
            }

            intervals.add(new Interval(start, end));
        }
    }

    // Sort the Intervals so that adjacent time periods abut. Assumes that intervals don't overlap.
    Collections.sort(intervals, new Comparator<Interval>() {
        @Override
        public int compare(Interval i1, Interval i2) {
            return new Long(i1.getStartMillis()).compareTo(i2.getStartMillis());
        }
    });

    // Merge abutting intervals together
    List<Interval> mergedIntervals = new ArrayList<Interval>();
    Interval lastInterval = null;

    for (Interval interval : intervals) {
        if (lastInterval != null && lastInterval.abuts(interval)) {
            mergedIntervals.remove(mergedIntervals.size() - 1);
            interval = lastInterval.withEnd(interval.getEnd());
        }

        lastInterval = interval;
        mergedIntervals.add(interval);
    }

    return mergedIntervals;
}

From source file:io.druid.segment.incremental.IncrementalIndexStorageAdapter.java

License:Apache License

@Override
public Sequence<Cursor> makeCursors(final Filter filter, final Interval interval, final QueryGranularity gran) {
    if (index.isEmpty()) {
        return Sequences.empty();
    }//from  w w w  . j a  va  2  s  . com

    Interval actualIntervalTmp = interval;

    final Interval dataInterval = new Interval(getMinTime().getMillis(),
            gran.next(gran.truncate(getMaxTime().getMillis())));

    if (!actualIntervalTmp.overlaps(dataInterval)) {
        return Sequences.empty();
    }

    if (actualIntervalTmp.getStart().isBefore(dataInterval.getStart())) {
        actualIntervalTmp = actualIntervalTmp.withStart(dataInterval.getStart());
    }
    if (actualIntervalTmp.getEnd().isAfter(dataInterval.getEnd())) {
        actualIntervalTmp = actualIntervalTmp.withEnd(dataInterval.getEnd());
    }

    final Interval actualInterval = actualIntervalTmp;

    return Sequences.map(
            Sequences.simple(gran.iterable(actualInterval.getStartMillis(), actualInterval.getEndMillis())),
            new Function<Long, Cursor>() {
                EntryHolder currEntry = new EntryHolder();
                private final ValueMatcher filterMatcher;

                {
                    filterMatcher = makeFilterMatcher(filter, currEntry);
                }

                @Override
                public Cursor apply(@Nullable final Long input) {
                    final long timeStart = Math.max(input, actualInterval.getStartMillis());

                    return new Cursor() {
                        private Iterator<Map.Entry<IncrementalIndex.TimeAndDims, Integer>> baseIter;
                        private ConcurrentNavigableMap<IncrementalIndex.TimeAndDims, Integer> cursorMap;
                        final DateTime time;
                        int numAdvanced = -1;
                        boolean done;

                        {
                            cursorMap = index.getSubMap(
                                    new IncrementalIndex.TimeAndDims(timeStart, new String[][] {}),
                                    new IncrementalIndex.TimeAndDims(
                                            Math.min(actualInterval.getEndMillis(), gran.next(input)),
                                            new String[][] {}));
                            time = gran.toDateTime(input);

                            reset();
                        }

                        @Override
                        public DateTime getTime() {
                            return time;
                        }

                        @Override
                        public void advance() {
                            if (!baseIter.hasNext()) {
                                done = true;
                                return;
                            }

                            while (baseIter.hasNext()) {
                                if (Thread.interrupted()) {
                                    throw new QueryInterruptedException();
                                }

                                currEntry.set(baseIter.next());

                                if (filterMatcher.matches()) {
                                    return;
                                }
                            }

                            if (!filterMatcher.matches()) {
                                done = true;
                            }
                        }

                        @Override
                        public void advanceTo(int offset) {
                            int count = 0;
                            while (count < offset && !isDone()) {
                                advance();
                                count++;
                            }
                        }

                        @Override
                        public boolean isDone() {
                            return done;
                        }

                        @Override
                        public void reset() {
                            baseIter = cursorMap.entrySet().iterator();

                            if (numAdvanced == -1) {
                                numAdvanced = 0;
                            } else {
                                Iterators.advance(baseIter, numAdvanced);
                            }

                            if (Thread.interrupted()) {
                                throw new QueryInterruptedException();
                            }

                            boolean foundMatched = false;
                            while (baseIter.hasNext()) {
                                currEntry.set(baseIter.next());
                                if (filterMatcher.matches()) {
                                    foundMatched = true;
                                    break;
                                }

                                numAdvanced++;
                            }

                            done = !foundMatched && (cursorMap.size() == 0 || !baseIter.hasNext());
                        }

                        @Override
                        public DimensionSelector makeDimensionSelector(final String dimension,
                                @Nullable final ExtractionFn extractionFn) {
                            if (dimension.equals(Column.TIME_COLUMN_NAME)) {
                                return new SingleScanTimeDimSelector(makeLongColumnSelector(dimension),
                                        extractionFn);
                            }

                            final IncrementalIndex.DimDim dimValLookup = index.getDimension(dimension);
                            if (dimValLookup == null) {
                                return NULL_DIMENSION_SELECTOR;
                            }

                            final int maxId = dimValLookup.size();
                            final int dimIndex = index.getDimensionIndex(dimension);

                            return new DimensionSelector() {
                                @Override
                                public IndexedInts getRow() {
                                    final ArrayList<Integer> vals = Lists.newArrayList();
                                    if (dimIndex < currEntry.getKey().getDims().length) {
                                        final String[] dimVals = currEntry.getKey().getDims()[dimIndex];
                                        if (dimVals != null) {
                                            for (String dimVal : dimVals) {
                                                int id = dimValLookup.getId(dimVal);
                                                if (id < maxId) {
                                                    vals.add(id);
                                                }
                                            }
                                        }
                                    }
                                    // check for null entry
                                    if (vals.isEmpty() && dimValLookup.contains(null)) {
                                        int id = dimValLookup.getId(null);
                                        if (id < maxId) {
                                            vals.add(id);
                                        }
                                    }

                                    return new IndexedInts() {
                                        @Override
                                        public int size() {
                                            return vals.size();
                                        }

                                        @Override
                                        public int get(int index) {
                                            return vals.get(index);
                                        }

                                        @Override
                                        public Iterator<Integer> iterator() {
                                            return vals.iterator();
                                        }

                                        @Override
                                        public void fill(int index, int[] toFill) {
                                            throw new UnsupportedOperationException("fill not supported");
                                        }

                                        @Override
                                        public void close() throws IOException {

                                        }
                                    };
                                }

                                @Override
                                public int getValueCardinality() {
                                    return maxId;
                                }

                                @Override
                                public String lookupName(int id) {
                                    final String value = dimValLookup.getValue(id);
                                    return extractionFn == null ? value : extractionFn.apply(value);

                                }

                                @Override
                                public int lookupId(String name) {
                                    if (extractionFn != null) {
                                        throw new UnsupportedOperationException(
                                                "cannot perform lookup when applying an extraction function");
                                    }
                                    return dimValLookup.getId(name);
                                }
                            };
                        }

                        @Override
                        public FloatColumnSelector makeFloatColumnSelector(String columnName) {
                            final Integer metricIndexInt = index.getMetricIndex(columnName);
                            if (metricIndexInt == null) {
                                return new FloatColumnSelector() {
                                    @Override
                                    public float get() {
                                        return 0.0f;
                                    }
                                };
                            }

                            final int metricIndex = metricIndexInt;
                            return new FloatColumnSelector() {
                                @Override
                                public float get() {
                                    return index.getMetricFloatValue(currEntry.getValue(), metricIndex);
                                }
                            };
                        }

                        @Override
                        public LongColumnSelector makeLongColumnSelector(String columnName) {
                            if (columnName.equals(Column.TIME_COLUMN_NAME)) {
                                return new LongColumnSelector() {
                                    @Override
                                    public long get() {
                                        return currEntry.getKey().getTimestamp();
                                    }
                                };
                            }
                            final Integer metricIndexInt = index.getMetricIndex(columnName);
                            if (metricIndexInt == null) {
                                return new LongColumnSelector() {
                                    @Override
                                    public long get() {
                                        return 0L;
                                    }
                                };
                            }

                            final int metricIndex = metricIndexInt;

                            return new LongColumnSelector() {
                                @Override
                                public long get() {
                                    return index.getMetricLongValue(currEntry.getValue(), metricIndex);
                                }
                            };
                        }

                        @Override
                        public ObjectColumnSelector makeObjectColumnSelector(String column) {
                            if (column.equals(Column.TIME_COLUMN_NAME)) {
                                return new ObjectColumnSelector<Long>() {
                                    @Override
                                    public Class classOfObject() {
                                        return Long.TYPE;
                                    }

                                    @Override
                                    public Long get() {
                                        return currEntry.getKey().getTimestamp();
                                    }
                                };
                            }

                            final Integer metricIndexInt = index.getMetricIndex(column);
                            if (metricIndexInt != null) {
                                final int metricIndex = metricIndexInt;

                                final ComplexMetricSerde serde = ComplexMetrics
                                        .getSerdeForType(index.getMetricType(column));
                                return new ObjectColumnSelector() {
                                    @Override
                                    public Class classOfObject() {
                                        return serde.getObjectStrategy().getClazz();
                                    }

                                    @Override
                                    public Object get() {
                                        return index.getMetricObjectValue(currEntry.getValue(), metricIndex);
                                    }
                                };
                            }

                            final Integer dimensionIndexInt = index.getDimensionIndex(column);

                            if (dimensionIndexInt != null) {
                                final int dimensionIndex = dimensionIndexInt;
                                return new ObjectColumnSelector<Object>() {
                                    @Override
                                    public Class classOfObject() {
                                        return Object.class;
                                    }

                                    @Override
                                    public Object get() {
                                        IncrementalIndex.TimeAndDims key = currEntry.getKey();
                                        if (key == null) {
                                            return null;
                                        }

                                        String[][] dims = key.getDims();
                                        if (dimensionIndex >= dims.length) {
                                            return null;
                                        }

                                        final String[] dimVals = dims[dimensionIndex];
                                        if (dimVals == null || dimVals.length == 0) {
                                            return null;
                                        }
                                        if (dimVals.length == 1) {
                                            return dimVals[0];
                                        }
                                        return dimVals;
                                    }
                                };
                            }

                            return null;
                        }
                    };
                }
            });
}

From source file:io.druid.segment.QueryableIndexStorageAdapter.java

License:Apache License

@Override
public Sequence<Cursor> makeCursors(Filter filter, Interval interval, QueryGranularity gran) {
    Interval actualInterval = interval;

    long minDataTimestamp = getMinTime().getMillis();
    long maxDataTimestamp = getMaxTime().getMillis();
    final Interval dataInterval = new Interval(minDataTimestamp, gran.next(gran.truncate(maxDataTimestamp)));

    if (!actualInterval.overlaps(dataInterval)) {
        return Sequences.empty();
    }/* w  w  w. j  ava 2s. com*/

    if (actualInterval.getStart().isBefore(dataInterval.getStart())) {
        actualInterval = actualInterval.withStart(dataInterval.getStart());
    }
    if (actualInterval.getEnd().isAfter(dataInterval.getEnd())) {
        actualInterval = actualInterval.withEnd(dataInterval.getEnd());
    }

    final Offset offset;
    if (filter == null) {
        offset = new NoFilterOffset(0, index.getNumRows());
    } else {
        final ColumnSelectorBitmapIndexSelector selector = new ColumnSelectorBitmapIndexSelector(
                index.getBitmapFactoryForDimensions(), index);

        offset = new BitmapOffset(selector.getBitmapFactory(), filter.getBitmapIndex(selector));
    }

    return Sequences.filter(
            new CursorSequenceBuilder(index, actualInterval, gran, offset, maxDataTimestamp).build(),
            Predicates.<Cursor>notNull());
}

From source file:io.druid.server.ClientInfoResource.java

License:Apache License

@GET
@Path("/{dataSourceName}")
@Produces(MediaType.APPLICATION_JSON)/*from   ww  w  .  j av  a 2s  .  c  o  m*/
public Map<String, Object> getDatasource(@PathParam("dataSourceName") String dataSourceName,
        @QueryParam("interval") String interval, @QueryParam("full") String full) {
    if (full == null) {
        return ImmutableMap.<String, Object>of(KEY_DIMENSIONS,
                getDatasourceDimensions(dataSourceName, interval), KEY_METRICS,
                getDatasourceMetrics(dataSourceName, interval));
    }

    Interval theInterval;
    if (interval == null || interval.isEmpty()) {
        DateTime now = getCurrentTime();
        theInterval = new Interval(segmentMetadataQueryConfig.getDefaultHistory(), now);
    } else {
        theInterval = new Interval(interval);
    }

    TimelineLookup<String, ServerSelector> timeline = timelineServerView
            .getTimeline(new TableDataSource(dataSourceName));
    Iterable<TimelineObjectHolder<String, ServerSelector>> serversLookup = timeline != null
            ? timeline.lookup(theInterval)
            : null;
    if (serversLookup == null || Iterables.isEmpty(serversLookup)) {
        return Collections.EMPTY_MAP;
    }
    Map<Interval, Object> servedIntervals = new TreeMap<>(new Comparator<Interval>() {
        @Override
        public int compare(Interval o1, Interval o2) {
            if (o1.equals(o2) || o1.overlaps(o2)) {
                return 0;
            } else {
                return o1.isBefore(o2) ? -1 : 1;
            }
        }
    });

    for (TimelineObjectHolder<String, ServerSelector> holder : serversLookup) {
        final Set<Object> dimensions = Sets.newHashSet();
        final Set<Object> metrics = Sets.newHashSet();
        final PartitionHolder<ServerSelector> partitionHolder = holder.getObject();
        if (partitionHolder.isComplete()) {
            for (ServerSelector server : partitionHolder.payloads()) {
                final DataSegment segment = server.getSegment();
                dimensions.addAll(segment.getDimensions());
                metrics.addAll(segment.getMetrics());
            }
        }

        servedIntervals.put(holder.getInterval(),
                ImmutableMap.of(KEY_DIMENSIONS, dimensions, KEY_METRICS, metrics));
    }

    //collapse intervals if they abut and have same set of columns
    Map<String, Object> result = Maps.newLinkedHashMap();
    Interval curr = null;
    Map<String, Set<String>> cols = null;
    for (Map.Entry<Interval, Object> e : servedIntervals.entrySet()) {
        Interval ival = e.getKey();
        if (curr != null && curr.abuts(ival) && cols.equals(e.getValue())) {
            curr = curr.withEnd(ival.getEnd());
        } else {
            if (curr != null) {
                result.put(curr.toString(), cols);
            }
            curr = ival;
            cols = (Map<String, Set<String>>) e.getValue();
        }
    }
    //add the last one in
    if (curr != null) {
        result.put(curr.toString(), cols);
    }
    return result;
}

From source file:org.apache.druid.server.ClientInfoResource.java

License:Apache License

@GET
@Path("/{dataSourceName}")
@Produces(MediaType.APPLICATION_JSON)//from   ww  w  .ja  v a2  s .  c om
@ResourceFilters(DatasourceResourceFilter.class)
public Map<String, Object> getDatasource(@PathParam("dataSourceName") String dataSourceName,
        @QueryParam("interval") String interval, @QueryParam("full") String full) {
    if (full == null) {
        return ImmutableMap.of(KEY_DIMENSIONS, getDataSourceDimensions(dataSourceName, interval), KEY_METRICS,
                getDataSourceMetrics(dataSourceName, interval));
    }

    Interval theInterval;
    if (interval == null || interval.isEmpty()) {
        DateTime now = getCurrentTime();
        theInterval = new Interval(segmentMetadataQueryConfig.getDefaultHistory(), now);
    } else {
        theInterval = Intervals.of(interval);
    }

    TimelineLookup<String, ServerSelector> timeline = timelineServerView
            .getTimeline(new TableDataSource(dataSourceName));
    Iterable<TimelineObjectHolder<String, ServerSelector>> serversLookup = timeline != null
            ? timeline.lookup(theInterval)
            : null;
    if (serversLookup == null || Iterables.isEmpty(serversLookup)) {
        return Collections.EMPTY_MAP;
    }
    Map<Interval, Object> servedIntervals = new TreeMap<>(new Comparator<Interval>() {
        @Override
        public int compare(Interval o1, Interval o2) {
            if (o1.equals(o2) || o1.overlaps(o2)) {
                return 0;
            } else {
                return o1.isBefore(o2) ? -1 : 1;
            }
        }
    });

    for (TimelineObjectHolder<String, ServerSelector> holder : serversLookup) {
        final Set<Object> dimensions = new HashSet<>();
        final Set<Object> metrics = new HashSet<>();
        final PartitionHolder<ServerSelector> partitionHolder = holder.getObject();
        if (partitionHolder.isComplete()) {
            for (ServerSelector server : partitionHolder.payloads()) {
                final DataSegment segment = server.getSegment();
                dimensions.addAll(segment.getDimensions());
                metrics.addAll(segment.getMetrics());
            }
        }

        servedIntervals.put(holder.getInterval(),
                ImmutableMap.of(KEY_DIMENSIONS, dimensions, KEY_METRICS, metrics));
    }

    //collapse intervals if they abut and have same set of columns
    Map<String, Object> result = Maps.newLinkedHashMap();
    Interval curr = null;
    Map<String, Set<String>> cols = null;
    for (Map.Entry<Interval, Object> e : servedIntervals.entrySet()) {
        Interval ival = e.getKey();
        if (curr != null && curr.abuts(ival) && cols.equals(e.getValue())) {
            curr = curr.withEnd(ival.getEnd());
        } else {
            if (curr != null) {
                result.put(curr.toString(), cols);
            }
            curr = ival;
            cols = (Map<String, Set<String>>) e.getValue();
        }
    }
    //add the last one in
    if (curr != null) {
        result.put(curr.toString(), cols);
    }
    return result;
}