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 bd79bcc lots of cleanup and reorg. Path now implements TSequence (smart, duplicate keys allowed). Thought through and tweaked all the methods of the core structure API/. TTuple and TSequence are making lots of sense -- basically, map and list respectively. bd79bcc is described below commit bd79bcc4c1d5db3f1bcf3e40e7f1d27892c928e4 Author: Marko A. Rodriguez <okramma...@gmail.com> AuthorDate: Tue Apr 30 04:05:56 2019 -0600 lots of cleanup and reorg. Path now implements TSequence (smart, duplicate keys allowed). Thought through and tweaked all the methods of the core structure API/. TTuple and TSequence are making lots of sense -- basically, map and list respectively. --- .../language/gremlin/AbstractTraversal.java | 2 +- .../tinkerpop/language/gremlin/Traversal.java | 4 +- .../language/gremlin/TraversalSource.java | 6 +-- .../language/gremlin/core/CoreTraversal.java | 4 +- .../tinkerpop/machine/bytecode/Bytecode.java | 11 +++-- .../tinkerpop/machine/bytecode/Instruction.java | 6 +-- .../machine/function/filter/HasKeyFilter.java | 8 +--- .../machine/function/flatmap/DbFlatMap.java | 17 ++++--- .../machine/function/flatmap/EntriesFlatMap.java | 19 ++++---- .../machine/function/reduce/GroupCountReduce.java | 4 +- .../strategy/decoration/ExplainStrategy.java | 1 + .../structure/{util/J2Tuple.java => TPair.java} | 52 ++++++---------------- .../apache/tinkerpop/machine/structure/TTuple.java | 13 +++--- .../tinkerpop/machine/structure/graph/TEdge.java | 6 ++- .../tinkerpop/machine/structure/graph/TVertex.java | 16 +++---- .../{JSequence.java => CompositeSequence.java} | 22 +++++---- .../structure/util/{T2Tuple.java => JPair.java} | 27 +++++++++-- .../machine/structure/util/JSequence.java | 5 +++ .../tinkerpop/machine/structure/util/JTuple.java | 21 ++------- .../machine/traverser/path/BasicPath.java | 28 +++++++----- .../machine/traverser/path/EmptyPath.java | 10 ++--- .../tinkerpop/machine/traverser/path/Path.java | 21 ++++++--- .../tinkerpop/machine/bytecode/BytecodeTest.java | 4 +- .../machine/bytecode/InstructionTest.java | 10 ++--- .../machine/bytecode/compiler/CompilationTest.java | 6 +-- .../blueprints/data/BlueprintsVertex.java | 18 +++----- .../provider/BlueprintsVerticesStrategy.java | 2 +- .../machine/structure/jdbc/JDBCDatabase.java | 17 +++---- .../tinkerpop/machine/structure/jdbc/JDBCRow.java | 27 +++-------- .../jdbc/bytecode/compiler/JDBCCompiler.java | 15 +++---- .../jdbc/function/flatmap/SqlFlatMap.java | 5 +++ .../structure/jdbc/strategy/JDBCQueryStrategy.java | 2 +- .../structure/jdbc/strategy/JDBCStrategy.java | 2 +- 33 files changed, 191 insertions(+), 220 deletions(-) diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/AbstractTraversal.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/AbstractTraversal.java index 51f7e08..793a469 100644 --- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/AbstractTraversal.java +++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/AbstractTraversal.java @@ -54,7 +54,7 @@ public abstract class AbstractTraversal<C, S, E> implements Traversal<C, S, E> { protected final <A, B> Traversal<C, A, B> addInstruction(final String op, final Object... args) { if (this.executed) throw new IllegalStateException("The traversal has already been submitted and can no longer be mutated"); - this.bytecode.addInstruction(this.currentCoefficient, op, args); + this.bytecode.addInstruction(this.currentCoefficient, null, op, args); this.currentCoefficient.unity(); return (Traversal<C, A, B>) this; } diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java index 5015a9e..b974502 100644 --- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java +++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/Traversal.java @@ -21,7 +21,7 @@ package org.apache.tinkerpop.language.gremlin; import org.apache.tinkerpop.machine.bytecode.compiler.Order; import org.apache.tinkerpop.machine.structure.TTuple; import org.apache.tinkerpop.machine.structure.rdbms.TDatabase; -import org.apache.tinkerpop.machine.structure.util.T2Tuple; +import org.apache.tinkerpop.machine.structure.TPair; import org.apache.tinkerpop.machine.traverser.Traverser; import org.apache.tinkerpop.machine.traverser.path.Path; @@ -61,7 +61,7 @@ public interface Traversal<C, S, E> extends Iterator<E> { public Traversal<C, S, E> emit(final Traversal<C, ?, ?> emitTraversal); // TODO: why not <C,E,?> - public <K, V> Traversal<C, S, T2Tuple<K, V>> entries(); + public <K, V> Traversal<C, S, TPair<K, V>> entries(); public Traversal<C, S, String> explain(); 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 1b91203..6fa1d4c 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.INJECT, objects); + bytecode.addInstruction(coefficient, null, Symbols.INJECT, objects); return new CoreTraversal<>(this.machine, bytecode, coefficient); // TODO } @@ -105,7 +105,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.V); + bytecode.addInstruction(coefficient, null, Symbols.V); return new CoreTraversal<>(this.machine, bytecode, coefficient); // TODO } @@ -113,7 +113,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.DB); + bytecode.addInstruction(coefficient, null, Symbols.DB); return new CoreTraversal<>(this.machine, bytecode, coefficient); // TODO } 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 35c01ed..085a542 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 @@ -31,7 +31,7 @@ import org.apache.tinkerpop.machine.coefficient.Coefficient; import org.apache.tinkerpop.machine.coefficient.LongCoefficient; import org.apache.tinkerpop.machine.structure.TTuple; import org.apache.tinkerpop.machine.structure.rdbms.TDatabase; -import org.apache.tinkerpop.machine.structure.util.T2Tuple; +import org.apache.tinkerpop.machine.structure.TPair; import org.apache.tinkerpop.machine.traverser.path.Path; /** @@ -125,7 +125,7 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> { } @Override - public <K, V> Traversal<C, S, T2Tuple<K, V>> entries() { + public <K, V> Traversal<C, S, TPair<K, V>> entries() { return this.addInstruction(Symbols.ENTRIES); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java index 7519652..038a781 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Bytecode.java @@ -59,14 +59,14 @@ public final class Bytecode<C> implements Cloneable, Serializable { /// - public void addInstruction(final Coefficient<C> coefficient, final String op, final Object... args) { + public void addInstruction(final Coefficient<C> coefficient, final String label, final String op, final Object... args) { BytecodeUtil.linkBytecodeChildren(this, args); - this.instructions.add(new Instruction<>(coefficient, op, args)); + this.instructions.add(new Instruction<>(coefficient, label, op, args)); } - public void addInstruction(final int index, final Coefficient<C> coefficient, final String op, final Object... args) { + public void addInstruction(final int index, final Coefficient<C> coefficient, final String label, final String op, final Object... args) { BytecodeUtil.linkBytecodeChildren(this, args); - this.instructions.add(index, new Instruction<>(coefficient, op, args)); + this.instructions.add(index, new Instruction<>(coefficient, label, op, args)); } public List<Instruction<C>> getInstructions() { @@ -114,8 +114,7 @@ public final class Bytecode<C> implements Cloneable, Serializable { clone.addSourceInstruction(sourceInstruction.op(), sourceInstruction.args()); } for (final Instruction<C> instruction : this.instructions) { - clone.addInstruction(instruction.coefficient(), instruction.op(), instruction.args()); - clone.lastInstruction().setLabel(instruction.label()); + clone.addInstruction(instruction.coefficient(), instruction.label(), instruction.op(), instruction.args()); } return clone; } catch (final CloneNotSupportedException e) { diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java index 430479d..184dacf 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/Instruction.java @@ -29,12 +29,13 @@ import java.util.Arrays; */ public final class Instruction<C> implements Serializable { + private String label; private final Coefficient<C> coefficient; private final String op; Object[] args; - private String label = null; - public Instruction(final Coefficient<C> coefficient, final String op, final Object... args) { + public Instruction(final Coefficient<C> coefficient, final String label, final String op, final Object... args) { + this.label = label; this.coefficient = coefficient.clone(); this.op = op; this.args = args; @@ -60,7 +61,6 @@ public final class Instruction<C> implements Serializable { this.label = label; } - @Override public int hashCode() { return this.coefficient.hashCode() ^ this.op.hashCode() ^ Arrays.hashCode(this.args) ^ (null == this.label ? 1 : this.label.hashCode()); diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyFilter.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyFilter.java index d6ef5db..541bb7f 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyFilter.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyFilter.java @@ -25,12 +25,10 @@ import org.apache.tinkerpop.machine.coefficient.Coefficient; import org.apache.tinkerpop.machine.function.AbstractFunction; import org.apache.tinkerpop.machine.function.FilterFunction; import org.apache.tinkerpop.machine.structure.TTuple; -import org.apache.tinkerpop.machine.structure.util.T2Tuple; +import org.apache.tinkerpop.machine.structure.TPair; import org.apache.tinkerpop.machine.traverser.Traverser; import org.apache.tinkerpop.machine.util.StringFactory; -import java.util.Iterator; - /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ @@ -52,9 +50,7 @@ public final class HasKeyFilter<C, K, V> extends AbstractFunction<C> implements return object.has(this.key.mapArg(traverser)); else { final K testKey = this.key.mapArg(traverser); - final Iterator<T2Tuple<K, V>> iterator = traverser.object().entries(); - while (iterator.hasNext()) { - final T2Tuple<K, V> entry = iterator.next(); + for (final TPair<K, V> entry : traverser.object()) { if (this.predicate.test(entry.key(), testKey)) return true; } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java index a071ec7..7218e9f 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java @@ -41,6 +41,10 @@ public final class DbFlatMap<C, S> extends AbstractFunction<C> implements Initia this.database = database; } + @Override + public Iterator<TDatabase> apply(final Traverser<C, S> traverser) { + return IteratorUtils.of(this.database); + } @Override public int hashCode() { @@ -52,17 +56,12 @@ public final class DbFlatMap<C, S> extends AbstractFunction<C> implements Initia return StringFactory.makeFunctionString(this, this.database); } - 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 Iterator<TDatabase> apply(final Traverser<C, S> traverser) { - return IteratorUtils.of(this.database); + public DbFlatMap<C, S> clone() { + return (DbFlatMap<C, S>) super.clone(); } - @Override - public DbFlatMap<C, S> clone() { // TODO - return this; + public static <C, S> DbFlatMap<C, S> compile(final Instruction<C> instruction) { + return new DbFlatMap<>(instruction.coefficient(), instruction.label(), (TDatabase) instruction.args()[0]); // TODO: db() should be a custom instruction, no complex objects in bytecode } } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/EntriesFlatMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/EntriesFlatMap.java index 4143cc5..e7affea 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/EntriesFlatMap.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/EntriesFlatMap.java @@ -22,8 +22,8 @@ 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.FlatMapFunction; +import org.apache.tinkerpop.machine.structure.TPair; import org.apache.tinkerpop.machine.structure.TTuple; -import org.apache.tinkerpop.machine.structure.util.T2Tuple; import org.apache.tinkerpop.machine.traverser.Traverser; import org.apache.tinkerpop.machine.util.StringFactory; @@ -32,21 +32,15 @@ import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public final class EntriesFlatMap<C, K, V> extends AbstractFunction<C> implements FlatMapFunction<C, TTuple<K, V>, T2Tuple<K, V>> { - +public final class EntriesFlatMap<C, K, V> extends AbstractFunction<C> implements FlatMapFunction<C, TTuple<K, V>, TPair<K, V>> { private EntriesFlatMap(final Coefficient<C> coefficient, final String label) { super(coefficient, label); } @Override - public Iterator<T2Tuple<K, V>> apply(final Traverser<C, TTuple<K, V>> traverser) { - return traverser.object().entries(); - } - - @Override - public EntriesFlatMap<C, K, V> clone() { - return (EntriesFlatMap<C, K, V>) super.clone(); + public Iterator<TPair<K, V>> apply(final Traverser<C, TTuple<K, V>> traverser) { + return traverser.object().iterator(); } @Override @@ -59,6 +53,11 @@ public final class EntriesFlatMap<C, K, V> extends AbstractFunction<C> implement return StringFactory.makeFunctionString(this); } + @Override + public EntriesFlatMap<C, K, V> clone() { + return (EntriesFlatMap<C, K, V>) super.clone(); + } + public static <C, K, V> EntriesFlatMap<C, K, V> compile(final Instruction<C> instruction) { return new EntriesFlatMap<>(instruction.coefficient(), instruction.label()); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/GroupCountReduce.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/GroupCountReduce.java index 6549ad2..e39b217 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/GroupCountReduce.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/reduce/GroupCountReduce.java @@ -50,8 +50,8 @@ public final class GroupCountReduce<C, S, E> extends AbstractFunction<C> impleme @Override public TTuple<E, Long> merge(final TTuple<E, Long> valueA, final TTuple<E, Long> valueB) { final JTuple<E, Long> tuple = new JTuple<>(); - valueA.entries().forEachRemaining(entry -> tuple.set(entry.key(), entry.value())); - valueB.entries().forEachRemaining(entry -> tuple.set(entry.key(), entry.value())); + valueA.forEach(entry -> tuple.set(entry.key(), entry.value())); + valueB.forEach(entry -> tuple.set(entry.key(), entry.value())); return new JTuple<>(); } 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 65e02cb..ec2958c 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,6 +50,7 @@ public final class ExplainStrategy extends AbstractStrategy<Strategy.DecorationS bytecode.getInstructions().clear(); bytecode.addInstruction( (Coefficient<C>) LongCoefficient.create(), + null, Symbols.INJECT, ExplainStrategy.explainBytecode(clone)); } 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/TPair.java similarity index 50% rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TPair.java index aeffd07..394ed10 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/TPair.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.structure.util; +package org.apache.tinkerpop.machine.structure; import org.apache.tinkerpop.machine.util.IteratorUtils; @@ -25,63 +25,39 @@ import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public final class J2Tuple<K, V> implements T2Tuple<K, V> { +public interface TPair<K, V> extends TTuple<K, V> { - private K key; - private V value; + public K key(); - public J2Tuple(final K key, final V value) { - this.key = key; - this.value = value; - } - - @Override - public K key() { - return this.key; - } - - @Override - public V value() { - return this.value; - } + public V value(); @Override - public V value(final K key) { - return this.key.equals(key) ? this.value : null; + public default boolean has(final K key) { + return key.equals(this.key()); } @Override - public void set(final K key, final V value) { - throw new IllegalStateException("Can't set key/value for a 2-tuple"); + public default V value(final K key) { + return key.equals(this.key()) ? this.value() : null; // TODO: Exception or Optional? } @Override - public void add(final K key, final V value) { - throw new IllegalStateException("Can't add key/value for a 2-tuple"); + public default void set(final K key, final V value) { + throw new IllegalStateException("TPairs are immutable: " + this); } @Override - public void remove(final K key) { - throw new IllegalStateException("Can't remove key/value for a 2-tuple"); + public default void remove(final K key) { + throw new IllegalStateException("TPairs are immutable: " + this); } @Override - public int size() { + public default int size() { return 1; } @Override - public Iterator<T2Tuple<K, V>> entries() { + public default Iterator<TPair<K, V>> iterator() { return IteratorUtils.of(this); } - - @Override - public boolean has(final K key) { - return this.key.equals(key); - } - - @Override - public String toString() { - return this.key + ":" + this.value; - } } 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 cc4763d..1f40518 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 @@ -18,14 +18,14 @@ */ package org.apache.tinkerpop.machine.structure; -import org.apache.tinkerpop.machine.structure.util.T2Tuple; +import org.apache.tinkerpop.machine.util.IteratorUtils; import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface TTuple<K, V> { +public interface TTuple<K, V> extends Iterable<TPair<K, V>> { public boolean has(final K key); @@ -35,14 +35,15 @@ public interface TTuple<K, V> { return this.has(key) ? this.value(key) : defaultValue; } - public void set(final K key, final V value); + public default <U> Iterator<U> values(final K key) { + final Object object = this.value(key); + return object instanceof TSequence ? ((TSequence<U>) object).iterator() : IteratorUtils.of((U) object); + } - public void add(final K key, final V value); + public void set(final K key, final V value); 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/graph/TEdge.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TEdge.java index c5695e4..b75a462 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TEdge.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TEdge.java @@ -18,6 +18,8 @@ */ package org.apache.tinkerpop.machine.structure.graph; +import org.apache.tinkerpop.machine.structure.TSequence; +import org.apache.tinkerpop.machine.structure.util.JSequence; import org.apache.tinkerpop.machine.util.IteratorUtils; import java.util.Iterator; @@ -31,7 +33,7 @@ public interface TEdge<V> extends TElement<V> { public TVertex<V> outV(); - public default Iterator<TVertex<V>> bothV() { - return IteratorUtils.of(this.inV(), this.outV()); + public default TSequence<TVertex<V>> bothV() { + return new JSequence<>(this.outV(),this.inV()); } } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertex.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertex.java index 360c25d..9f3197b 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertex.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertex.java @@ -18,24 +18,20 @@ */ package org.apache.tinkerpop.machine.structure.graph; -import org.apache.tinkerpop.machine.util.MultiIterator; - -import java.util.Iterator; +import org.apache.tinkerpop.machine.structure.TSequence; +import org.apache.tinkerpop.machine.structure.util.CompositeSequence; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ public interface TVertex<V> extends TElement<V> { - public Iterator<TEdge<V>> inE(); + public TSequence<TEdge<V>> inE(); - public Iterator<TEdge<V>> outE(); + public TSequence<TEdge<V>> outE(); - public default Iterator<TEdge<V>> bothE() { - final MultiIterator<TEdge<V>> iterator = new MultiIterator<>(); - iterator.addIterator(this.inE()); - iterator.addIterator(this.outE()); - return iterator; + public default TSequence<TEdge<V>> bothE() { + return new CompositeSequence<>(this.inE(), this.outE()); } } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JSequence.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/CompositeSequence.java similarity index 71% copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JSequence.java copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/CompositeSequence.java index 6b54a54..c50d4ad 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JSequence.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/CompositeSequence.java @@ -19,30 +19,36 @@ package org.apache.tinkerpop.machine.structure.util; import org.apache.tinkerpop.machine.structure.TSequence; +import org.apache.tinkerpop.machine.util.IteratorUtils; -import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public final class JSequence<V> implements TSequence<V> { +public class CompositeSequence<V> implements TSequence<V> { + + private final List<TSequence<V>> list; + + public CompositeSequence(final TSequence... sequences) { + this.list = Arrays.asList(sequences); + } - private final List<V> list = new ArrayList<>(); @Override - public void add(final V value) { - this.list.add(value); + public void add(V value) { + } @Override - public void remove(final V value) { - this.list.remove(value); + public void remove(V value) { + } @Override public Iterator<V> iterator() { - return this.list.iterator(); + return list.stream().flatMap(s -> IteratorUtils.stream(s.iterator())).iterator(); } } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/T2Tuple.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JPair.java similarity index 65% rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/T2Tuple.java rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JPair.java index f10b8ff..fd07f98 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/T2Tuple.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JPair.java @@ -18,14 +18,33 @@ */ package org.apache.tinkerpop.machine.structure.util; -import org.apache.tinkerpop.machine.structure.TTuple; +import org.apache.tinkerpop.machine.structure.TPair; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface T2Tuple<K, V> extends TTuple<K, V> { +public final class JPair<K, V> implements TPair<K, V> { - public K key(); + private K key; + private V value; - public V value(); + public JPair(final K key, final V value) { + this.key = key; + this.value = value; + } + + @Override + public K key() { + return this.key; + } + + @Override + public V value() { + return this.value; + } + + @Override + public String toString() { + return this.key + ":" + this.value; + } } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JSequence.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JSequence.java index 6b54a54..6b509d4 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JSequence.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JSequence.java @@ -21,6 +21,7 @@ package org.apache.tinkerpop.machine.structure.util; import org.apache.tinkerpop.machine.structure.TSequence; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -31,6 +32,10 @@ public final class JSequence<V> implements TSequence<V> { private final List<V> list = new ArrayList<>(); + public JSequence(final V... values) { + Collections.addAll(this.list, values); + } + @Override public void add(final V value) { this.list.add(value); 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 46f5cf9..59046f0 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 @@ -18,6 +18,7 @@ */ package org.apache.tinkerpop.machine.structure.util; +import org.apache.tinkerpop.machine.structure.TPair; import org.apache.tinkerpop.machine.structure.TSequence; import org.apache.tinkerpop.machine.structure.TTuple; import org.apache.tinkerpop.machine.util.IteratorUtils; @@ -49,22 +50,6 @@ public class JTuple<K, V> implements TTuple<K, V> { } @Override - public void add(final K key, final V value) { - if (this.map.containsKey(key)) { - final Object v = this.map.get(key); - if (v instanceof TSequence) { - ((TSequence) v).add(v); - } else { - final JSequence sequence = new JSequence(); - sequence.add(v); - this.map.put(key, (V) sequence); - } - } else { - this.map.put(key, value); - } - } - - @Override public void remove(final K key) { this.map.remove(key); } @@ -75,8 +60,8 @@ public class JTuple<K, V> implements TTuple<K, V> { } @Override - public Iterator<T2Tuple<K, V>> entries() { - return IteratorUtils.map(this.map.entrySet().iterator(), e -> new J2Tuple<>(e.getKey(), e.getValue())); + public Iterator<TPair<K, V>> iterator() { + return IteratorUtils.map(this.map.entrySet().iterator(), e -> new JPair<>(e.getKey(), e.getValue())); } @Override 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 5b7f078..3ef84c9 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 @@ -18,7 +18,7 @@ */ package org.apache.tinkerpop.machine.traverser.path; -import org.apache.tinkerpop.machine.structure.util.T2Tuple; +import org.apache.tinkerpop.machine.structure.TPair; import java.util.ArrayList; import java.util.Iterator; @@ -41,13 +41,6 @@ public final class BasicPath implements Path { } @Override - public void set(final String key, final Object value) { - final int index = this.labels.indexOf(key); - if (-1 != index) - this.objects.set(index, value); - } - - @Override public void add(final String label, final Object object) { this.labels.add(label); this.objects.add(object); @@ -55,16 +48,27 @@ public final class BasicPath implements Path { @Override public void remove(final String key) { - final int index = this.labels.indexOf(key); - if (-1 != index) { + int index; + while (-1 != (index = this.labels.indexOf(key))) { this.labels.remove(index); this.objects.remove(index); } } @Override - public Iterator<T2Tuple<String, Object>> entries() { - return null; + public void remove(final TPair<String, Object> pair) { + int index; + while (-1 != (index = this.labels.indexOf(pair.key()))) { + if (pair.value().equals(this.objects.get(index))) { + this.labels.remove(index); + this.objects.remove(index); + } + } + } + + @Override + public Iterator<TPair<String, Object>> iterator() { + return null; // TODO } @Override 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 e3039f1..847eebe 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 @@ -18,7 +18,7 @@ */ package org.apache.tinkerpop.machine.traverser.path; -import org.apache.tinkerpop.machine.structure.util.T2Tuple; +import org.apache.tinkerpop.machine.structure.TPair; import java.util.Collections; import java.util.Iterator; @@ -40,22 +40,22 @@ public final class EmptyPath implements Path { } @Override - public void set(final String key, final Object value) { + public void add(final String label, final Object object) { } @Override - public void add(final String label, final Object object) { + public void remove(final String key) { } @Override - public void remove(final String key) { + public void remove(final TPair<String, Object> pair) { } @Override - public Iterator<T2Tuple<String, Object>> entries() { + public Iterator<TPair<String, Object>> iterator() { return Collections.emptyIterator(); } 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 0d06f73..7d07c50 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 @@ -18,32 +18,41 @@ */ package org.apache.tinkerpop.machine.traverser.path; -import org.apache.tinkerpop.machine.structure.TTuple; +import org.apache.tinkerpop.machine.structure.TSequence; +import org.apache.tinkerpop.machine.structure.TPair; 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, TSequence<TPair<String, Object>> { public enum Pop { first, last, all; } - public void add(final String label, final Object object); - public Object object(final int index); public String label(final int index); public Object get(final Pop pop, final String label); + public default Object get(final String label) { + return this.get(Pop.last, label); + } + + public boolean has(final String key); + + public void add(final String label, final Object object); + @Override - public default Object value(final String key) { - return this.get(Pop.last, key); + public default void add(final TPair<String, Object> pair) { + this.add(pair.key(), pair.value()); } + public void remove(final String key); + public int size(); public Path clone(); diff --git a/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/BytecodeTest.java b/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/BytecodeTest.java index 9653d52..69df8d9 100644 --- a/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/BytecodeTest.java +++ b/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/BytecodeTest.java @@ -36,7 +36,7 @@ class BytecodeTest { Bytecode<Long> parent = new Bytecode<>(); assertFalse(parent.getParent().isPresent()); Bytecode<Long> child = new Bytecode<>(); - parent.addInstruction(LongCoefficient.create(), "test", child); + parent.addInstruction(LongCoefficient.create(), null, "test", child); assertTrue(child.getParent().isPresent()); assertEquals(parent, child.getParent().get()); assertFalse(child.getParent().get().getParent().isPresent()); @@ -47,7 +47,7 @@ class BytecodeTest { Bytecode<Long> parent = new Bytecode<>(); assertFalse(parent.getParent().isPresent()); Bytecode<Long> child = new Bytecode<>(); - parent.addInstruction(LongCoefficient.create(), "test", child); + parent.addInstruction(LongCoefficient.create(), null, "test", child); Bytecode<Long> cloneParent = parent.clone(); Bytecode<Long> cloneChild = (Bytecode<Long>) cloneParent.lastInstruction().args()[0]; diff --git a/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/InstructionTest.java b/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/InstructionTest.java index ed2b723..0a184a3 100644 --- a/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/InstructionTest.java +++ b/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/InstructionTest.java @@ -29,11 +29,11 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals; */ class InstructionTest { - private final Instruction<Long> a = new Instruction<>(LongCoefficient.create(10L), "atest", 1, 2, 3); - private final Instruction<Long> b = new Instruction<>(LongCoefficient.create(10L), "atest", 1, 2, 3); - private final Instruction<Long> c = new Instruction<>(LongCoefficient.create(10L), "atest", 1, 2); - private final Instruction<Long> d = new Instruction<>(LongCoefficient.create(10L), "btest", 1, 2, 3); - private final Instruction<Long> e = new Instruction<>(LongCoefficient.create(1L), "btest", 1, 2, 3); + private final Instruction<Long> a = new Instruction<>(LongCoefficient.create(10L), null, "atest", 1, 2, 3); + private final Instruction<Long> b = new Instruction<>(LongCoefficient.create(10L), null, "atest", 1, 2, 3); + private final Instruction<Long> c = new Instruction<>(LongCoefficient.create(10L), null, "atest", 1, 2); + private final Instruction<Long> d = new Instruction<>(LongCoefficient.create(10L), null, "btest", 1, 2, 3); + private final Instruction<Long> e = new Instruction<>(LongCoefficient.create(1L), null, "btest", 1, 2, 3); @Test void testMethods() { diff --git a/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/compiler/CompilationTest.java b/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/compiler/CompilationTest.java index 1970f60..f59e509 100644 --- a/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/compiler/CompilationTest.java +++ b/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/bytecode/compiler/CompilationTest.java @@ -38,9 +38,9 @@ class CompilationTest { void shouldCloneCorrectly() { final Bytecode<Long> bytecode = new Bytecode<>(); final Bytecode<Long> inner = new Bytecode<>(); - inner.addInstruction(LongCoefficient.create(), CoreCompiler.Symbols.VALUE, "name"); - bytecode.addInstruction(LongCoefficient.create(), CoreCompiler.Symbols.HAS_KEY, "eq", inner); - bytecode.addInstruction(LongCoefficient.create(), CoreCompiler.Symbols.COUNT); + inner.addInstruction(LongCoefficient.create(), null, CoreCompiler.Symbols.VALUE, "name"); + bytecode.addInstruction(LongCoefficient.create(), null, CoreCompiler.Symbols.HAS_KEY, "eq", inner); + bytecode.addInstruction(LongCoefficient.create(), null, CoreCompiler.Symbols.COUNT); final Compilation<Long, TTuple, Long> compilationA = Compilation.compile(bytecode); final Compilation<Long, TTuple, Long> compilationB = compilationA.clone(); 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 120533e..911ab10 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 @@ -18,10 +18,11 @@ */ package org.apache.tinkerpop.machine.structure.blueprints.data; -import org.apache.tinkerpop.machine.structure.util.T2Tuple; import org.apache.tinkerpop.machine.structure.TSequence; import org.apache.tinkerpop.machine.structure.graph.TEdge; import org.apache.tinkerpop.machine.structure.graph.TVertex; +import org.apache.tinkerpop.machine.structure.util.JSequence; +import org.apache.tinkerpop.machine.structure.TPair; import java.io.Serializable; import java.util.Collections; @@ -34,13 +35,13 @@ import java.util.UUID; public class BlueprintsVertex<V> implements TVertex<V>, Serializable { @Override - public Iterator<TEdge<V>> inE() { - return Collections.emptyIterator(); + public TSequence<TEdge<V>> inE() { + return new JSequence<>(); } @Override - public Iterator<TEdge<V>> outE() { - return Collections.emptyIterator(); + public TSequence<TEdge<V>> outE() { + return new JSequence<>(); } @Override @@ -59,11 +60,6 @@ public class BlueprintsVertex<V> implements TVertex<V>, Serializable { } @Override - public void add(String key, V value) { - - } - - @Override public void remove(String key) { } @@ -89,7 +85,7 @@ public class BlueprintsVertex<V> implements TVertex<V>, Serializable { } @Override - public Iterator<T2Tuple<String, V>> entries() { + public Iterator<TPair<String, V>> iterator() { return Collections.emptyIterator(); } 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 6b18d77..65980d2 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)); // TODO: as(label) + BytecodeUtil.replaceInstruction(bytecode, temp, new Instruction<>(temp.coefficient(), temp.label(), BlueprintsCompiler.Symbols.BP_V)); } } 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 3e4e93f..03f4c45 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 @@ -20,8 +20,8 @@ package org.apache.tinkerpop.machine.structure.jdbc; 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.structure.util.JPair; +import org.apache.tinkerpop.machine.structure.TPair; import org.apache.tinkerpop.machine.util.IteratorUtils; import java.sql.Connection; @@ -74,11 +74,6 @@ public final class JDBCDatabase implements TDatabase { } @Override - public void add(final String key, final TTable value) { - // TODO - } - - @Override public void remove(final String key) { try { this.connection.createStatement().execute("DROP TABLE " + key); @@ -89,11 +84,11 @@ public final class JDBCDatabase implements TDatabase { @Override public int size() { - return (int) IteratorUtils.count(this.entries()); + return (int) IteratorUtils.count(this); } @Override - public Iterator<T2Tuple<String, TTable>> entries() { + public Iterator<TPair<String, TTable>> iterator() { try { final ResultSet result = this.connection.createStatement().executeQuery("SHOW TABLES"); return new Iterator<>() { @@ -105,11 +100,11 @@ public final class JDBCDatabase implements TDatabase { } @Override - public T2Tuple<String, TTable> next() { + public TPair<String, TTable> next() { try { result.next(); final String tableName = result.getString(1); - final T2Tuple<String, TTable> tuple = new J2Tuple<>(tableName, new JDBCTable(connection, tableName)); + final TPair<String, TTable> tuple = new JPair<>(tableName, new JDBCTable(connection, tableName)); this.done = result.isLast(); return tuple; } catch (final SQLException e) { 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 36d2c96..1b841b8 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 @@ -19,8 +19,8 @@ package org.apache.tinkerpop.machine.structure.jdbc; import org.apache.tinkerpop.machine.structure.rdbms.TRow; -import org.apache.tinkerpop.machine.structure.util.J2Tuple; -import org.apache.tinkerpop.machine.structure.util.T2Tuple; +import org.apache.tinkerpop.machine.structure.util.JPair; +import org.apache.tinkerpop.machine.structure.TPair; import java.sql.ResultSet; import java.sql.SQLException; @@ -74,23 +74,6 @@ final class JDBCRow<V> implements TRow<V> { } @Override - public void add(final String key, final V value) { - try { - this.rows.absolute(this.rowId); - Object v = this.rows.getObject(key); - if (v instanceof List) - ((List) v).add(value); - else { - v = new ArrayList<>(); - ((ArrayList) v).add(value); - } - this.rows.updateObject(key, v); - } catch (final SQLException e) { - throw new RuntimeException(e.getMessage(), e); - } - } - - @Override public void remove(final String key) { try { this.rows.absolute(this.rowId); @@ -111,7 +94,7 @@ final class JDBCRow<V> implements TRow<V> { } @Override - public Iterator<T2Tuple<String, V>> entries() { + public Iterator<TPair<String, V>> iterator() { try { this.rows.absolute(this.rowId); return new Iterator<>() { @@ -128,9 +111,9 @@ final class JDBCRow<V> implements TRow<V> { } @Override - public T2Tuple<String, V> next() { + public TPair<String, V> next() { try { - final J2Tuple<String, V> temp = new J2Tuple<>(rows.getMetaData().getColumnName(column), (V) rows.getObject(column)); + final JPair<String, V> temp = new JPair<>(rows.getMetaData().getColumnName(column), (V) rows.getObject(column)); column++; return temp; } catch (final SQLException e) { diff --git a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/bytecode/compiler/JDBCCompiler.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/bytecode/compiler/JDBCCompiler.java index eb75b44..52506ea 100644 --- a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/bytecode/compiler/JDBCCompiler.java +++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/bytecode/compiler/JDBCCompiler.java @@ -21,12 +21,9 @@ package org.apache.tinkerpop.machine.structure.jdbc.bytecode.compiler; import org.apache.tinkerpop.machine.bytecode.Instruction; 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.jdbc.function.flatmap.SqlFlatMap; -import java.sql.Connection; - /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ @@ -38,17 +35,11 @@ public final class JDBCCompiler implements BytecodeCompiler { // static instance } - public static JDBCCompiler instance() { - return INSTANCE; - } - @Override public <C> CFunction<C> compile(final Instruction<C> instruction) { final String op = instruction.op(); - final Coefficient<C> coefficient = instruction.coefficient(); - final String label = instruction.label(); if (op.equals(Symbols.JDBC_SQL)) - return new SqlFlatMap<>(coefficient, label, (Connection) instruction.args()[0], (String) instruction.args()[1], (String) instruction.args()[2], (String) instruction.args()[3]); + return SqlFlatMap.compile(instruction); else return null; } @@ -58,6 +49,10 @@ public final class JDBCCompiler implements BytecodeCompiler { return op.equals(Symbols.JDBC_SQL) ? FunctionType.FLATMAP : null; } + public static JDBCCompiler instance() { + return INSTANCE; + } + public static class Symbols { private Symbols() { diff --git a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/function/flatmap/SqlFlatMap.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/function/flatmap/SqlFlatMap.java index af5f2b0..4863568 100644 --- a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/function/flatmap/SqlFlatMap.java +++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/function/flatmap/SqlFlatMap.java @@ -18,6 +18,7 @@ */ package org.apache.tinkerpop.machine.structure.jdbc.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.initial.Initializing; @@ -102,4 +103,8 @@ public final class SqlFlatMap<C, S> extends AbstractFunction<C> implements Initi public SqlFlatMap<C, S> clone() { return this; // TODO; } + + public static <C, S> SqlFlatMap<C, S> compile(final Instruction<C> instruction) { + return new SqlFlatMap<>(instruction.coefficient(), instruction.label(), (Connection) instruction.args()[0], (String) instruction.args()[1], (String) instruction.args()[2], (String) instruction.args()[3]); + } } diff --git a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCQueryStrategy.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCQueryStrategy.java index 203bcdb..9ad05c8 100644 --- a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCQueryStrategy.java +++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCQueryStrategy.java @@ -47,7 +47,7 @@ public final class JDBCQueryStrategy extends AbstractStrategy<Strategy.ProviderS final String query = "SELECT " + as1 + ".*, " + as2 + ".* FROM " + table1 + " AS " + as1 + ", " + table2 + " AS " + as2 + " WHERE " + join; final Instruction<C> inst = bytecode.getInstructions().remove(0); // HAS_KEY_VALUE bytecode.getInstructions().remove(0); // PATH - bytecode.addInstruction(0, inst.coefficient(), "jdbc:sql", db.getConnection(), as1, as2, query); + bytecode.addInstruction(0, inst.coefficient(), inst.label(), "jdbc:sql", db.getConnection(), as1, as2, query); } } } diff --git a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCStrategy.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCStrategy.java index 60a3c28..8415412 100644 --- a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCStrategy.java +++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCStrategy.java @@ -26,7 +26,6 @@ import org.apache.tinkerpop.machine.strategy.AbstractStrategy; import org.apache.tinkerpop.machine.strategy.Strategy; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Set; @@ -47,6 +46,7 @@ public final class JDBCStrategy extends AbstractStrategy<Strategy.ProviderStrate BytecodeUtil.replaceInstruction(bytecode, instruction, new Instruction<>( instruction.coefficient(), + instruction.label(), Symbols.DB, BytecodeUtil.getStructureFactory(BytecodeUtil.getRootBytecode(bytecode)).get().mint())); }