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 706ad64 Generalized path() to work with no, one, or many labels. Have INNER JOIN working with jdbc/. Path now implements TTuple and is thus, subject to has(), value(), entries(), etc. 706ad64 is described below commit 706ad64b78ba1144276294805f325d7cd44ea024 Author: Marko A. Rodriguez <okramma...@gmail.com> AuthorDate: Mon Apr 29 09:14:50 2019 -0600 Generalized path() to work with no, one, or many labels. Have INNER JOIN working with jdbc/. Path now implements TTuple and is thus, subject to has(), value(), entries(), etc. --- .../tinkerpop/language/gremlin/Traversal.java | 12 ++++- .../language/gremlin/TraversalSource.java | 2 +- .../language/gremlin/core/CoreTraversal.java | 30 ++++++++++- .../apache/tinkerpop/language/gremlin/core/__.java | 13 +++++ .../tinkerpop/machine/bytecode/Bytecode.java | 1 + .../machine/bytecode/compiler/CoreCompiler.java | 5 ++ .../machine/function/filter/HasKeyFilter.java | 8 ++- .../DbInitial.java => flatmap/EntriesFlatMap.java} | 33 ++++++------ .../machine/function/initial/DbInitial.java | 18 +++++-- .../machine/function/reduce/GroupCountReduce.java | 4 +- .../tinkerpop/machine/structure/TSequence.java | 4 ++ .../apache/tinkerpop/machine/structure/TTuple.java | 8 ++- .../structure/graph/{LabelSymbol.java => G.java} | 9 +++- .../machine/structure/graph/IdSymbol.java | 27 +++++++++- .../machine/structure/graph/LabelSymbol.java | 29 ++++++++++- .../tinkerpop/machine/structure/graph/TGraph.java | 2 +- .../structure/{table => rdbms}/TDatabase.java | 5 +- .../machine/structure/{table => rdbms}/TRow.java | 2 +- .../machine/structure/{table => rdbms}/TTable.java | 2 +- .../tinkerpop/machine/structure/util/J2Tuple.java | 18 +++++-- .../{graph/TGraph.java => util/JSequence.java} | 26 ++++++++-- .../tinkerpop/machine/structure/util/JTuple.java | 26 +++++++++- .../machine/traverser/path/BasicPath.java | 35 +++++++++++++ .../machine/traverser/path/EmptyPath.java | 30 +++++++++++ .../tinkerpop/machine/traverser/path/Path.java | 4 +- .../tinkerpop/machine/processor/pipes/Pipes.java | 6 +-- .../blueprints/data/BlueprintsVertex.java | 14 +++++- .../machine/structure/jdbc/JDBCDatabase.java | 58 +++++++++++++++++++--- .../tinkerpop/machine/structure/jdbc/JDBCRow.java | 45 +++++++++++++++-- .../machine/structure/jdbc/JDBCStructure.java | 4 +- .../machine/structure/jdbc/JDBCTable.java | 25 +++++++++- .../structure/jdbc/strategy/JDBCStrategy.java | 13 +++-- .../tinkerpop/machine/structure/jdbc/JDBCTest.java | 17 +++++-- 33 files changed, 460 insertions(+), 75 deletions(-) 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 c281220..5015a9e 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 @@ -20,6 +20,8 @@ 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.traverser.Traverser; import org.apache.tinkerpop.machine.traverser.path.Path; @@ -53,10 +55,14 @@ public interface Traversal<C, S, E> extends Iterator<E> { public Traversal<C, S, Long> count(); + public Traversal<C, S, TDatabase> db(); + public Traversal<C, S, E> emit(); 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 Traversal<C, S, String> explain(); public Traversal<C, S, E> filter(final Traversal<C, E, ?> filterTraversal); @@ -95,7 +101,11 @@ public interface Traversal<C, S, E> extends Iterator<E> { public Traversal<C, S, E> order(); - public Traversal<C, S, Path> path(final String... labels); + public Traversal<C, S, Path> path(); + + public <R> Traversal<C, S, R> path(final String label); + + public Traversal<C, S, Path> path(final String label, final String... labels); public Traversal<C, S, E> repeat(final Traversal<C, E, E> repeatTraversal); 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 82f3ddc..bcbf648 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 @@ -32,7 +32,7 @@ import org.apache.tinkerpop.machine.strategy.finalization.CoefficientStrategy; import org.apache.tinkerpop.machine.strategy.verification.CoefficientVerificationStrategy; import org.apache.tinkerpop.machine.structure.StructureFactory; import org.apache.tinkerpop.machine.structure.graph.TVertex; -import org.apache.tinkerpop.machine.structure.table.TDatabase; +import org.apache.tinkerpop.machine.structure.rdbms.TDatabase; import java.util.Map; 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 111613c..86f2329 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 @@ -30,6 +30,8 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Pred; 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.traverser.path.Path; /** @@ -109,6 +111,11 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> { } @Override + public Traversal<C, S, TDatabase> db() { + return this.addInstruction(Symbols.DB); + } + + @Override public Traversal<C, S, E> emit() { return TraversalUtil.insertRepeatInstruction(this, 'e', true); } @@ -119,6 +126,11 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> { } @Override + public <K, V> Traversal<C, S, T2Tuple<K, V>> entries() { + return this.addInstruction(Symbols.ENTRIES); + } + + @Override public Traversal<C, S, String> explain() { return this.addInstruction(Symbols.EXPLAIN); } @@ -214,8 +226,22 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> { } @Override - public Traversal<C, S, Path> path(final String... labels) { - return this.addInstruction(Symbols.PATH, TraversalUtil.addObjects(labels, "|")); + public Traversal<C, S, Path> path() { + return this.addInstruction(Symbols.PATH, "|"); + } + + @Override + public <R> Traversal<C, S, R> path(final String label) { + this.addInstruction(Symbols.PATH, label, "|"); + return (Traversal) this.addInstruction(Symbols.VALUE, 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; } @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 72f13a1..77b3a40 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 @@ -20,6 +20,7 @@ package org.apache.tinkerpop.language.gremlin.core; import org.apache.tinkerpop.language.gremlin.P; import org.apache.tinkerpop.language.gremlin.Traversal; +import org.apache.tinkerpop.machine.traverser.path.Path; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -82,6 +83,18 @@ public class __ { return __.<C, S>start().map(traversal); } + public static <C, S> Traversal<C, S, Path> path() { + return __.<C, S>start().path(); + } + + public static <C, S, R> Traversal<C, S, R> path(final String label) { + return __.<C, S>start().path(label); + } + + public static <C, S> Traversal<C, S, Path> path(final String label, final String... labels) { + return __.<C, S>start().path(label, labels); + } + public static <C, S extends Number> Traversal<C, S, S> sum() { return __.<C, S>start().sum(); } 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 42216f5..eeeeacc 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 @@ -110,6 +110,7 @@ public final class Bytecode<C> implements Cloneable, Serializable { } for (final Instruction<C> instruction : this.instructions) { clone.addInstruction(instruction.coefficient(), instruction.op(), instruction.args()); + clone.lastInstruction().setLabel(instruction.label()); } return clone; } catch (final CloneNotSupportedException e) { 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 d7f2904..b77011b 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,6 +30,7 @@ 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.EntriesFlatMap; import org.apache.tinkerpop.machine.function.flatmap.FlatMapFlatMap; import org.apache.tinkerpop.machine.function.flatmap.UnfoldFlatMap; import org.apache.tinkerpop.machine.function.flatmap.ValuesFlatMap; @@ -69,6 +70,7 @@ public final class CoreCompiler implements BytecodeCompiler { put(Symbols.BRANCH, FunctionType.BRANCH); put(Symbols.CONSTANT, FunctionType.MAP); put(Symbols.COUNT, FunctionType.REDUCE); + put(Symbols.ENTRIES, FunctionType.FLATMAP); put(Symbols.FILTER, FunctionType.FILTER); put(Symbols.FLATMAP, FunctionType.FLATMAP); put(Symbols.GROUP_COUNT, FunctionType.REDUCE); @@ -106,6 +108,8 @@ public final class CoreCompiler implements BytecodeCompiler { return ConstantMap.compile(instruction); case Symbols.COUNT: return CountReduce.compile(instruction); + case Symbols.ENTRIES: + return EntriesFlatMap.compile(instruction); case Symbols.FILTER: return FilterFilter.compile(instruction); case Symbols.FLATMAP: @@ -192,6 +196,7 @@ public final class CoreCompiler implements BytecodeCompiler { public static final String BRANCH = "branch"; public static final String CONSTANT = "constant"; public static final String COUNT = "count"; + public static final String ENTRIES = "entries"; public static final String EXPLAIN = "explain"; public static final String FILTER = "filter"; public static final String FLATMAP = "flatmap"; 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 835bf4d..d6ef5db 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 @@ -24,11 +24,13 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Pred; 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.util.T2Tuple; 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; +import java.util.Iterator; + /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ @@ -50,7 +52,9 @@ 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); - for (final T2Tuple<K, V> entry : traverser.object().entries()) { + final Iterator<T2Tuple<K, V>> iterator = traverser.object().entries(); + while (iterator.hasNext()) { + final T2Tuple<K, V> entry = iterator.next(); if (this.predicate.test(entry.key(), testKey)) return true; } 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/EntriesFlatMap.java similarity index 56% copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/EntriesFlatMap.java index 9b983b6..4143cc5 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/EntriesFlatMap.java @@ -16,47 +16,50 @@ * 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.structure.table.TDatabase; +import org.apache.tinkerpop.machine.function.FlatMapFunction; +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; import java.util.Iterator; -import java.util.List; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public final class DbInitial<C> extends AbstractFunction<C> implements InitialFunction<C, TDatabase> { +public final class EntriesFlatMap<C, K, V> extends AbstractFunction<C> implements FlatMapFunction<C, TTuple<K, V>, T2Tuple<K, V>> { - private TDatabase database; - private DbInitial(final Coefficient<C> coefficient, final String label, final TDatabase database) { + private EntriesFlatMap(final Coefficient<C> coefficient, final String label) { super(coefficient, label); - this.database = database; } + @Override + public Iterator<T2Tuple<K, V>> apply(final Traverser<C, TTuple<K, V>> traverser) { + return traverser.object().entries(); + } @Override - public Iterator<TDatabase> get() { - return List.of(this.database).iterator(); + public EntriesFlatMap<C, K, V> clone() { + return (EntriesFlatMap<C, K, V>) super.clone(); } @Override public int hashCode() { - return super.hashCode() ^ this.database.hashCode(); + return super.hashCode(); } @Override public String toString() { - return StringFactory.makeFunctionString(this, this.database); + return StringFactory.makeFunctionString(this); } - public static <C> DbInitial<C> compile(final Instruction<C> instruction) { - return new DbInitial<>(instruction.coefficient(), instruction.label(), (TDatabase) instruction.args()[0]); + public static <C, K, V> EntriesFlatMap<C, K, V> compile(final Instruction<C> instruction) { + return new EntriesFlatMap<>(instruction.coefficient(), instruction.label()); } -} +} \ No newline at end of file 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/initial/DbInitial.java index 9b983b6..246f072 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/initial/DbInitial.java @@ -22,7 +22,9 @@ 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.structure.table.TDatabase; +import org.apache.tinkerpop.machine.function.MapFunction; +import org.apache.tinkerpop.machine.structure.rdbms.TDatabase; +import org.apache.tinkerpop.machine.traverser.Traverser; import org.apache.tinkerpop.machine.util.StringFactory; import java.util.Iterator; @@ -31,7 +33,7 @@ import java.util.List; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public final class DbInitial<C> extends AbstractFunction<C> implements InitialFunction<C, TDatabase> { +public final class DbInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, TDatabase>, MapFunction<C, S, TDatabase> { private TDatabase database; @@ -56,7 +58,17 @@ public final class DbInitial<C> extends AbstractFunction<C> implements InitialFu return StringFactory.makeFunctionString(this, this.database); } - public static <C> DbInitial<C> compile(final Instruction<C> instruction) { + public static <C, S> DbInitial<C, S> compile(final Instruction<C> instruction) { return new DbInitial<>(instruction.coefficient(), instruction.label(), (TDatabase) instruction.args()[0]); } + + @Override + public TDatabase apply(final Traverser<C, S> traverser) { + return this.database; + } + + @Override + public DbInitial<C, S> clone() { + return this; + } } 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 89eadb2..6549ad2 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().forEach(entry -> tuple.set(entry.key(), entry.value())); - valueB.entries().forEach(entry -> tuple.set(entry.key(), entry.value())); + valueA.entries().forEachRemaining(entry -> tuple.set(entry.key(), entry.value())); + valueB.entries().forEachRemaining(entry -> tuple.set(entry.key(), entry.value())); return new JTuple<>(); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSequence.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSequence.java index 7e6ceba..7c57095 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSequence.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSequence.java @@ -23,4 +23,8 @@ package org.apache.tinkerpop.machine.structure; */ public interface TSequence<V> extends Iterable<V> { + public void add(final V value); + + public void remove(final V 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 8228291..c324caf 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 @@ -20,6 +20,8 @@ package org.apache.tinkerpop.machine.structure; import org.apache.tinkerpop.machine.structure.util.T2Tuple; +import java.util.Iterator; + /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ @@ -35,6 +37,10 @@ public interface TTuple<K, V> { public void set(final K key, final V value); - public TSequence<T2Tuple<K, V>> entries(); + public void add(final K key, final V value); + + public void remove(final K key); + + public Iterator<T2Tuple<K, V>> entries(); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/LabelSymbol.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/G.java similarity index 84% copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/LabelSymbol.java copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/G.java index 09ae9f8..5b0f6d0 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/LabelSymbol.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/G.java @@ -23,5 +23,12 @@ import org.apache.tinkerpop.machine.structure.TSymbol; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class LabelSymbol implements TSymbol { +public final class G { + + private G() { + // static instance + } + + public static TSymbol id = IdSymbol.instance(); + public static TSymbol label = LabelSymbol.instance(); } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/IdSymbol.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/IdSymbol.java index bda1787..43f6b8f 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/IdSymbol.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/IdSymbol.java @@ -23,5 +23,30 @@ import org.apache.tinkerpop.machine.structure.TSymbol; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class IdSymbol implements TSymbol { +final class IdSymbol implements TSymbol { + + private static final IdSymbol INSTANCE = new IdSymbol(); + + private IdSymbol() { + // static instance + } + + @Override + public String toString() { + return "#id"; + } + + @Override + public int hashCode() { + return this.toString().hashCode(); + } + + @Override + public boolean equals(final Object other) { + return other instanceof IdSymbol; + } + + public static IdSymbol instance() { + return INSTANCE; + } } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/LabelSymbol.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/LabelSymbol.java index 09ae9f8..cbeb33b 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/LabelSymbol.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/LabelSymbol.java @@ -23,5 +23,30 @@ import org.apache.tinkerpop.machine.structure.TSymbol; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class LabelSymbol implements TSymbol { -} +final class LabelSymbol implements TSymbol { + + private static final LabelSymbol INSTANCE = new LabelSymbol(); + + private LabelSymbol() { + // static instance + } + + @Override + public String toString() { + return "#label"; + } + + @Override + public int hashCode() { + return this.toString().hashCode(); + } + + @Override + public boolean equals(final Object other) { + return other instanceof LabelSymbol; + } + + public static LabelSymbol instance() { + return INSTANCE; + } +} \ No newline at end of file diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TGraph.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TGraph.java index d515a33..f0fa9b4 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TGraph.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TGraph.java @@ -24,5 +24,5 @@ import org.apache.tinkerpop.machine.structure.TTuple; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface TGraph extends TTuple<String, TSequence<TVertex>> { +public interface TGraph extends TSequence<TVertex> { } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TDatabase.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdbms/TDatabase.java similarity index 83% rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TDatabase.java rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdbms/TDatabase.java index 445ed33..56d5157 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TDatabase.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdbms/TDatabase.java @@ -16,12 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.structure.table; +package org.apache.tinkerpop.machine.structure.rdbms; +import org.apache.tinkerpop.machine.structure.Structure; import org.apache.tinkerpop.machine.structure.TTuple; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface TDatabase extends TTuple<String,TTable> { +public interface TDatabase extends TTuple<String, TTable>, Structure { } diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TRow.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdbms/TRow.java similarity index 94% rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TRow.java rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdbms/TRow.java index d4161bb..d80e399 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TRow.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdbms/TRow.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.structure.table; +package org.apache.tinkerpop.machine.structure.rdbms; import org.apache.tinkerpop.machine.structure.TTuple; diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TTable.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdbms/TTable.java similarity index 94% rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TTable.java rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdbms/TTable.java index f3d7679..ba447f4 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TTable.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdbms/TTable.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.structure.table; +package org.apache.tinkerpop.machine.structure.rdbms; import org.apache.tinkerpop.machine.structure.TSequence; 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 4827f71..e94e138 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 @@ -18,9 +18,9 @@ */ package org.apache.tinkerpop.machine.structure.util; -import org.apache.tinkerpop.machine.structure.TSequence; +import org.apache.tinkerpop.machine.util.IteratorUtils; -import java.util.List; +import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -56,8 +56,18 @@ public final class J2Tuple<K, V> implements T2Tuple<K, V> { } @Override - public TSequence<T2Tuple<K, V>> entries() { - return () -> List.of((T2Tuple<K, V>) this).iterator(); + public void add(final K key, final V value) { + throw new IllegalStateException("Can't add key/value for a 2-tuple"); + } + + @Override + public void remove(final K key) { + throw new IllegalStateException("Can't remove key/value for a 2-tuple"); + } + + @Override + public Iterator<T2Tuple<K, V>> entries() { + return IteratorUtils.of(this); } @Override diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TGraph.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JSequence.java similarity index 64% copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TGraph.java copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JSequence.java index d515a33..6b54a54 100644 --- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TGraph.java +++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JSequence.java @@ -16,13 +16,33 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.machine.structure.graph; +package org.apache.tinkerpop.machine.structure.util; import org.apache.tinkerpop.machine.structure.TSequence; -import org.apache.tinkerpop.machine.structure.TTuple; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface TGraph extends TTuple<String, TSequence<TVertex>> { +public final class JSequence<V> implements TSequence<V> { + + private final List<V> list = new ArrayList<>(); + + @Override + public void add(final V value) { + this.list.add(value); + } + + @Override + public void remove(final V value) { + this.list.remove(value); + } + + @Override + public Iterator<V> iterator() { + return this.list.iterator(); + } } 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 edff5bd..7f59f9a 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 @@ -23,6 +23,7 @@ import org.apache.tinkerpop.machine.structure.TTuple; import org.apache.tinkerpop.machine.util.IteratorUtils; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; /** @@ -48,8 +49,29 @@ public class JTuple<K, V> implements TTuple<K, V> { } @Override - public TSequence<T2Tuple<K, V>> entries() { - return () -> IteratorUtils.map(this.map.entrySet().iterator(), e -> new J2Tuple<>(e.getKey(), e.getValue())); + 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); + } + + @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 e1844c0..19c3736 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,11 @@ */ 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; import java.util.List; /** @@ -33,12 +37,43 @@ public final class BasicPath implements Path { } @Override + public boolean has(final String key) { + return this.labels.contains(key); + } + + @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) + this.objects.set(index, value); + } + + @Override public void add(final String label, final Object object) { this.labels.add(label); this.objects.add(object); } @Override + public void remove(final String key) { + final int index = this.labels.indexOf(key); + if (-1 != index) { + this.labels.remove(index); + this.objects.remove(index); + } + } + + @Override + public Iterator<T2Tuple<String, Object>> entries() { + return null; + } + + @Override public Object object(final int index) { return this.objects.get(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 b8c5c7c..b3b0a6d 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,6 +18,11 @@ */ package org.apache.tinkerpop.machine.traverser.path; +import org.apache.tinkerpop.machine.structure.util.T2Tuple; + +import java.util.Collections; +import java.util.Iterator; + /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ @@ -30,11 +35,36 @@ public final class EmptyPath implements Path { } @Override + public boolean has(final String key) { + return false; + } + + @Override + public Object value(final String key) { + throw new IllegalStateException("No objects in EmptyPath"); + } + + @Override + public void set(final String key, final Object value) { + + } + + @Override public void add(final String label, final Object object) { } @Override + public void remove(final String key) { + + } + + @Override + public Iterator<T2Tuple<String, Object>> entries() { + return Collections.emptyIterator(); + } + + @Override public Object object(int index) { throw new IllegalStateException("No objects in EmptyPath"); } 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 eb853b9..cd911b5 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,12 +18,14 @@ */ package org.apache.tinkerpop.machine.traverser.path; +import org.apache.tinkerpop.machine.structure.TTuple; + import java.io.Serializable; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface Path extends Serializable, Cloneable { +public interface Path extends Serializable, Cloneable, TTuple<String,Object> { public enum Pop { first, last, all; 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 cc5a4cf..f93f644 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,7 +59,9 @@ public final class Pipes<C, S, E> implements Processor<C, S, E> { previousStep = this.startStep; } - if (function instanceof RepeatBranch) + 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) nextStep = new RepeatStep<>(previousStep, (RepeatBranch<C, S>) function); else if (function instanceof BranchFunction) nextStep = new BranchStep<>(previousStep, (BranchFunction<C, S, E>) function); @@ -69,8 +71,6 @@ 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/data/BlueprintsVertex.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/data/BlueprintsVertex.java index a88b146..fa08d24 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 @@ -59,6 +59,16 @@ public class BlueprintsVertex<V> implements TVertex<V>, Serializable { } @Override + public void add(String key, V value) { + + } + + @Override + public void remove(String key) { + + } + + @Override public V value(String key) { return (V) "marko"; } @@ -74,8 +84,8 @@ public class BlueprintsVertex<V> implements TVertex<V>, Serializable { } @Override - public TSequence<T2Tuple<String, V>> entries() { - return Collections::emptyIterator; + public Iterator<T2Tuple<String, V>> entries() { + return Collections.emptyIterator(); } @Override 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 cad8d9c..ed57e74 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 @@ -18,21 +18,21 @@ */ package org.apache.tinkerpop.machine.structure.jdbc; -import org.apache.tinkerpop.machine.structure.Structure; -import org.apache.tinkerpop.machine.structure.TSequence; -import org.apache.tinkerpop.machine.structure.table.TDatabase; -import org.apache.tinkerpop.machine.structure.table.TTable; +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 java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -final class JDBCDatabase implements TDatabase, Structure { +final class JDBCDatabase implements TDatabase { private final Connection connection; @@ -69,8 +69,52 @@ final class JDBCDatabase implements TDatabase, Structure { } @Override - public TSequence<T2Tuple<String, TTable>> entries() { - return null; + 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); + } catch (final SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + @Override + public Iterator<T2Tuple<String, TTable>> entries() { + try { + final ResultSet result = this.connection.createStatement().executeQuery("SHOW TABLES"); + return new Iterator<>() { + boolean done = false; + + @Override + public boolean hasNext() { + return !this.done; + } + + @Override + public T2Tuple<String, TTable> next() { + try { + result.next(); + final String tableName = result.getString(1); + final T2Tuple<String, TTable> tuple = new J2Tuple<>(tableName, new JDBCTable(connection, tableName)); + this.done = result.isLast(); + return tuple; + } catch (final SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + }; + } catch (final SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + @Override + public String toString() { + return "<database#" + this.connection + ">"; } } 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 57017ad..2591553 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 @@ -18,14 +18,15 @@ */ package org.apache.tinkerpop.machine.structure.jdbc; -import org.apache.tinkerpop.machine.structure.TSequence; -import org.apache.tinkerpop.machine.structure.table.TRow; +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 java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -73,10 +74,37 @@ final class JDBCRow<V> implements TRow<V> { } @Override - public TSequence<T2Tuple<String, V>> entries() { + public void add(final String key, final V value) { try { this.rows.absolute(this.rowId); - return () -> new Iterator<>() { + 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); + this.rows.updateObject(key, null); + } catch (final SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + @Override + public Iterator<T2Tuple<String, V>> entries() { + try { + this.rows.absolute(this.rowId); + return new Iterator<>() { int column = 1; @@ -104,4 +132,13 @@ final class JDBCRow<V> implements TRow<V> { throw new RuntimeException(e.getMessage(), e); } } + + @Override + public String toString() { + try { + return "<row#" + this.rows.getMetaData().getTableName(1) + ":" + this.rowId + ">"; + } catch (final SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } } diff --git a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCStructure.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCStructure.java index 778a36b..8c6a2ab 100644 --- a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCStructure.java +++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCStructure.java @@ -31,6 +31,8 @@ import java.util.Set; */ public class JDBCStructure implements StructureFactory { + public static final String JDBC_CONNECTION = "jdbc.connection"; + private final Map<String, Object> configuration; public JDBCStructure(final Map<String, Object> configuration) { @@ -44,6 +46,6 @@ public class JDBCStructure implements StructureFactory { @Override public Structure mint() { - return new JDBCDatabase((String) this.configuration.get("jdbc.connection")); + return new JDBCDatabase((String) this.configuration.get(JDBC_CONNECTION)); } } diff --git a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTable.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTable.java index de8b46a..a0b8cf5 100644 --- a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTable.java +++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTable.java @@ -18,8 +18,8 @@ */ package org.apache.tinkerpop.machine.structure.jdbc; -import org.apache.tinkerpop.machine.structure.table.TRow; -import org.apache.tinkerpop.machine.structure.table.TTable; +import org.apache.tinkerpop.machine.structure.rdbms.TRow; +import org.apache.tinkerpop.machine.structure.rdbms.TTable; import java.sql.Connection; import java.sql.ResultSet; @@ -67,4 +67,25 @@ final class JDBCTable implements TTable { throw new RuntimeException(e.getMessage(), e); } } + + @Override + public void add(final TRow<?> value) { + try { + this.connection.createStatement().executeUpdate("INSERT INTO " + this.name + " ()" + " VALUES (" + value + ")"); + } catch (final SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + @Override + public void remove(final TRow<?> value) { + // TODO + } + + @Override + public String toString() { + return "<table#" + this.name + ">"; + } + + // TODO: equals(), hashcode() } 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 84466cd..fc3b154 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 @@ -25,6 +25,9 @@ import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols; import org.apache.tinkerpop.machine.strategy.AbstractStrategy; import org.apache.tinkerpop.machine.strategy.Strategy; +import java.util.ArrayList; +import java.util.List; + /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ @@ -32,16 +35,16 @@ public final class JDBCStrategy extends AbstractStrategy<Strategy.ProviderStrate @Override public <C> void apply(final Bytecode<C> bytecode) { - Instruction<C> dbInstruction = null; + final List<Instruction<C>> dbInstructions = new ArrayList<>(); for (final Instruction<C> instruction : bytecode.getInstructions()) { if (instruction.op().equals(Symbols.DB)) { - dbInstruction = instruction; + dbInstructions.add(instruction); } } - if (null != dbInstruction) { - BytecodeUtil.replaceInstruction(bytecode, dbInstruction, + for (final Instruction<C> instruction : dbInstructions) { + BytecodeUtil.replaceInstruction(bytecode, instruction, new Instruction<>( - dbInstruction.coefficient(), + instruction.coefficient(), Symbols.DB, BytecodeUtil.getStructureFactory(BytecodeUtil.getRootBytecode(bytecode)).get().mint())); } 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 be9a7d2..242bba7 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 @@ -19,11 +19,11 @@ package org.apache.tinkerpop.machine.structure.jdbc; import org.apache.tinkerpop.language.gremlin.Gremlin; -import org.apache.tinkerpop.language.gremlin.P; import org.apache.tinkerpop.language.gremlin.TraversalSource; +import org.apache.tinkerpop.language.gremlin.core.__; import org.apache.tinkerpop.machine.Machine; import org.apache.tinkerpop.machine.processor.pipes.PipesProcessor; -import org.apache.tinkerpop.machine.species.BasicMachine; +import org.apache.tinkerpop.machine.species.LocalMachine; import org.junit.jupiter.api.Test; import java.sql.Connection; @@ -42,6 +42,7 @@ public class JDBCTest { " name VARCHAR(255) NOT NULL,\n" + " age TINYINT NOT NULL)"); //connection.createStatement().execute("INSERT INTO people(`name`,`age`) VALUES ('marko',29)"); + //connection.createStatement().execute("INSERT INTO people(`name`,`age`) VALUES ('josh',32)"); /* final TDatabase db = new JDBCDatabase("jdbc:h2:/tmp/test"); @@ -55,11 +56,17 @@ public class JDBCTest { //////// - final Machine machine = BasicMachine.open(); + final Machine machine = LocalMachine.open(); final TraversalSource<Long> jdbc = Gremlin.<Long>traversal(machine). withProcessor(PipesProcessor.class). - withStructure(JDBCStructure.class, Map.of("jdbc.connection", "jdbc:h2:/tmp/test")); - System.out.println(jdbc.db().values("people").hasKey(P.eq("age")).value("name").toList()); + withStructure(JDBCStructure.class, Map.of(JDBCStructure.JDBC_CONNECTION, "jdbc:h2:/tmp/test")); + System.out.println(jdbc.db().toList()); + System.out.println(jdbc.db().entries().toList()); + System.out.println(jdbc.db().value("people").toList()); + 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()); } }