/** * Get a particular value from the side-effects of the traverser (thus, traversal). * * @param sideEffectKey the key of the value to get from the sideEffects * @param <A> the type of the returned object * @return the object in the sideEffects of the respective key */ public default <A> A sideEffects(final String sideEffectKey) throws IllegalArgumentException { return this.asAdmin().getSideEffects().<A>get(sideEffectKey); }
/** * Add a particular value to the respective side-effect of the traverser (thus, traversal). * * @param sideEffectKey the key of the value to set int the sideEffects * @param sideEffectValue the value to set for the sideEffect key */ public default void sideEffects(final String sideEffectKey, final Object sideEffectValue) throws IllegalArgumentException { this.asAdmin().getSideEffects().add(sideEffectKey, sideEffectValue); }
@Test @LoadGraphWith public void shouldNeverPropagateANoBulkTraverser() { try { assertFalse(g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).hasNext()); assertEquals(0, g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).toList().size()); g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).sideEffect(t -> fail("this should not have happened")).iterate(); } catch (VerificationException e) { // its okay if lambdas can't be serialized by the test suite } }
@Override protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) { final Traverser.Admin<S> innerTraverser = traverser.clone().asAdmin(); innerTraverser.setBulk(1L); for (final Traversal.Admin<S, E> coalesceTraversal : this.coalesceTraversals) { coalesceTraversal.reset(); coalesceTraversal.addStart(innerTraverser.split()); if (coalesceTraversal.hasNext()) return coalesceTraversal; } return EmptyIterator.instance(); }
/** * Get a particular value from the side-effects of the traverser (thus, traversal). * * @param sideEffectKey the key of the value to get from the sideEffects * @param <A> the type of the returned object * @return the object in the sideEffects of the respective key */ public default <A> A sideEffects(final String sideEffectKey) throws IllegalArgumentException { return this.asAdmin().getSideEffects().<A>get(sideEffectKey); }
/** * Add a particular value to the respective side-effect of the traverser (thus, traversal). * * @param sideEffectKey the key of the value to set int the sideEffects * @param sideEffectValue the value to set for the sideEffect key */ public default void sideEffects(final String sideEffectKey, final Object sideEffectValue) throws IllegalArgumentException { this.asAdmin().getSideEffects().add(sideEffectKey, sideEffectValue); }
private Stream<Traverser.Admin<E>> toTraversers(Edge edge, Map<Object, List<Traverser<Vertex>>> traversers) { return ConversionUtils.asStream(edge.vertices(direction)) .<Traverser.Admin<E>>flatMap(originalVertex -> { List<Traverser<Vertex>> vertexTraversers = traversers.get(originalVertex.id()); if (vertexTraversers == null) return null; return vertexTraversers.stream().map(vertexTraverser -> { E result = getReturnElement(edge, originalVertex); return vertexTraverser.asAdmin().split(result, this); }); }).filter(result -> result != null); }
@Override protected Iterator<Traverser.Admin<E>> process(List<Traverser.Admin<S>> traversers) { List<Traverser.Admin<E>> coalesce = new ArrayList<>(); List<Traverser.Admin<S>> traversersList = Lists.newArrayList(traversers); traversersList.forEach(t -> { t.setSideEffects(new DefaultTraversalSideEffects() {{ register(t.toString(), () -> t, BinaryOperator.maxBy((o1, o2) -> 1)); set(t.toString(), t); }}); }); coalesceTraversals.forEach(t -> { traversersList.forEach(t::addStart); while (t.hasNext()) { Traverser<E> item = (Traverser<E>) t.next(); ((B_O_S_SE_SL_Traverser) item).getSideEffects().forEach((key, value) -> { if (value != null && value instanceof Traverser) traversersList.remove(value); }); coalesce.add((item.asAdmin())); } }); return coalesce.iterator(); }
@Test @LoadGraphWith public void shouldNeverPropagateANoBulkTraverser() { try { assertFalse(g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).hasNext()); assertEquals(0, g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).toList().size()); g.V().dedup().sideEffect(t -> t.asAdmin().setBulk(0)).sideEffect(t -> fail("this should not have happened")).iterate(); } catch (VerificationException e) { // its okay if lambdas can't be serialized by the test suite } }
@Override public Result next() { if (lastTraverser.bulk() == 0) { lastTraverser = (Traverser) iterator.next().getObject(); } Result result = new Result(lastTraverser.get()); if (lastTraverser.bulk() > 1) { lastTraverser.asAdmin().setBulk(lastTraverser.bulk() - 1); } else { lastTraverser = EmptyTraverser.instance(); } return result; } }
@Override protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) { final Traverser.Admin<S> innerTraverser = traverser.clone().asAdmin(); innerTraverser.setBulk(1L); for (final Traversal.Admin<S, E> coalesceTraversal : this.coalesceTraversals) { coalesceTraversal.reset(); coalesceTraversal.addStart(innerTraverser.split()); if (coalesceTraversal.hasNext()) return coalesceTraversal; } return EmptyIterator.instance(); }