@Override public Comparator<ENTITY> thenComparingDouble( ToDoubleFunction<? super ENTITY> keyExtractor) { return asCombined().thenComparingDouble(keyExtractor); }
@Override public void recordEnd(final Traverser.Admin<Object> traverser, final Traversal.Admin<Object, Object> traversal) { this.getBundle(traversal).incrementEndCount(); if (!this.onComputer) { // if on computer, sort on a per traverser-basis with bias towards local star graph if (this.counter < 200 || this.counter % 250 == 0) // aggressively sort for the first 200 results -- after that, sort every 250 Collections.sort(this.bundles, Comparator.<Bundle>comparingInt(b -> b.traversalType.ordinal()).thenComparingDouble(b -> b.multiplicity)); this.counter++; } }
@Override public Traversal.Admin<Object, Object> apply(final Traverser.Admin<Object> traverser) { // optimization to favor processing StarGraph local objects first to limit message passing (GraphComputer only) // TODO: generalize this for future MatchAlgorithms (given that 3.2.0 will focus on RealTimeStrategy, it will probably go there) if (this.onComputer) { final List<Set<String>> labels = traverser.path().labels(); final Set<String> lastLabels = labels.get(labels.size() - 1); Collections.sort(this.bundles, Comparator.<Bundle>comparingLong(b -> Helper.getStartLabels(b.traversal).stream().filter(startLabel -> !lastLabels.contains(startLabel)).count()). thenComparingInt(b -> b.traversalType.ordinal()). thenComparingDouble(b -> b.multiplicity)); } Bundle startLabelsBundle = null; for (final Bundle bundle : this.bundles) { if (!Helper.hasExecutedTraversal(traverser, bundle.traversal) && Helper.hasStartLabels(traverser, bundle.traversal)) { if (bundle.traversalType != TraversalType.MATCH_TRAVERSAL || Helper.hasEndLabel(traverser, bundle.traversal)) return bundle.traversal; else if (null == startLabelsBundle) startLabelsBundle = bundle; } } if (null != startLabelsBundle) return startLabelsBundle.traversal; throw UNMATCHABLE_PATTERN.apply(this.bundles.stream().map(record -> record.traversal).collect(Collectors.toList())); }
@Override public Comparator<ENTITY> thenComparingDouble( ToDoubleFunction<? super ENTITY> keyExtractor) { return asCombined().thenComparingDouble(keyExtractor); }
@Override public void recordEnd(final Traverser.Admin<Object> traverser, final Traversal.Admin<Object, Object> traversal) { this.getBundle(traversal).incrementEndCount(); if (!this.onComputer) { // if on computer, sort on a per traverser-basis with bias towards local star graph if (this.counter < 200 || this.counter % 250 == 0) // aggressively sort for the first 200 results -- after that, sort every 250 Collections.sort(this.bundles, Comparator.<Bundle>comparingInt(b -> b.traversalType.ordinal()).thenComparingDouble(b -> b.multiplicity)); this.counter++; } }
@Override public Traversal.Admin<Object, Object> apply(final Traverser.Admin<Object> traverser) { // optimization to favor processing StarGraph local objects first to limit message passing (GraphComputer only) // TODO: generalize this for future MatchAlgorithms (given that 3.2.0 will focus on RealTimeStrategy, it will probably go there) if (this.onComputer) { final List<Set<String>> labels = traverser.path().labels(); final Set<String> lastLabels = labels.get(labels.size() - 1); Collections.sort(this.bundles, Comparator.<Bundle>comparingLong(b -> Helper.getStartLabels(b.traversal).stream().filter(startLabel -> !lastLabels.contains(startLabel)).count()). thenComparingInt(b -> b.traversalType.ordinal()). thenComparingDouble(b -> b.multiplicity)); } Bundle startLabelsBundle = null; for (final Bundle bundle : this.bundles) { if (!Helper.hasExecutedTraversal(traverser, bundle.traversal) && Helper.hasStartLabels(traverser, bundle.traversal)) { if (bundle.traversalType != TraversalType.MATCH_TRAVERSAL || Helper.hasEndLabel(traverser, bundle.traversal)) return bundle.traversal; else if (null == startLabelsBundle) startLabelsBundle = bundle; } } if (null != startLabelsBundle) return startLabelsBundle.traversal; throw UNMATCHABLE_PATTERN.apply(this.bundles.stream().map(record -> record.traversal).collect(Collectors.toList())); }