### Question:
JoinStep extends AbstractStep<S, E> implements TraversalParent, ByModulating { public void setIntegrateIdsTraversalFunction(BiFunction<Traversal.Admin<S, E>, Set<Object>, Traversal.Admin<S, E>> integrateIdsTraversalFunction) { this.integrateIdsTraversalFunction = integrateIdsTraversalFunction; } JoinStep(Traversal.Admin traversal); @Override void reset(); @Override List<Traversal.Admin<S, E>> getLocalChildren(); @Override void addLocalChild(final Traversal.Admin<?, ?> localChildTraversal); @Override void modulateBy(final Traversal.Admin<?, ?> traversal); Traversal.Admin<S, E> getLeftTraversal(); Traversal.Admin<S, E> getRightTraversal(); void setIntegrateIdsTraversalFunction(BiFunction<Traversal.Admin<S, E>, Set<Object>, Traversal.Admin<S, E>> integrateIdsTraversalFunction);  }### Answer:
@Test public void testMultipleLeftComplexMultipleRightComplexWithIdIntegration() { GraphTraversal<Object, Object> traversal = __.start(); JoinStep<Object, Vertex> joinStep = new JoinStep<>(__.start().asAdmin()); joinStep.setIntegrateIdsTraversalFunction((leftTraversal, ids) -> leftTraversal.addStep(new HasStep<>(leftTraversal, new HasContainer(T.id.getAccessor(), P.within(ids))))); traversal.asAdmin().addStep(joinStep); traversal.by(__.start().inject(1, 3).as("A") .map(traverser -> Integer.toString((int)traverser.get())).as("B") .map(traverser -> new UniVertex(new MapBuilder<String, Object>().put(T.id.getAccessor(), traverser.get()).get(), null)).as("C")); traversal.by(__.start().inject(1, 2, 3).as("D") .map(traverser -> Integer.toString((int)traverser.get())).as("E") .map(traverser -> new UniVertex(new MapBuilder<String, Object>().put(T.id.getAccessor(), traverser.get()).get(), null)).as("F")); List<Traverser<Object>> traversers = new ArrayList<>(); while(traversal.asAdmin().hasNext()) { traversers.add(traversal.asAdmin().nextTraverser()); } Assert.assertEquals("1", ((Vertex)traversers.get(0).get()).id()); Assert.assertEquals("3", ((Vertex)traversers.get(1).get()).id()); Assert.assertEquals(6, traversers.get(0).path().size()); Assert.assertEquals("1", ((Vertex)traversers.get(0).path().head()).id()); Assert.assertEquals(1, (int)traversers.get(0).path().get("A")); Assert.assertEquals("1", traversers.get(0).path().get("B")); Assert.assertEquals("1", ((Vertex)traversers.get(0).path().get("C")).id()); Assert.assertEquals(1, (int)traversers.get(0).path().get("D")); Assert.assertEquals("1", traversers.get(0).path().get("E")); Assert.assertEquals(6, traversers.get(1).path().size()); Assert.assertEquals("3", ((Vertex)traversers.get(1).path().head()).id()); Assert.assertEquals(3, (int)traversers.get(1).path().get("A")); Assert.assertEquals("3", traversers.get(1).path().get("B")); Assert.assertEquals("3", ((Vertex)traversers.get(1).path().get("C")).id()); Assert.assertEquals(3, (int)traversers.get(1).path().get("D")); Assert.assertEquals("3", traversers.get(1).path().get("E")); }