List of usage examples for com.google.common.collect Range isConnected
public boolean isConnected(Range<C> other)
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 w w w . ja v a 2 s . co 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:org.pshdl.model.simulation.RangeTool.java
private static void validate(Set<Range<BigInteger>> split) { System.out.println("Result:" + split); Range<BigInteger> last = Range.closed(BigInteger.valueOf(-1), BigInteger.valueOf(-1)); for (final Range<BigInteger> range : split) { if (range.isConnected(last)) throw new IllegalArgumentException("Ranges are connected:" + last + " and " + range); last = range;/*from w w w. j a v a 2 s. co m*/ } }
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}./*from w ww.j av a 2s . c om*/ * @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//w w w . j a v a2 s.co 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.cinchapi.concourse.server.model.Ranges.java
/** * Return a new {@link Range} that is the merger (e.g. union) of {@code a} * and {@code b}. The new {@link Range} maintains both the lower and higher * endpoint/bound between the two inputs. * // www . j a va 2 s .c om * @param a * @param b * @return the union of {@code a} and {@code b} */ public static Range<Value> merge(Range<Value> a, Range<Value> b) { if (a.isConnected(b)) { boolean aStart = compareToLower(a, b) < 0; boolean aEnd = compareToUpper(a, b) > 0; boolean lower = getLowerBoundType(aStart ? a : b) == BoundType.CLOSED; boolean upper = getUpperBoundType(aStart ? a : b) == BoundType.CLOSED; if (lower && upper) { return Range.closed(getLowerEndpoint(aStart ? a : b), getUpperEndpoint(aEnd ? a : b)); } else if (!lower && upper) { return Range.closedOpen(getLowerEndpoint(aStart ? a : b), getUpperEndpoint(aEnd ? a : b)); } else if (lower && !upper) { return Range.openClosed(getLowerEndpoint(aStart ? a : b), getUpperEndpoint(aEnd ? a : b)); } else { return Range.open(getLowerEndpoint(aStart ? a : b), getUpperEndpoint(aEnd ? a : b)); } } else { return null; } }
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(); }//from www .j a v a 2 s . c om 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.apache.calcite.adapter.druid.DruidDateTimeUtils.java
protected static List<Range<Calendar>> extractRanges(RexNode node, boolean withNot) { switch (node.getKind()) { case EQUALS:/* www.j av a 2 s . co 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:net.bican.iplib.IPAddresses.java
private static Set<Range<IPAddress>> findOneConnected(final Set<Range<IPAddress>> intervals) { Range<IPAddress> f1 = null;//from w w w .ja v a2 s.com Range<IPAddress> f2 = null; for (final Range<IPAddress> s : intervals) { for (final Range<IPAddress> s2 : intervals) { final Range<IPAddress> sc = IPAddresses.canonical(s, s.lowerEndpoint().getDomain()); final Range<IPAddress> sc2 = IPAddresses.canonical(s, s2.lowerEndpoint().getDomain()); if ((sc.equals(sc2)) || (s.isConnected(s2))) { f1 = s; f2 = s2; break; } } if (f1 != null) { break; } } if (f1 != null) { final Set<Range<IPAddress>> newIntervals = new TreeSet<>(IPAddressRangeComparator.getComparator()); newIntervals.addAll(intervals); final Range<IPAddress> f = f1.span(f2); newIntervals.remove(f1); newIntervals.remove(f2); newIntervals.add(f); return newIntervals; } return intervals; }
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. * // w ww . ja v a2s . c o m * @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 w ww . j ava2 s.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; }