List of usage examples for com.google.common.collect Range intersection
public Range<C> intersection(Range<C> connectedRange)
From source file:org.brocalc.domain.RangeConstraintMapUtil.java
public static <T extends Comparable<?>> Map<Range<T>, BrokerageScheduleComponent> createRangeConstrainedMap( final String rangeName) { final Map<Range<T>, BrokerageScheduleComponent> baseMap = Maps.newHashMap(); Map<Range<T>, BrokerageScheduleComponent> constrainedMap = MapConstraints.constrainedMap(baseMap, new MapConstraint<Range<T>, BrokerageScheduleComponent>() { @Override/*from ww w. java 2 s .c o m*/ public void checkKeyValue(Range<T> newKey, BrokerageScheduleComponent brokerageScheduleComponent) { baseMap.keySet(); for (Range<T> existingKey : baseMap.keySet()) { if (existingKey.isConnected(newKey) && !existingKey.intersection(newKey).isEmpty()) { throw new RangeOverlapException( rangeName + " " + newKey + " overlaps with " + existingKey); } } } }); return constrainedMap; }
From source file:com.google.cloud.genomics.dataflow.utils.AnnotationUtils.java
/** * Determines the effect of the given allele at the given position within a * transcript. Currently, this routine is relatively primitive: it only works * with SNPs and only computes effects on coding regions of the transcript. * This utility currently does not handle any splice sites well, including * splice site disruption and codons which span two exons. * * @param variantStart 0-based absolute start for the variant. * @param allele Bases to substitute at {@code variantStart}. * @param transcript The affected transcript. * @param transcriptBases The reference bases which span the provided * {@code transcript}. Must match the exact length of the * {@code transcript.position}./* w ww . j ava 2 s .co m*/ * @return The effect of this variant on the given transcript, or null if * unknown. */ public static VariantEffect determineVariantTranscriptEffect(long variantStart, String allele, Annotation transcript, String transcriptBases) { long txLen = transcript.getEnd() - transcript.getStart(); Preconditions.checkArgument(transcriptBases.length() == txLen, "transcriptBases must have equal length to the transcript; got " + transcriptBases.length() + " and " + txLen + ", respectively"); if (allele.length() != 1) { LOG.fine("determineVariantTranscriptEffects() only supports SNPs, ignoring " + allele); return null; } if (transcript.getTranscript().getCodingSequence() == null) { LOG.fine("determineVariantTranscriptEffects() only supports intersection with coding " + "transcript, ignoring "); return null; } long variantEnd = variantStart + 1; Range<Long> variantRange = Range.closedOpen(variantStart, variantEnd); Range<Long> codingRange = Range.closedOpen(transcript.getTranscript().getCodingSequence().getStart(), transcript.getTranscript().getCodingSequence().getEnd()); if (Boolean.TRUE.equals(transcript.getReverseStrand())) { allele = SequenceUtil.reverseComplement(allele); } for (Exon exon : transcript.getTranscript().getExons()) { // For now, only compute effects on variants within the coding region of an exon. Range<Long> exonRange = Range.closedOpen(exon.getStart(), exon.getEnd()); if (exonRange.isConnected(codingRange) && exonRange.intersection(codingRange).isConnected(variantRange) && !exonRange.intersection(codingRange).intersection(variantRange).isEmpty()) { // Get the bases which correspond to this exon. int txOffset = transcript.getStart().intValue(); String exonBases = transcriptBases.substring(exon.getStart().intValue() - txOffset, exon.getEnd().intValue() - txOffset); int variantExonOffset = (int) (variantStart - exon.getStart()); if (Boolean.TRUE.equals(transcript.getReverseStrand())) { // Normalize the offset and bases to 5' -> 3'. exonBases = SequenceUtil.reverseComplement(exonBases); variantExonOffset = (int) (exon.getEnd() - variantEnd); } // Determine the indices for the codon which contains this variant. if (exon.getFrame() == null) { LOG.fine("exon lacks frame data, cannot determine effect"); return null; } int offsetWithinCodon = (variantExonOffset + exon.getFrame()) % 3; int codonExonOffset = variantExonOffset - offsetWithinCodon; if (codonExonOffset < 0 || exonBases.length() <= codonExonOffset + 3) { LOG.fine("variant codon spans multiple exons, this case is not yet handled"); return null; } String fromCodon = exonBases.substring(codonExonOffset, codonExonOffset + 3); String toCodon = fromCodon.substring(0, offsetWithinCodon) + allele + fromCodon.substring(offsetWithinCodon + 1); return codonChangeToEffect(fromCodon, toCodon); } } return null; }
From source file:org.nmdp.ngs.range.Ranges.java
/** * Return true if the specified ranges intersect. * * @param <C> range endpoint type//from w w w . j a v a 2 s. c o m * @param range0 first range, must not be null * @param range1 second range, must not be null * @return true if the specified ranges intersect */ public static <C extends Comparable> boolean intersect(final Range<C> range0, final Range<C> range1) { checkNotNull(range0); checkNotNull(range1); return range0.isConnected(range1) && !range0.intersection(range1).isEmpty(); }
From source file:org.apache.kylin.storage.cache.TsConditionExtractor.java
private static Range<Long> extractTsConditionInternal(TupleFilter filter, TblColRef colRef) { if (filter == null) { return Range.all(); }/* w w w. j a v a 2 s . co m*/ if (filter instanceof LogicalTupleFilter) { if (filter.getOperator() == TupleFilter.FilterOperatorEnum.AND) { Range<Long> ret = Range.all(); for (TupleFilter child : filter.getChildren()) { Range childRange = extractTsConditionInternal(child, colRef); if (childRange != null) { if (ret.isConnected(childRange) && !ret.intersection(childRange).isEmpty()) { ret = ret.intersection(childRange); } else { return null; } } else { return null; } } return ret.isEmpty() ? null : ret; } else { //for conditions like date > DATE'2000-11-11' OR date < DATE '1999-01-01' //we will use Ranges.all() rather than two ranges to represent them return Range.all(); } } if (filter instanceof CompareTupleFilter) { CompareTupleFilter compareTupleFilter = (CompareTupleFilter) filter; if (compareTupleFilter.getColumn() == null)// column will be null at filters like " 1<>1" return Range.all(); if (compareTupleFilter.getColumn().equals(colRef)) { Object firstValue = compareTupleFilter.getFirstValue(); long t; switch (compareTupleFilter.getOperator()) { case EQ: t = DateFormat.stringToMillis((String) firstValue); return Range.closed(t, t); case LT: t = DateFormat.stringToMillis((String) firstValue); return Range.lessThan(t); case LTE: t = DateFormat.stringToMillis((String) firstValue); return Range.atMost(t); case GT: t = DateFormat.stringToMillis((String) firstValue); return Range.greaterThan(t); case GTE: t = DateFormat.stringToMillis((String) firstValue); return Range.atLeast(t); case NEQ: case IN://not handled for now break; default: } } } return Range.all(); }
From source file:org.cinchapi.concourse.server.model.Ranges.java
/** * Return the ranges that include the points that are in {@code a} or the * {@code b} one and not in their intersection. The return set will include * between 0 and 2 ranges that together include all the points that meet * this criteria./*from www .j av a2 s . c o m*/ * <p> * <strong>NOTE:</strong> If the two ranges do not intersect, then a * collection containing both of them is returned (since they already form * their xor). * </p> * * @param a * @param b * @return the set or ranges that make uValue the symmetric difference * between this range and the {@code other} one */ public static Iterable<Range<Value>> xor(Range<Value> a, Range<Value> b) { List<Range<Value>> ranges = Lists.newArrayList(); try { Range<Value> intersection = a.intersection(b); boolean aStart = compareToLower(a, b) < 0; boolean aEnd = compareToUpper(a, b) > 0; boolean lower = getLowerBoundType(aStart ? a : b) == BoundType.CLOSED; boolean upper = getUpperBoundType(aEnd ? a : b) == BoundType.CLOSED; boolean interLower = getLowerBoundType(intersection) == BoundType.OPEN; boolean interUpper = getUpperBoundType(intersection) == BoundType.OPEN; Range<Value> first; if (lower && interLower) { first = Range.closed(getLowerEndpoint(aStart ? a : b), getLowerEndpoint(intersection)); } else if (!lower && interLower) { first = Range.openClosed(getLowerEndpoint(aStart ? a : b), getLowerEndpoint(intersection)); } else if (lower && !interLower) { first = Range.closedOpen(getLowerEndpoint(aStart ? a : b), getLowerEndpoint(intersection)); } else { first = Range.open(getLowerEndpoint(aStart ? a : b), getLowerEndpoint(intersection)); } Range<Value> second; if (interUpper && upper) { second = Range.closed(getUpperEndpoint(intersection), getUpperEndpoint(aEnd ? a : b)); } else if (!interUpper && upper) { second = Range.openClosed(getUpperEndpoint(intersection), getUpperEndpoint(aEnd ? a : b)); } else if (interUpper && !interUpper) { second = Range.closedOpen(getUpperEndpoint(intersection), getUpperEndpoint(aEnd ? a : b)); } else { second = Range.open(getUpperEndpoint(intersection), getUpperEndpoint(aEnd ? a : b)); } if (!first.isEmpty()) { ranges.add(first); } if (!second.isEmpty()) { ranges.add(second); } } catch (IllegalArgumentException e) { // ranges dont intersect ranges.add(a); ranges.add(b); } return ranges; }
From source file:org.apache.calcite.adapter.druid.DruidDateTimeUtils.java
protected static List<Range<Calendar>> extractRanges(RexNode node, boolean withNot) { switch (node.getKind()) { case EQUALS:/*from w w w . jav a 2s.c o m*/ case LESS_THAN: case LESS_THAN_OR_EQUAL: case GREATER_THAN: case GREATER_THAN_OR_EQUAL: case BETWEEN: case IN: return leafToRanges((RexCall) node, withNot); case NOT: return extractRanges(((RexCall) node).getOperands().get(0), !withNot); case OR: { RexCall call = (RexCall) node; List<Range<Calendar>> intervals = Lists.newArrayList(); for (RexNode child : call.getOperands()) { List<Range<Calendar>> extracted = extractRanges(child, withNot); if (extracted != null) { intervals.addAll(extracted); } } return intervals; } case AND: { RexCall call = (RexCall) node; List<Range<Calendar>> ranges = new ArrayList<>(); for (RexNode child : call.getOperands()) { List<Range<Calendar>> extractedRanges = extractRanges(child, false); if (extractedRanges == null || extractedRanges.isEmpty()) { // We could not extract, we bail out return null; } if (ranges.isEmpty()) { ranges.addAll(extractedRanges); continue; } List<Range<Calendar>> overlapped = new ArrayList<>(); for (Range current : ranges) { for (Range interval : extractedRanges) { if (current.isConnected(interval)) { overlapped.add(current.intersection(interval)); } } } ranges = overlapped; } return ranges; } default: return null; } }
From source file:org.apache.hadoop.hive.ql.optimizer.calcite.druid.DruidIntervalUtils.java
/** * Given a list of predicates, it generates the equivalent Interval * (if possible). It assumes that all the predicates in the input * reference a single column : the timestamp column. * //from w w w. ja v a2 s .com * @param conjs list of conditions to use for the transformation * @return interval representing the conditions in the input list */ public static List<Interval> createInterval(RelDataType type, List<RexNode> conjs) { List<Range> ranges = new ArrayList<>(); for (RexNode child : conjs) { List<Range> extractedRanges = extractRanges(type, child, false); if (extractedRanges == null || extractedRanges.isEmpty()) { // We could not extract, we bail out return null; } if (ranges.isEmpty()) { ranges.addAll(extractedRanges); continue; } List<Range> overlapped = Lists.newArrayList(); for (Range current : ranges) { for (Range interval : extractedRanges) { if (current.isConnected(interval)) { overlapped.add(current.intersection(interval)); } } } ranges = overlapped; } List<Range> compactRanges = condenseRanges(ranges); LOG.debug("Inferred ranges on interval : " + compactRanges); return toInterval(compactRanges); }
From source file:org.apache.kylin.common.util.RangeUtil.java
/** * remove from self the elements that exist in other * @return/*from ww w.j a v a 2s . c o m*/ */ public static <C extends Comparable<?>> List<Range<C>> remove(Range<C> self, Range<C> other) { // mimic the following logic in guava 18: // RangeSet<C> rangeSet = TreeRangeSet.create(); // rangeSet.add(self); // rangeSet.remove(other); // return Lists.newArrayList(rangeSet.asRanges()); if (other == null || !self.isConnected(other)) { return Collections.singletonList(self); } Range<C> share = self.intersection(other); if (share.isEmpty()) { return Collections.singletonList(self); } List<Range<C>> ret = Lists.newArrayList(); //see left part if (!self.hasLowerBound()) { if (share.hasLowerBound()) { if (share.lowerBoundType() == BoundType.CLOSED) { ret.add(Range.lessThan(share.lowerEndpoint())); } else { ret.add(Range.atMost(share.lowerEndpoint())); } } } else { if (self.lowerEndpoint() != share.lowerEndpoint()) { if (self.lowerBoundType() == BoundType.CLOSED) { if (share.lowerBoundType() == BoundType.CLOSED) { ret.add(Range.closedOpen(self.lowerEndpoint(), share.lowerEndpoint())); } else { ret.add(Range.closed(self.lowerEndpoint(), share.lowerEndpoint())); } } else { if (share.lowerBoundType() == BoundType.CLOSED) { ret.add(Range.open(self.lowerEndpoint(), share.lowerEndpoint())); } else { ret.add(Range.openClosed(self.lowerEndpoint(), share.lowerEndpoint())); } } } else { if (self.lowerBoundType() == BoundType.CLOSED && share.lowerBoundType() == BoundType.OPEN) { ret.add(Range.closed(self.lowerEndpoint(), share.lowerEndpoint())); } } } //see right part if (!self.hasUpperBound()) { if (share.hasUpperBound()) { if (share.upperBoundType() == BoundType.CLOSED) { ret.add(Range.greaterThan(share.upperEndpoint())); } else { ret.add(Range.atLeast(share.upperEndpoint())); } } } else { if (self.upperEndpoint() != share.upperEndpoint()) { if (self.upperBoundType() == BoundType.CLOSED) { if (share.upperBoundType() == BoundType.CLOSED) { ret.add(Range.openClosed(share.upperEndpoint(), self.upperEndpoint())); } else { ret.add(Range.closed(share.upperEndpoint(), self.upperEndpoint())); } } else { if (share.upperBoundType() == BoundType.CLOSED) { ret.add(Range.open(share.upperEndpoint(), self.upperEndpoint())); } else { ret.add(Range.closedOpen(share.upperEndpoint(), self.upperEndpoint())); } } } else { if (self.upperBoundType() == BoundType.CLOSED && share.upperBoundType() == BoundType.OPEN) { ret.add(Range.closed(self.upperEndpoint(), share.upperEndpoint())); } } } return ret; }
From source file:google.registry.model.common.PersistedRangeLong.java
public Range<Long> asRange() { Range<Long> range = Range.all(); if (lowerBound != null) { range = range.intersection(Range.downTo(lowerBound, lowerBoundType)); }// ww w .j a v a 2 s. c o m if (upperBound != null) { range = range.intersection(Range.upTo(upperBound, upperBoundType)); } return range; }
From source file:org.sonatype.nexus.repository.partial.RangeParser.java
private List<Range<Long>> ensureSatisfiable(Range<Long> requested, Range content) { if (requested.isConnected(content)) { return singletonList(requested.intersection(content)); } else {/*from w w w . j a va2s . c o m*/ return UNSATISFIABLE; } }