This is an automated email from the ASF dual-hosted git repository. okram pushed a commit to branch tp4 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
The following commit(s) were added to refs/heads/tp4 by this push: new 1494567 There are no more InitialFunctions. If a FlatMapFunction implements Initializing then that means it can generate an output that isn't dependent on input. This way, we can have V() and mid-traversal V() without having two steps. Likewise for db() and inject(). Created PathObjectMap which is for path('x').by()... it will emit a single object, not a Path. Lots of other cleanup and organization. 1494567 is described below commit 1494567d9371d885ac9af7e435efff9621a87ca6 Author: Marko A. Rodriguez <okramma...@gmail.com> AuthorDate: Mon Apr 29 11:04:37 2019 -0600 There are no more InitialFunctions. If a FlatMapFunction implements Initializing then that means it can generate an output that isn't dependent on input. This way, we can have V() and mid-traversal V() without having two steps. Likewise for db() and inject(). Created PathObjectMap which is for path('x').by()... it will emit a single object, not a Path. Lots of other cleanup and organization. --- .../language/gremlin/TraversalSource.java | 2 +- .../tinkerpop/language/gremlin/TraversalUtil.java | 9 ++- .../language/gremlin/core/CoreTraversal.java | 11 +-- .../apache/tinkerpop/language/gremlin/core/__.java | 6 +- .../machine/bytecode/compiler/Argument.java | 3 - .../bytecode/compiler/BytecodeCompiler.java | 6 +- .../machine/bytecode/compiler/CoreCompiler.java | 16 ++-- .../machine/bytecode/compiler/FunctionType.java | 2 +- .../machine/bytecode/compiler/MethodArgument.java | 93 ---------------------- .../DbInitial.java => flatmap/DbFlatMap.java} | 26 +++--- .../InjectFlatMap.java} | 24 ++++-- .../machine/function/initial/FlatMapInitial.java} | 18 ++--- .../initial/Initializing.java} | 9 +-- .../tinkerpop/machine/function/map/PathMap.java | 32 +++++--- .../machine/function/map/PathObjectMap.java | 65 +++++++++++++++ .../strategy/decoration/ExplainStrategy.java | 2 +- .../apache/tinkerpop/machine/structure/TTuple.java | 2 + .../tinkerpop/machine/structure/util/J2Tuple.java | 5 ++ .../tinkerpop/machine/structure/util/JTuple.java | 5 ++ .../machine/traverser/path/BasicPath.java | 6 -- .../machine/traverser/path/EmptyPath.java | 5 -- .../tinkerpop/machine/traverser/path/Path.java | 7 +- .../tinkerpop/machine/processor/pipes/Pipes.java | 6 +- .../bytecode/compiler/BlueprintsCompiler.java | 4 +- .../blueprints/data/BlueprintsVertex.java | 5 ++ .../{initial => flatmap}/VerticesFlatMap.java | 16 ++-- .../provider/BlueprintsVerticesStrategy.java | 2 +- .../machine/structure/jdbc/JDBCDatabase.java | 6 ++ .../tinkerpop/machine/structure/jdbc/JDBCRow.java | 10 +++ .../tinkerpop/machine/structure/jdbc/JDBCTest.java | 2 +- 30 files changed, 209 insertions(+), 196 deletions(-) diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java index bcbf648..1b91203 100644 --- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java +++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java @@ -97,7 +97,7 @@ public class TraversalSource<C> implements Cloneable { this.prepareSourceCode(); final Bytecode<C> bytecode = this.bytecode.clone(); final Coefficient<C> coefficient = this.coefficient.clone(); - bytecode.addInstruction(coefficient, Symbols.INITIAL, objects); + bytecode.addInstruction(coefficient, Symbols.INJECT, objects); return new CoreTraversal<>(this.machine, bytecode, coefficient); // TODO } diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java index 25157fd..3f98959 100644 --- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java +++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java @@ -61,10 +61,11 @@ public final class TraversalUtil { return args; } - public static Object[] addObjects(final Object[] original, final Object... updates) { - final Object[] objects = new Object[original.length + updates.length]; - System.arraycopy(original, 0, objects, 0, original.length); - System.arraycopy(updates, 0, objects, original.length, updates.length); + public static Object[] addObjects(final Object head, final Object[] original, final Object... updates) { + final Object[] objects = new Object[original.length + updates.length + 1]; + objects[0] = head; + System.arraycopy(original, 0, objects, 1, original.length); + System.arraycopy(updates, 0, objects, original.length+1, updates.length); return objects; } } diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java index 86f2329..35c01ed 100644 --- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java +++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java @@ -63,8 +63,7 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> { @Override public Traversal<C, S, E> by(final String byString) { - this.bytecode.addArgs(byString); - return this; + return this.by(__.value(byString)); } @Override @@ -232,16 +231,12 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> { @Override public <R> Traversal<C, S, R> path(final String label) { - this.addInstruction(Symbols.PATH, label, "|"); - return (Traversal) this.addInstruction(Symbols.VALUE, label); + return this.addInstruction(Symbols.PATH, label); } @Override public Traversal<C, S, Path> path(final String label, final String... labels) { - this.addInstruction(Symbols.PATH, label); - this.bytecode.addArgs((Object[]) labels); - this.bytecode.addArgs("|"); - return (Traversal) this; + return this.addInstruction(Symbols.PATH,TraversalUtil.addObjects(label,labels,"|")); } @Override diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java index 77b3a40..e2f973f 100644 --- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java +++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java @@ -87,7 +87,7 @@ public class __ { return __.<C, S>start().path(); } - public static <C, S, R> Traversal<C, S, R> path(final String label) { + public static <C, S, E> Traversal<C, S, E> path(final String label) { return __.<C, S>start().path(label); } @@ -106,4 +106,8 @@ public class __ { public static <C, S, E> Traversal<C, S, E> union(final Traversal<C, S, E>... traversals) { return __.<C, S>start().union(traversals); } + + public static <C, S, E> Traversal<C, S, E> value(final String key) { + return __.<C, S>start().value(key); + } } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java index 85f87c6..3931d58 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java @@ -22,7 +22,6 @@ import org.apache.tinkerpop.machine.bytecode.Bytecode; import org.apache.tinkerpop.machine.traverser.Traverser; import java.io.Serializable; -import java.util.Arrays; import java.util.Iterator; /** @@ -39,8 +38,6 @@ public interface Argument<E> extends Serializable, Cloneable { public static <C, S, E> Argument<E> create(final Object... args) { if (args[0] instanceof Bytecode) return new BytecodeArgument<>((Bytecode<C>) args[0]); - else if (args[0] instanceof String && ((String) args[0]).contains("::")) - return new MethodArgument<>((String) args[0], Arrays.copyOfRange(args, 1, args.length)); else return new ConstantArgument<>((E) args[0]); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java index 50582bf..16cf912 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java @@ -21,6 +21,8 @@ package org.apache.tinkerpop.machine.bytecode.compiler; import org.apache.tinkerpop.machine.bytecode.Bytecode; import org.apache.tinkerpop.machine.bytecode.Instruction; import org.apache.tinkerpop.machine.function.CFunction; +import org.apache.tinkerpop.machine.function.initial.FlatMapInitial; +import org.apache.tinkerpop.machine.function.initial.Initializing; import java.util.ArrayList; import java.util.List; @@ -33,7 +35,9 @@ public interface BytecodeCompiler { public default <C> List<CFunction<C>> compile(final Bytecode<C> bytecode) { final List<CFunction<C>> functions = new ArrayList<>(); for (final Instruction<C> instruction : bytecode.getInstructions()) { - functions.add(this.compile(instruction)); + final CFunction function = this.compile(instruction); + functions.add(functions.isEmpty() && bytecode.getParent().isEmpty() && function instanceof Initializing ? + new FlatMapInitial<>(function.coefficient(), function.label(), (Initializing) function) : function); } return functions; } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java index b77011b..69a23a4 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java @@ -30,12 +30,12 @@ import org.apache.tinkerpop.machine.function.filter.HasKeyFilter; import org.apache.tinkerpop.machine.function.filter.HasKeyValueFilter; import org.apache.tinkerpop.machine.function.filter.IdentityFilter; import org.apache.tinkerpop.machine.function.filter.IsFilter; +import org.apache.tinkerpop.machine.function.flatmap.DbFlatMap; import org.apache.tinkerpop.machine.function.flatmap.EntriesFlatMap; import org.apache.tinkerpop.machine.function.flatmap.FlatMapFlatMap; +import org.apache.tinkerpop.machine.function.flatmap.InjectFlatMap; import org.apache.tinkerpop.machine.function.flatmap.UnfoldFlatMap; import org.apache.tinkerpop.machine.function.flatmap.ValuesFlatMap; -import org.apache.tinkerpop.machine.function.initial.DbInitial; -import org.apache.tinkerpop.machine.function.initial.InitialInitial; import org.apache.tinkerpop.machine.function.map.ConstantMap; import org.apache.tinkerpop.machine.function.map.IncrMap; import org.apache.tinkerpop.machine.function.map.LoopsMap; @@ -78,7 +78,7 @@ public final class CoreCompiler implements BytecodeCompiler { put(Symbols.HAS_KEY_VALUE, FunctionType.FILTER); put(Symbols.IDENTITY, FunctionType.FILTER); put(Symbols.INCR, FunctionType.MAP); - put(Symbols.INITIAL, FunctionType.INITIAL); + put(Symbols.INJECT, FunctionType.FLATMAP); put(Symbols.IS, FunctionType.FILTER); put(Symbols.JOIN, FunctionType.BARRIER); put(Symbols.LOOPS, FunctionType.MAP); @@ -89,12 +89,12 @@ public final class CoreCompiler implements BytecodeCompiler { put(Symbols.REPEAT, FunctionType.BRANCH); put(Symbols.SUM, FunctionType.REDUCE); put(Symbols.UNFOLD, FunctionType.FLATMAP); - put(Symbols.V, FunctionType.FLATMAP); put(Symbols.VALUE, FunctionType.MAP); put(Symbols.VALUES, FunctionType.FLATMAP); // put(Symbols.DB, FunctionType.FLATMAP); + put(Symbols.V, FunctionType.FLATMAP); }}; @Override @@ -124,8 +124,8 @@ public final class CoreCompiler implements BytecodeCompiler { return IdentityFilter.compile(instruction); case Symbols.INCR: return IncrMap.compile(instruction); - case Symbols.INITIAL: - return InitialInitial.compile(instruction); + case Symbols.INJECT: + return InjectFlatMap.compile(instruction); case Symbols.IS: return IsFilter.compile(instruction); case Symbols.JOIN: @@ -151,7 +151,7 @@ public final class CoreCompiler implements BytecodeCompiler { case Symbols.VALUES: return ValuesFlatMap.compile(instruction); case Symbols.DB: - return DbInitial.compile(instruction); + return DbFlatMap.compile(instruction); default: return null; } @@ -205,7 +205,7 @@ public final class CoreCompiler implements BytecodeCompiler { public static final String HAS_KEY_VALUE = "hasKeyValue"; public static final String IDENTITY = "identity"; public static final String INCR = "incr"; - public static final String INITIAL = "initial"; + public static final String INJECT = "initial"; public static final String IS = "is"; public static final String JOIN = "join"; public static final String LOOPS = "loops"; diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java index d3580d6..3ceca4b 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java @@ -23,6 +23,6 @@ package org.apache.tinkerpop.machine.bytecode.compiler; */ public enum FunctionType { - BARRIER, INITIAL, MAP, FLATMAP, FILTER, REDUCE, BRANCH + BARRIER, MAP, FLATMAP, FILTER, REDUCE, BRANCH } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java deleted file mode 100644 index c2aef26..0000000 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.machine.bytecode.compiler; - -import org.apache.tinkerpop.machine.structure.TTuple; -import org.apache.tinkerpop.machine.traverser.Traverser; -import org.apache.tinkerpop.machine.util.IteratorUtils; -import org.apache.tinkerpop.machine.util.NumberHelper; - -import java.util.Arrays; -import java.util.Iterator; -import java.util.Map; - -/** - * @author Marko A. Rodriguez (http://markorodriguez.com) - */ -public class MethodArgument<E> implements Argument<E> { - - private final String method; - private final Argument[] arguments; - - public MethodArgument(final String method, final Object... arguments) { - this.method = method.split("::")[1]; - this.arguments = new Argument[arguments.length]; - for (int i = 0; i < arguments.length; i++) { - this.arguments[i] = Argument.create(arguments[i]); - } - } - - @Override - public <C, S> E mapArg(final Traverser<C, S> traverser) { - if (this.method.equals("object")) - return (E) traverser.object(); - else if (this.method.equals("count")) - return (E) traverser.coefficient().count(); - else if (this.method.equals("keys")) - return (E) ((Map) traverser.object()).keySet(); - else if (this.method.equals("get")) - return (E) ((TTuple) traverser.object()).value(this.arguments[0].mapArg(traverser)); - else if (this.method.equals("add")) - return (E) NumberHelper.add((Number) traverser.object(), (Number) this.arguments[0].mapArg(traverser)); - else - throw new RuntimeException("Unknown method"); - } - - @Override - public <C, S> Iterator<E> flatMapArg(final Traverser<C, S> traverser) { - return IteratorUtils.of(this.mapArg(traverser)); - } - - @Override - public <C, S> boolean filterArg(final Traverser<C, S> traverser) { - return false; - } - - @Override - public int hashCode() { - return this.method.hashCode() ^ Arrays.hashCode(this.arguments); - } - - @Override - public boolean equals(final Object object) { - return object instanceof MethodArgument && - this.method.equals(((MethodArgument) object).method) && - Arrays.equals(this.arguments, ((MethodArgument) object).arguments); - } - - @Override - public MethodArgument<E> clone() { - return this; - } - - @Override - public String toString() { - return this.method + "(" + Arrays.toString(this.arguments) + ")"; - } -} diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java similarity index 70% rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java index 246f072..a071ec7 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java @@ -16,39 +16,33 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.function.initial; +package org.apache.tinkerpop.machine.function.flatmap; import org.apache.tinkerpop.machine.bytecode.Instruction; import org.apache.tinkerpop.machine.coefficient.Coefficient; import org.apache.tinkerpop.machine.function.AbstractFunction; -import org.apache.tinkerpop.machine.function.InitialFunction; -import org.apache.tinkerpop.machine.function.MapFunction; +import org.apache.tinkerpop.machine.function.initial.Initializing; import org.apache.tinkerpop.machine.structure.rdbms.TDatabase; import org.apache.tinkerpop.machine.traverser.Traverser; +import org.apache.tinkerpop.machine.util.IteratorUtils; import org.apache.tinkerpop.machine.util.StringFactory; import java.util.Iterator; -import java.util.List; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public final class DbInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, TDatabase>, MapFunction<C, S, TDatabase> { +public final class DbFlatMap<C, S> extends AbstractFunction<C> implements Initializing<C, S, TDatabase> { private TDatabase database; - private DbInitial(final Coefficient<C> coefficient, final String label, final TDatabase database) { + private DbFlatMap(final Coefficient<C> coefficient, final String label, final TDatabase database) { super(coefficient, label); this.database = database; } @Override - public Iterator<TDatabase> get() { - return List.of(this.database).iterator(); - } - - @Override public int hashCode() { return super.hashCode() ^ this.database.hashCode(); } @@ -58,17 +52,17 @@ public final class DbInitial<C, S> extends AbstractFunction<C> implements Initia return StringFactory.makeFunctionString(this, this.database); } - public static <C, S> DbInitial<C, S> compile(final Instruction<C> instruction) { - return new DbInitial<>(instruction.coefficient(), instruction.label(), (TDatabase) instruction.args()[0]); + public static <C, S> DbFlatMap<C, S> compile(final Instruction<C> instruction) { + return new DbFlatMap<>(instruction.coefficient(), instruction.label(), (TDatabase) instruction.args()[0]); } @Override - public TDatabase apply(final Traverser<C, S> traverser) { - return this.database; + public Iterator<TDatabase> apply(final Traverser<C, S> traverser) { + return IteratorUtils.of(this.database); } @Override - public DbInitial<C, S> clone() { + public DbFlatMap<C, S> clone() { // TODO return this; } } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java similarity index 67% rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java index d043892..1635b2b 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java @@ -16,12 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.function.initial; +package org.apache.tinkerpop.machine.function.flatmap; import org.apache.tinkerpop.machine.bytecode.Instruction; import org.apache.tinkerpop.machine.coefficient.Coefficient; import org.apache.tinkerpop.machine.function.AbstractFunction; -import org.apache.tinkerpop.machine.function.InitialFunction; +import org.apache.tinkerpop.machine.function.initial.Initializing; +import org.apache.tinkerpop.machine.traverser.Traverser; import org.apache.tinkerpop.machine.util.ArrayIterator; import org.apache.tinkerpop.machine.util.StringFactory; @@ -31,17 +32,17 @@ import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public final class InitialInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, S> { +public final class InjectFlatMap<C, S, E> extends AbstractFunction<C> implements Initializing<C, S, E> { - private final S[] objects; + private final E[] objects; - private InitialInitial(final Coefficient<C> coefficient, final String label, final S... objects) { + private InjectFlatMap(final Coefficient<C> coefficient, final String label, final E... objects) { super(coefficient, label); this.objects = objects; } @Override - public Iterator<S> get() { + public Iterator<E> apply(Traverser<C, S> traverser) { return new ArrayIterator<>(this.objects); } @@ -55,7 +56,14 @@ public final class InitialInitial<C, S> extends AbstractFunction<C> implements I return StringFactory.makeFunctionString(this, this.objects); } - public static <C, S> InitialInitial<C, S> compile(final Instruction<C> instruction) { - return new InitialInitial<>(instruction.coefficient(), instruction.label(), (S[]) instruction.args()); + @Override + public InjectFlatMap<C, S, E> clone() { + return this; // TODO + } + + public static <C, S, E> InjectFlatMap<C, S, E> compile(final Instruction<C> instruction) { + return new InjectFlatMap<>(instruction.coefficient(), instruction.label(), (E[]) instruction.args()); } + + } diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java similarity index 66% copy from java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java index 2790291..2a2ca21 100644 --- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java @@ -16,29 +16,29 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.structure.blueprints.function.initial; +package org.apache.tinkerpop.machine.function.initial; -import org.apache.tinkerpop.machine.structure.graph.TVertex; import org.apache.tinkerpop.machine.coefficient.Coefficient; import org.apache.tinkerpop.machine.function.AbstractFunction; import org.apache.tinkerpop.machine.function.InitialFunction; -import org.apache.tinkerpop.machine.structure.blueprints.data.BlueprintsVertex; -import org.apache.tinkerpop.machine.util.IteratorUtils; +import org.apache.tinkerpop.machine.traverser.species.EmptyTraverser; import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class VerticesFlatMap<C> extends AbstractFunction<C> implements InitialFunction<C, TVertex> { +public final class FlatMapInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, S> { - public VerticesFlatMap(final Coefficient<C> coefficient, final String label) { + private final Initializing<C, ?, S> function; + + public FlatMapInitial(final Coefficient<C> coefficient, final String label, final Initializing<C, ?, S> function) { super(coefficient, label); + this.function = function; } @Override - public Iterator<TVertex> get() { - return IteratorUtils.of(new BlueprintsVertex(), new BlueprintsVertex()); + public Iterator<S> get() { + return this.function.apply(EmptyTraverser.instance()); } - } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/Initializing.java similarity index 82% copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/Initializing.java index d3580d6..782e1f3 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/Initializing.java @@ -16,13 +16,12 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.bytecode.compiler; +package org.apache.tinkerpop.machine.function.initial; + +import org.apache.tinkerpop.machine.function.FlatMapFunction; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public enum FunctionType { - - BARRIER, INITIAL, MAP, FLATMAP, FILTER, REDUCE, BRANCH - +public interface Initializing<C, S, E> extends FlatMapFunction<C, S, E> { } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java index 7702568..5aac466 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java @@ -29,6 +29,7 @@ import org.apache.tinkerpop.machine.traverser.path.BasicPath; import org.apache.tinkerpop.machine.traverser.path.Path; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -82,20 +83,25 @@ public final class PathMap<C, S> extends AbstractFunction<C> implements MapFunct return clone; } - public static <C, S> PathMap<C, S> compile(final Instruction<C> instruction) { - final List<String> labels = new ArrayList<>(); - final List<Compilation<C, Object, Object>> compilations = new ArrayList<>(); - boolean processingLabels = true; - for (final Object arg : instruction.args()) { - if (arg.equals("|")) { - processingLabels = false; - continue; + public static <C, S, E> MapFunction<C, S, E> compile(final Instruction<C> instruction) { + if (Arrays.stream(instruction.args()).anyMatch("|"::equals)) { + final List<String> labels = new ArrayList<>(); + final List<Compilation<C, Object, Object>> compilations = new ArrayList<>(); + boolean processingLabels = true; + for (final Object arg : instruction.args()) { + if (arg.equals("|")) { + processingLabels = false; + continue; + } + if (processingLabels) + labels.add((String) arg); + else + compilations.add(Compilation.compile(arg)); } - if (processingLabels) - labels.add((String) arg); - else - compilations.add(Compilation.compile(arg)); + return (MapFunction<C, S, E>) new PathMap<>(instruction.coefficient(), instruction.label(), labels, compilations); + } else { + return PathObjectMap.compile(instruction); } - return new PathMap<>(instruction.coefficient(), instruction.label(), labels, compilations); + } } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathObjectMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathObjectMap.java new file mode 100644 index 0000000..b124ac1 --- /dev/null +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathObjectMap.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tinkerpop.machine.function.map; + +import org.apache.tinkerpop.machine.bytecode.Instruction; +import org.apache.tinkerpop.machine.bytecode.compiler.Compilation; +import org.apache.tinkerpop.machine.coefficient.Coefficient; +import org.apache.tinkerpop.machine.function.AbstractFunction; +import org.apache.tinkerpop.machine.function.MapFunction; +import org.apache.tinkerpop.machine.traverser.Traverser; +import org.apache.tinkerpop.machine.traverser.path.Path; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public final class PathObjectMap<C, S, E> extends AbstractFunction<C> implements MapFunction<C, S, E> { + + private final String pathLabel; + private Compilation<C, Object, Object> byCompilation; + + private PathObjectMap(final Coefficient<C> coefficient, final String label, final String pathLabel, final Compilation<C, Object, Object> byCompilation) { + super(coefficient, label); + this.pathLabel = pathLabel; + this.byCompilation = byCompilation; + } + + @Override + public E apply(final Traverser<C, S> traverser) { + final Object object = traverser.path().get(Path.Pop.last, this.pathLabel); + return (E) (null == this.byCompilation ? object : this.byCompilation.mapObject(object).object()); + } + + + @Override + public int hashCode() { + return super.hashCode() ^ this.pathLabel.hashCode() ^ (null == this.byCompilation ? 1 : this.byCompilation.hashCode()); + } + + @Override + public PathObjectMap<C, S, E> clone() { + final PathObjectMap<C, S, E> clone = (PathObjectMap<C, S, E>) super.clone(); + clone.byCompilation = null == this.byCompilation ? null : this.byCompilation.clone(); + return clone; + } + + public static <C, S, E> PathObjectMap<C, S, E> compile(final Instruction<C> instruction) { + return new PathObjectMap<>(instruction.coefficient(), instruction.label(), (String) instruction.args()[0], Compilation.compileOrNull(1, instruction.args())); + } +} diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java index d60cfff..65e02cb 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java @@ -50,7 +50,7 @@ public final class ExplainStrategy extends AbstractStrategy<Strategy.DecorationS bytecode.getInstructions().clear(); bytecode.addInstruction( (Coefficient<C>) LongCoefficient.create(), - Symbols.INITIAL, + Symbols.INJECT, ExplainStrategy.explainBytecode(clone)); } } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java index c324caf..cc4763d 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java @@ -41,6 +41,8 @@ public interface TTuple<K, V> { public void remove(final K key); + public int size(); + public Iterator<T2Tuple<K, V>> entries(); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java index e94e138..aeffd07 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java @@ -66,6 +66,11 @@ public final class J2Tuple<K, V> implements T2Tuple<K, V> { } @Override + public int size() { + return 1; + } + + @Override public Iterator<T2Tuple<K, V>> entries() { return IteratorUtils.of(this); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java index 7f59f9a..5966aa2 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java @@ -70,6 +70,11 @@ public class JTuple<K, V> implements TTuple<K, V> { } @Override + public int size() { + return this.map.size(); + } + + @Override public Iterator<T2Tuple<K, V>> entries() { return IteratorUtils.map(this.map.entrySet().iterator(), e -> new J2Tuple<>(e.getKey(), e.getValue())); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java index 19c3736..5b7f078 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java @@ -19,7 +19,6 @@ package org.apache.tinkerpop.machine.traverser.path; import org.apache.tinkerpop.machine.structure.util.T2Tuple; -import org.apache.tinkerpop.machine.util.IteratorUtils; import java.util.ArrayList; import java.util.Iterator; @@ -42,11 +41,6 @@ public final class BasicPath implements Path { } @Override - public Object value(final String key) { - return this.get(Pop.last, key); - } - - @Override public void set(final String key, final Object value) { final int index = this.labels.indexOf(key); if (-1 != index) diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java index b3b0a6d..e3039f1 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/EmptyPath.java @@ -40,11 +40,6 @@ public final class EmptyPath implements Path { } @Override - public Object value(final String key) { - throw new IllegalStateException("No objects in EmptyPath"); - } - - @Override public void set(final String key, final Object value) { } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java index cd911b5..0d06f73 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java @@ -25,7 +25,7 @@ import java.io.Serializable; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface Path extends Serializable, Cloneable, TTuple<String,Object> { +public interface Path extends Serializable, Cloneable, TTuple<String, Object> { public enum Pop { first, last, all; @@ -39,6 +39,11 @@ public interface Path extends Serializable, Cloneable, TTuple<String,Object> { public Object get(final Pop pop, final String label); + @Override + public default Object value(final String key) { + return this.get(Pop.last, key); + } + public int size(); public Path clone(); diff --git a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java index f93f644..cc5a4cf 100644 --- a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java +++ b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java @@ -59,9 +59,7 @@ public final class Pipes<C, S, E> implements Processor<C, S, E> { previousStep = this.startStep; } - if (this.steps.isEmpty() && function instanceof InitialFunction) - nextStep = new InitialStep<>((InitialFunction<C, S>) function, compilation.getTraverserFactory()); // TODO: this is a hack for DB - else if (function instanceof RepeatBranch) + if (function instanceof RepeatBranch) nextStep = new RepeatStep<>(previousStep, (RepeatBranch<C, S>) function); else if (function instanceof BranchFunction) nextStep = new BranchStep<>(previousStep, (BranchFunction<C, S, E>) function); @@ -71,6 +69,8 @@ public final class Pipes<C, S, E> implements Processor<C, S, E> { nextStep = new FlatMapStep<>(previousStep, (FlatMapFunction<C, S, E>) function); else if (function instanceof MapFunction) nextStep = new MapStep<>(previousStep, (MapFunction<C, S, E>) function); + else if (function instanceof InitialFunction) + nextStep = new InitialStep<>((InitialFunction<C, S>) function, compilation.getTraverserFactory()); else if (function instanceof BarrierFunction) nextStep = new BarrierStep<>(previousStep, (BarrierFunction<C, S, E, Object>) function, compilation.getTraverserFactory()); else if (function instanceof ReduceFunction) diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java index 06f77c1..eb3dc6c 100644 --- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java +++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java @@ -23,7 +23,7 @@ import org.apache.tinkerpop.machine.bytecode.compiler.BytecodeCompiler; import org.apache.tinkerpop.machine.bytecode.compiler.FunctionType; import org.apache.tinkerpop.machine.coefficient.Coefficient; import org.apache.tinkerpop.machine.function.CFunction; -import org.apache.tinkerpop.machine.structure.blueprints.function.initial.VerticesFlatMap; +import org.apache.tinkerpop.machine.structure.blueprints.function.flatmap.VerticesFlatMap; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -53,7 +53,7 @@ public final class BlueprintsCompiler implements BytecodeCompiler { @Override public FunctionType getFunctionType(final String op) { - return op.equals(Symbols.BP_V) ? FunctionType.INITIAL : null; + return op.equals(Symbols.BP_V) ? FunctionType.FLATMAP : null; } public static class Symbols { diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/data/BlueprintsVertex.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/data/BlueprintsVertex.java index fa08d24..120533e 100644 --- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/data/BlueprintsVertex.java +++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/data/BlueprintsVertex.java @@ -69,6 +69,11 @@ public class BlueprintsVertex<V> implements TVertex<V>, Serializable { } @Override + public int size() { + return 0; + } + + @Override public V value(String key) { return (V) "marko"; } diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/flatmap/VerticesFlatMap.java similarity index 79% rename from java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java rename to java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/flatmap/VerticesFlatMap.java index 2790291..0f9c2e7 100644 --- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java +++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/flatmap/VerticesFlatMap.java @@ -16,13 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.structure.blueprints.function.initial; +package org.apache.tinkerpop.machine.structure.blueprints.function.flatmap; -import org.apache.tinkerpop.machine.structure.graph.TVertex; import org.apache.tinkerpop.machine.coefficient.Coefficient; import org.apache.tinkerpop.machine.function.AbstractFunction; -import org.apache.tinkerpop.machine.function.InitialFunction; +import org.apache.tinkerpop.machine.function.FlatMapFunction; import org.apache.tinkerpop.machine.structure.blueprints.data.BlueprintsVertex; +import org.apache.tinkerpop.machine.structure.graph.TVertex; +import org.apache.tinkerpop.machine.traverser.Traverser; import org.apache.tinkerpop.machine.util.IteratorUtils; import java.util.Iterator; @@ -30,15 +31,20 @@ import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class VerticesFlatMap<C> extends AbstractFunction<C> implements InitialFunction<C, TVertex> { +public class VerticesFlatMap<C, S> extends AbstractFunction<C> implements FlatMapFunction<C, S, TVertex> { public VerticesFlatMap(final Coefficient<C> coefficient, final String label) { super(coefficient, label); } @Override - public Iterator<TVertex> get() { + public Iterator<TVertex> apply(final Traverser<C, S> traverser) { return IteratorUtils.of(new BlueprintsVertex(), new BlueprintsVertex()); } + @Override + public VerticesFlatMap<C, S> clone() { + return this; // TODO; + } + } diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java index 8cbe34f..6b18d77 100644 --- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java +++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java @@ -38,6 +38,6 @@ public class BlueprintsVerticesStrategy extends AbstractStrategy<Strategy.Provid temp = instruction; } if (null != temp) - BytecodeUtil.replaceInstruction(bytecode, temp, new Instruction<>(temp.coefficient(), BlueprintsCompiler.Symbols.BP_V)); + BytecodeUtil.replaceInstruction(bytecode, temp, new Instruction<>(temp.coefficient(), BlueprintsCompiler.Symbols.BP_V)); // TODO: as(label) } } diff --git a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java index ed57e74..b04e894 100644 --- a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java +++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java @@ -22,6 +22,7 @@ import org.apache.tinkerpop.machine.structure.rdbms.TDatabase; import org.apache.tinkerpop.machine.structure.rdbms.TTable; import org.apache.tinkerpop.machine.structure.util.J2Tuple; import org.apache.tinkerpop.machine.structure.util.T2Tuple; +import org.apache.tinkerpop.machine.util.IteratorUtils; import java.sql.Connection; import java.sql.DriverManager; @@ -83,6 +84,11 @@ final class JDBCDatabase implements TDatabase { } @Override + public int size() { + return (int) IteratorUtils.count(this.entries()); + } + + @Override public Iterator<T2Tuple<String, TTable>> entries() { try { final ResultSet result = this.connection.createStatement().executeQuery("SHOW TABLES"); diff --git a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCRow.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCRow.java index 2591553..36d2c96 100644 --- a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCRow.java +++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCRow.java @@ -101,6 +101,16 @@ final class JDBCRow<V> implements TRow<V> { } @Override + public int size() { + try { + this.rows.absolute(this.rowId); + return this.rows.getMetaData().getColumnCount(); + } catch (final SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + @Override public Iterator<T2Tuple<String, V>> entries() { try { this.rows.absolute(this.rowId); diff --git a/java/machine/structure/jdbc/src/test/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTest.java b/java/machine/structure/jdbc/src/test/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTest.java index 242bba7..6429f07 100644 --- a/java/machine/structure/jdbc/src/test/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTest.java +++ b/java/machine/structure/jdbc/src/test/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTest.java @@ -67,6 +67,6 @@ public class JDBCTest { System.out.println(jdbc.db().values("people").toList()); System.out.println(jdbc.db().values("people").value("name").toList()); System.out.println(jdbc.db().values("people").entries().toList()); - System.out.println(jdbc.db().values("people").as("x").db().values("people").has("name", __.path("x").value("name")).as("y").path("x", "y").toList()); + System.out.println(jdbc.db().values("people").as("x").db().values("people").has("name", __.path("x").by("name")).as("y").path("x", "y").toList()); } }