@Test @LoadGraphWith(MODERN) public void g_V_asXaX_out_asXbX_out_asXcX_path_fromXbX_toXcX_byXnameX() { final Traversal<Vertex, Path> traveral = get_g_V_asXaX_out_asXbX_out_asXcX_path_fromXbX_toXcX_byXnameX(); printTraversalForm(traveral); checkResults(Arrays.asList( MutablePath.make().extend("josh", Collections.singleton("b")).extend("lop", Collections.singleton("c")), MutablePath.make().extend("josh", Collections.singleton("b")).extend("ripple", Collections.singleton("c"))), traveral); }
public static Path make() { return new MutablePath(); }
@Override protected Path readValue(final ByteBuf buffer, final GraphBinaryReader context) throws SerializationException { final MutablePath path = (MutablePath) MutablePath.make(); final List<Set<String>> labels = context.read(buffer); final List<Object> objects = context.read(buffer); if (labels.size() != objects.size()) throw new IllegalStateException("Format for Path object requires that the labels and objects fields be of the same length"); for (int ix = 0; ix < labels.size(); ix++) { path.extend(objects.get(ix), labels.get(ix)); } return ReferenceFactory.detach(path); }
@Override public <A> A get(final Pop pop, final String label) { if (Pop.mixed == pop) { return this.get(label); } else if (Pop.all == pop) { if (this.hasLabel(label)) { final Object object = this.get(label); if (object instanceof List) return (A) object; else return (A) Collections.singletonList(object); } else { return (A) Collections.emptyList(); } } else { // Override default to avoid building temporary list, and to stop looking when we find the label. if (Pop.last == pop) { for (int i = this.labels.size() - 1; i >= 0; i--) { if (labels.get(i).contains(label)) return (A) objects.get(i); } } else { for (int i = 0; i != this.labels.size(); i++) { if (labels.get(i).contains(label)) return (A) objects.get(i); } } throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label); } }
@Override public <A> A get(final Pop pop, final String label) { if (Pop.mixed == pop) { return this.get(label); } else if (Pop.all == pop) { if (this.hasLabel(label)) { final Object object = this.get(label); if (object instanceof List) return (A) object; else return (A) Collections.singletonList(object); } else { return (A) Collections.emptyList(); } } else { // Override default to avoid building temporary list, and to stop looking when we find the label. if (Pop.last == pop) { for (int i = this.labels.size() - 1; i >= 0; i--) { if (labels.get(i).contains(label)) return (A) objects.get(i); } } else { for (int i = 0; i != this.labels.size(); i++) { if (labels.get(i).contains(label)) return (A) objects.get(i); } } throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label); } }
@Test @LoadGraphWith(MODERN) public void g_V_asXaX_out_asXbX_out_asXcX_simplePath_byXlabelX_fromXbX_toXcX_path_byXnameX() { final Traversal<Vertex, Path> traversal = get_g_V_asXaX_out_asXbX_out_asXcX_simplePath_byXlabelX_fromXbX_toXcX_path_byXnameX(); printTraversalForm(traversal); checkResults(Arrays.asList( MutablePath.make().extend("marko", Collections.singleton("a")).extend("josh", Collections.singleton("b")).extend("ripple", Collections.singleton("c")), MutablePath.make().extend("marko", Collections.singleton("a")).extend("josh", Collections.singleton("b")).extend("lop", Collections.singleton("c"))), traversal); }
@Override Path readValue(final ByteBuf buffer, final GraphBinaryReader context) throws SerializationException { final MutablePath path = (MutablePath) MutablePath.make(); final List<Set<String>> labels = context.read(buffer); final List<Object> objects = context.read(buffer); if (labels.size() != objects.size()) throw new IllegalStateException("Format for Path object requires that the labels and objects fields be of the same length"); for (int ix = 0; ix < labels.size(); ix++) { path.extend(objects.get(ix), labels.get(ix)); } return ReferenceFactory.detach(path); }
@Override @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException") public MutablePath clone() { final MutablePath clone = new MutablePath(this.objects.size()); // TODO: Why is this not working Hadoop serialization-wise?... Its cause DetachedPath's clone needs to detach on clone. /*final MutablePath clone = (MutablePath) super.clone(); clone.objects = new ArrayList<>(); clone.labels = new ArrayList<>();*/ clone.objects.addAll(this.objects); for (final Set<String> labels : this.labels) { clone.labels.add(new LinkedHashSet<>(labels)); } return clone; }
@Override public Path attach(final Function<Attachable<Path>, Path> method) { final Path path = MutablePath.make(); this.forEach((object, labels) -> path.extend(object instanceof Attachable ? ((Attachable) object).attach(method) : object, labels)); return path; } }
public static Path make() { return new MutablePath(); }
@Override public Path attach(final Function<Attachable<Path>, Path> method) { final Path path = MutablePath.make(); this.forEach((object, labels) -> path.extend(object instanceof Attachable ? ((Attachable) object).attach(method) : object, labels)); return path; } }
@Override @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException") public MutablePath clone() { final MutablePath clone = new MutablePath(this.objects.size()); // TODO: Why is this not working Hadoop serialization-wise?... Its cause DetachedPath's clone needs to detach on clone. /*final MutablePath clone = (MutablePath) super.clone(); clone.objects = new ArrayList<>(); clone.labels = new ArrayList<>();*/ clone.objects.addAll(this.objects); for (final Set<String> labels : this.labels) { clone.labels.add(new LinkedHashSet<>(labels)); } return clone; }
@Override public Path deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { final Path p = MutablePath.make(); List<Object> labels = new ArrayList<>(); List<Object> objects = new ArrayList<>(); while (jsonParser.nextToken() != JsonToken.END_OBJECT) { if (jsonParser.getCurrentName().equals(GraphSONTokens.LABELS)) { jsonParser.nextToken(); labels = deserializationContext.readValue(jsonParser, List.class); } else if (jsonParser.getCurrentName().equals(GraphSONTokens.OBJECTS)) { jsonParser.nextToken(); objects = deserializationContext.readValue(jsonParser, List.class); } } for (int i = 0; i < objects.size(); i++) { p.extend(objects.get(i), (Set<String>) labels.get(i)); } return p; }
return this; else { Path subPath = MutablePath.make(); final int size = this.size(); int fromIndex = -1;
@Override protected Path map(final Traverser.Admin<S> traverser) { final Path path = traverser.path().subPath(this.fromLabel, this.toLabel); if (this.traversalRing.isEmpty()) return path; else { this.traversalRing.reset(); final Path byPath = MutablePath.make(); path.forEach((object, labels) -> byPath.extend(TraversalUtil.applyNullable(object, this.traversalRing.next()), labels)); return byPath; } }
@Override protected boolean filter(final Traverser.Admin<S> traverser) { final Path path = traverser.path().subPath(this.fromLabel, this.toLabel); if (this.traversalRing.isEmpty()) return path.isSimple() == this.isSimple; else { this.traversalRing.reset(); final Path byPath = MutablePath.make(); path.forEach((object, labels) -> byPath.extend(TraversalUtil.applyNullable(object, this.traversalRing.next()), labels)); return byPath.isSimple() == this.isSimple; } }
@Override public Path deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { final JsonNode n = jsonParser.readValueAsTree(); final Path p = MutablePath.make(); final ArrayNode labels = (ArrayNode) n.get(GraphSONTokens.LABELS); final ArrayNode objects = (ArrayNode) n.get(GraphSONTokens.OBJECTS); for (int i = 0; i < objects.size(); i++) { final JsonParser po = objects.get(i).traverse(); po.nextToken(); final JsonParser pl = labels.get(i).traverse(); pl.nextToken(); p.extend(deserializationContext.readValue(po, Object.class), deserializationContext.readValue(pl, setType)); } return p; }
@Test @LoadGraphWith(MODERN) public void g_V_asXaX_out_asXbX_out_asXcX_simplePath_byXlabelX_fromXbX_toXcX_path_byXnameX() { final Traversal<Vertex, Path> traversal = get_g_V_asXaX_out_asXbX_out_asXcX_simplePath_byXlabelX_fromXbX_toXcX_path_byXnameX(); printTraversalForm(traversal); checkResults(Arrays.asList( MutablePath.make().extend("marko", Collections.singleton("a")).extend("josh", Collections.singleton("b")).extend("ripple", Collections.singleton("c")), MutablePath.make().extend("marko", Collections.singleton("a")).extend("josh", Collections.singleton("b")).extend("lop", Collections.singleton("c"))), traversal); }
@Test @LoadGraphWith(MODERN) public void g_V_asXaX_out_asXbX_out_asXcX_path_fromXbX_toXcX_byXnameX() { final Traversal<Vertex, Path> traveral = get_g_V_asXaX_out_asXbX_out_asXcX_path_fromXbX_toXcX_byXnameX(); printTraversalForm(traveral); checkResults(Arrays.asList( MutablePath.make().extend("josh", Collections.singleton("b")).extend("lop", Collections.singleton("c")), MutablePath.make().extend("josh", Collections.singleton("b")).extend("ripple", Collections.singleton("c"))), traveral); }
@Override public Path attach(final Function<Attachable<Path>, Path> method) { final Path path = MutablePath.make(); this.forEach((object, labels) -> path.extend(object instanceof Attachable ? ((Attachable) object).attach(method) : object, labels)); return path; } }