You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by co...@apache.org on 2023/12/05 22:08:11 UTC
(tinkerpop) branch old-4.0-dev created (now bd79bcc4c1)
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a change to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
at bd79bcc4c1 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.
This branch includes the following new commits:
new 6b39526f4b I have a working implementation of recurssive-based repeat() in RxJava. This was an intense slog. Learned alot. I have written some pretty nasty nested branching test cases and the model is holding up.
new 2cf7cdfed0 Processor no longer implement Iterator. It now supports both a push-based and a pull-based execution via subscribe(Consumer) and iterator(), respectively. I haven't done this properly for Beam as I need to rework TraverserServer. Also, need to think about how to use Compilation within a push-based system so that local/nested traversals don't block on iterator.next().
new d9a986302a some reorg on RxJava.
new 576f880e59 fixed a bug in Pipes.subscribe().
new 26c55fff30 Removed historic method-based traversal as we are not going to go in that direction. Added TTuple, TSequence, and TSymbol. Added JDBC support via TDatabase, TTable, TRow. We have a new reference implementation structure/jdbc. Added TraversalSource.db(). Removed TMap, TList, etc. as now everything is TTuple based. Fixed up the Structure API and BytecodeUtil to use it more intelligently. Lots of nicknack reorg and cleanups.
new 706ad64b78 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.
new 1494567d93 There are no more InitialFunctions. If a FlatMapFunction implements Initializing then that means it can generate an output that isn't dependent on input. This way, we can have V() and mid-traversal V() without having two steps. Likewise for db() and inject(). Created PathObjectMap which is for path('x').by()... it will emit a single object, not a Path. Lots of other cleanup and organization.
new 7142dc16d8 Created a JDBCQueryStrategy that looks for 'join' semantics in the bytecode and folds it into a custom jdbs:sql instruction that does a SELECT call.
new 36770acdaf dah. commited with System.out.printlns(). I'm pooped. Need to rest.
new 4ac1cb8961 added rdf/. Super easy. FlatMapInitial is used to wrap FlatMap functions that can serve as initials so we don't have to duplicate code.
new 57dfb646ff added hashCode() and toString() to FlatMapInitial.
new 0ae83d2e1f minor nothing. done for the day.
new bd79bcc4c1 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.
The 13 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(tinkerpop) 04/13: fixed a bug in Pipes.subscribe().
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 576f880e5918b0912fa8b9bdf531d24e116be3ba
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Tue Apr 23 06:54:50 2019 -0600
fixed a bug in Pipes.subscribe().
---
.../src/main/java/org/apache/tinkerpop/machine/processor/beam/Beam.java | 2 +-
.../main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java | 1 -
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/Beam.java b/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/Beam.java
index 20007c4219..0bb39fe15f 100644
--- a/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/Beam.java
+++ b/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/Beam.java
@@ -89,7 +89,7 @@ public class Beam<C, S, E> implements Processor<C, S, E> {
@Override
public void stop() {
try {
- if (null != this.pipelineResult)
+ if (this.isRunning())
this.pipelineResult.cancel();
} catch (final IOException e) {
throw new RuntimeException(e.getMessage(), e);
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 317659fcf1..cc5a4cfb1f 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
@@ -115,7 +115,6 @@ public final class Pipes<C, S, E> implements Processor<C, S, E> {
if (this.isRunning())
throw Processor.Exceptions.processorIsCurrentlyRunning(this);
- this.alive.set(Boolean.TRUE);
new Thread(() -> {
final Iterator<Traverser<C, E>> iterator = this.iterator(starts);
while (iterator.hasNext()) {
(tinkerpop) 05/13: Removed historic method-based traversal as we are not going to go in that direction. Added TTuple, TSequence, and TSymbol. Added JDBC support via TDatabase, TTable, TRow. We have a new reference implementation structure/jdbc. Added TraversalSource.db(). Removed TMap, TList, etc. as now everything is TTuple based. Fixed up the Structure API and BytecodeUtil to use it more intelligently. Lots of nicknack reorg and cleanups.
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 26c55fff30debaf040a04a2994eed005cc36fbb8
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Mon Apr 29 05:58:00 2019 -0600
Removed historic method-based traversal as we are not going to go in that direction. Added TTuple, TSequence, and TSymbol. Added JDBC support via TDatabase, TTable, TRow. We have a new reference implementation structure/jdbc. Added TraversalSource.db(). Removed TMap, TList, etc. as now everything is TTuple based. Fixed up the Structure API and BytecodeUtil to use it more intelligently. Lots of nicknack reorg and cleanups.
---
.../tinkerpop/language/gremlin/Traversal.java | 20 +-
.../language/gremlin/TraversalSource.java | 23 +-
.../tinkerpop/language/gremlin/TraversalUtil.java | 4 +-
.../language/gremlin/common/CommonTraversal.java | 255 ---------------------
.../tinkerpop/language/gremlin/common/__.java | 96 --------
.../language/gremlin/core/CoreTraversal.java | 96 +++-----
.../apache/tinkerpop/language/gremlin/core/__.java | 29 +++
.../tinkerpop/machine/bytecode/BytecodeUtil.java | 19 +-
.../machine/bytecode/compiler/CommonCompiler.java | 207 -----------------
.../machine/bytecode/compiler/CoreCompiler.java | 82 ++++++-
.../machine/bytecode/compiler/MethodArgument.java | 6 +-
.../machine/function/barrier/JoinBarrier.java | 8 +-
.../machine/function/branch/BranchBranch.java | 2 +-
.../machine/function/filter/HasKeyFilter.java | 16 +-
.../machine/function/filter/HasKeyValueFilter.java | 10 +-
.../ValueMap.java => flatmap/ValuesFlatMap.java} | 24 +-
.../machine/function/initial/DbInitial.java} | 35 ++-
.../tinkerpop/machine/function/map/ValueMap.java | 8 +-
.../machine/function/reduce/GroupCountReduce.java | 27 +--
.../machine/processor/ProcessorFactory.java | 8 -
.../strategy/decoration/ExplainStrategy.java | 2 +-
.../strategy/finalization/CoefficientStrategy.java | 8 +-
.../strategy/optimization/IdentityStrategy.java | 4 +-
.../machine/structure/EmptyStructure.java | 2 +-
.../machine/structure/StructureFactory.java | 12 +-
.../{data/TTuple2.java => TSequence.java} | 8 +-
.../structure/{data/TTuple2.java => TSymbol.java} | 8 +-
.../structure/{data/TMap.java => TTuple.java} | 23 +-
.../tinkerpop/machine/structure/data/JMap.java | 91 --------
.../{data/TTuple2.java => graph/IdSymbol.java} | 11 +-
.../{data/TTuple2.java => graph/LabelSymbol.java} | 11 +-
.../machine/structure/{data => graph}/TEdge.java | 10 +-
.../structure/{data => graph}/TElement.java | 6 +-
.../{data/TElement.java => graph/TGraph.java} | 11 +-
.../machine/structure/{data => graph}/TVertex.java | 12 +-
.../{data/TElement.java => graph/TVertices.java} | 10 +-
.../{data/TElement.java => table/TDatabase.java} | 10 +-
.../{data/TElement.java => table/TRow.java} | 10 +-
.../{data/TElement.java => table/TTable.java} | 10 +-
.../tinkerpop/machine/structure/util/J2Tuple.java | 72 ++++++
.../tinkerpop/machine/structure/util/JTuple.java} | 36 +--
.../{data/JTuple2.java => util/T2Tuple.java} | 24 +-
.../machine/bytecode/compiler/CompilationTest.java | 12 +-
.../machine/species/LocalMachineTest.java | 8 +-
.../apache/tinkerpop/machine/SimpleTestSuite.java | 10 +-
.../machine/processor/beam/BeamProcessor.java | 9 +-
.../machine/processor/beam/SimpleLocalTest.java | 4 +-
.../machine/processor/beam/SimpleRemoteTest.java | 4 +-
.../machine/processor/pipes/PipesProcessor.java | 8 +-
.../machine/processor/pipes/PipesTest.java | 6 +-
.../machine/processor/pipes/SimpleLocalTest.java | 4 +-
.../machine/processor/pipes/SimpleRemoteTest.java | 4 +-
.../machine/processor/rxjava/RxJavaProcessor.java | 5 -
.../processor/rxjava/strategy/RxJavaStrategy.java | 8 +-
.../machine/processor/rxjava/RxJavaBenchmark.java | 3 +-
.../processor/rxjava/SimpleLocalParallelTest.java | 4 +-
.../processor/rxjava/SimpleLocalSerialTest.java | 4 +-
.../processor/rxjava/SimpleRemoteParallelTest.java | 4 +-
.../processor/rxjava/SimpleRemoteSerialTest.java | 4 +-
.../structure/blueprints/BlueprintsStructure.java | 6 +-
.../blueprints/data/BlueprintsVertex.java | 30 +--
.../function/initial/VerticesFlatMap.java | 3 +-
.../provider/BlueprintsVerticesStrategy.java | 4 +-
java/machine/structure/jdbc/pom.xml | 72 ++++++
.../machine/structure/jdbc/JDBCDatabase.java | 76 ++++++
.../tinkerpop/machine/structure/jdbc/JDBCRow.java | 107 +++++++++
.../machine/structure/jdbc/JDBCStructure.java} | 23 +-
.../machine/structure/jdbc/JDBCTable.java | 70 ++++++
.../structure/jdbc/strategy/JDBCStrategy.java} | 24 +-
.../tinkerpop/machine/structure/jdbc/JDBCTest.java | 65 ++++++
java/machine/structure/pom.xml | 1 +
71 files changed, 897 insertions(+), 1051 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 f0fa839d21..c281220d9f 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
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.language.gremlin;
import org.apache.tinkerpop.machine.bytecode.compiler.Order;
-import org.apache.tinkerpop.machine.structure.data.TMap;
+import org.apache.tinkerpop.machine.structure.TTuple;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.path.Path;
@@ -63,21 +63,21 @@ public interface Traversal<C, S, E> extends Iterator<E> {
public <R> Traversal<C, S, R> flatMap(final Traversal<C, E, R> flatMapTraversal);
- public Traversal<C, S, TMap<E, Long>> groupCount();
+ public Traversal<C, S, TTuple<E, Long>> groupCount();
- public <K, V> Traversal<C, S, TMap<K, V>> hasKey(final P<K> predicate);
+ public <K, V> Traversal<C, S, TTuple<K, V>> hasKey(final P<K> predicate);
- public <K, V> Traversal<C, S, TMap<K, V>> hasKey(final K key);
+ public <K, V> Traversal<C, S, TTuple<K, V>> hasKey(final K key);
- public <K, V> Traversal<C, S, TMap<K, V>> hasKey(final Traversal<C, TMap<K, V>, K> keyTraversal);
+ public <K, V> Traversal<C, S, TTuple<K, V>> hasKey(final Traversal<C, TTuple<K, V>, K> keyTraversal);
- public <K, V> Traversal<C, S, TMap<K, V>> has(final K key, final V value);
+ public <K, V> Traversal<C, S, TTuple<K, V>> has(final K key, final V value);
- public <K, V> Traversal<C, S, TMap<K, V>> has(final Traversal<C, TMap<K, V>, K> keyTraversal, final V value);
+ public <K, V> Traversal<C, S, TTuple<K, V>> has(final Traversal<C, TTuple<K, V>, K> keyTraversal, final V value);
- public <K, V> Traversal<C, S, TMap<K, V>> has(final K key, final Traversal<C, TMap<K, V>, V> valueTraversal);
+ public <K, V> Traversal<C, S, TTuple<K, V>> has(final K key, final Traversal<C, TTuple<K, V>, V> valueTraversal);
- public <K, V> Traversal<C, S, TMap<K, V>> has(final Traversal<C, TMap<K, V>, K> keyTraversal, final Traversal<C, TMap<K, V>, V> valueTraversal);
+ public <K, V> Traversal<C, S, TTuple<K, V>> has(final Traversal<C, TTuple<K, V>, K> keyTraversal, final Traversal<C, TTuple<K, V>, V> valueTraversal);
public Traversal<C, S, E> identity();
@@ -111,6 +111,8 @@ public interface Traversal<C, S, E> extends Iterator<E> {
public <K, V> Traversal<C, S, V> value(final K key);
+ public <K, V> Traversal<C, S, V> values(final K key);
+
/**
* UTILITY METHODS
*/
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 eb178662e4..82f3ddc576 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
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.language.gremlin;
-import org.apache.tinkerpop.language.gremlin.common.CommonTraversal;
+import org.apache.tinkerpop.language.gremlin.core.CoreTraversal;
import org.apache.tinkerpop.machine.Machine;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
@@ -31,7 +31,8 @@ import org.apache.tinkerpop.machine.strategy.decoration.ExplainStrategy;
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.data.TVertex;
+import org.apache.tinkerpop.machine.structure.graph.TVertex;
+import org.apache.tinkerpop.machine.structure.table.TDatabase;
import java.util.Map;
@@ -78,6 +79,12 @@ public class TraversalSource<C> implements Cloneable {
return clone;
}
+ public TraversalSource<C> withStructure(final Class<? extends StructureFactory> structure, final Map<String, Object> configuration) {
+ final TraversalSource<C> clone = this.clone();
+ clone.bytecode.addSourceInstruction(Symbols.WITH_STRUCTURE, structure, configuration);
+ return clone;
+ }
+
public TraversalSource<C> withStrategy(final Class<? extends Strategy> strategy) {
final TraversalSource<C> clone = this.clone();
clone.bytecode.addSourceInstruction(Symbols.WITH_STRATEGY, strategy);
@@ -91,7 +98,7 @@ public class TraversalSource<C> implements Cloneable {
final Bytecode<C> bytecode = this.bytecode.clone();
final Coefficient<C> coefficient = this.coefficient.clone();
bytecode.addInstruction(coefficient, Symbols.INITIAL, objects);
- return new CommonTraversal<>(this.machine, bytecode, coefficient); // TODO
+ return new CoreTraversal<>(this.machine, bytecode, coefficient); // TODO
}
public Traversal<C, TVertex, TVertex> V() {
@@ -99,7 +106,15 @@ public class TraversalSource<C> implements Cloneable {
final Bytecode<C> bytecode = this.bytecode.clone();
final Coefficient<C> coefficient = this.coefficient.clone();
bytecode.addInstruction(coefficient, Symbols.V);
- return new CommonTraversal<>(this.machine, bytecode, coefficient); // TODO
+ return new CoreTraversal<>(this.machine, bytecode, coefficient); // TODO
+ }
+
+ public Traversal<C, TDatabase, TDatabase> db() {
+ this.prepareSourceCode();
+ final Bytecode<C> bytecode = this.bytecode.clone();
+ final Coefficient<C> coefficient = this.coefficient.clone();
+ bytecode.addInstruction(coefficient, Symbols.DB);
+ return new CoreTraversal<>(this.machine, bytecode, coefficient); // TODO
}
//
diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java
index 3587e4cc59..25157fda14 100644
--- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java
+++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java
@@ -19,8 +19,6 @@
package org.apache.tinkerpop.language.gremlin;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.Instruction;
-import org.apache.tinkerpop.machine.bytecode.compiler.CommonCompiler;
import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
/**
@@ -55,7 +53,7 @@ public final class TraversalUtil {
public static <C, S, E> Object[] createUnionArguments(final Traversal<C, S, E>... traversals) {
final Object[] args = new Object[traversals.length * 2];
for (int i = 0; i < args.length; i = i + 2) {
- args[i] = CommonCompiler.Symbols.DEFAULT;
+ args[i] = Symbols.DEFAULT;
}
for (int i = 0; i < traversals.length; i++) {
args[(i * 2) + 1] = TraversalUtil.getBytecode(traversals[i]);
diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/CommonTraversal.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/CommonTraversal.java
deleted file mode 100644
index 95aeb51797..0000000000
--- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/CommonTraversal.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.language.gremlin.common;
-
-import org.apache.tinkerpop.language.gremlin.AbstractTraversal;
-import org.apache.tinkerpop.language.gremlin.P;
-import org.apache.tinkerpop.language.gremlin.Traversal;
-import org.apache.tinkerpop.language.gremlin.TraversalUtil;
-import org.apache.tinkerpop.machine.Machine;
-import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CommonCompiler.Symbols;
-import org.apache.tinkerpop.machine.bytecode.compiler.Order;
-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.data.TMap;
-import org.apache.tinkerpop.machine.traverser.path.Path;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class CommonTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
-
- // used by __
- CommonTraversal() {
- // TODO: this will cause __ problems
- this(null, new Bytecode<>(), (Coefficient<C>) LongCoefficient.create());
- }
-
- // used by TraversalSource
- public CommonTraversal(final Machine machine, final Bytecode<C> bytecode, final Coefficient<C> unity) {
- super(machine, bytecode, unity);
- }
-
- @Override
- public Traversal<C, S, E> as(final String label) {
- this.bytecode.lastInstruction().setLabel(label);
- return this;
- }
-
- @Override
- public Traversal<C, S, E> barrier() {
- return this.addInstruction(Symbols.BARRIER);
- }
-
- @Override
- public Traversal<C, S, E> by(final String byString) {
- this.bytecode.addArgs(byString);
- return this;
- }
-
- @Override
- public Traversal<C, S, E> by(final Traversal<C, ?, ?> byTraversal) {
- this.bytecode.addArgs(TraversalUtil.getBytecode(byTraversal));
- return this;
- }
-
- @Override
- public Traversal<C, S, E> by(final Order order) {
- return this.by(__.identity(), order);
- }
-
- @Override
- public Traversal<C, S, E> by(final Traversal<C, ?, ?> byTraversal, final Order order) {
- this.bytecode.addArgs(TraversalUtil.getBytecode(byTraversal), order.name());
- return this;
- }
-
- @Override
- public Traversal<C, S, E> c(final C coefficient) {
- this.currentCoefficient.set(coefficient);
- return this;
- }
-
- @Override
- public <R> Traversal<C, S, R> choose(final Traversal<C, E, ?> predicate, final Traversal<C, E, R> trueTraversal, final Traversal<C, E, R> falseTraversal) {
- return this.addInstruction(Symbols.BRANCH, TraversalUtil.getBytecode(predicate), TraversalUtil.getBytecode(trueTraversal), Symbols.DEFAULT, TraversalUtil.getBytecode(falseTraversal));
- }
-
- @Override
- public <R> Traversal<C, S, R> choose(final Traversal<C, E, ?> predicate, final Traversal<C, E, R> trueTraversal) {
- return this.addInstruction(Symbols.BRANCH, TraversalUtil.getBytecode(predicate), TraversalUtil.getBytecode(trueTraversal));
- }
-
- @Override
- public <R> Traversal<C, S, R> constant(final R constant) {
- return this.addInstruction(Symbols.CONSTANT, constant);
- }
-
- @Override
- public Traversal<C, S, Long> count() {
- return this.addInstruction(Symbols.COUNT);
- }
-
- @Override
- public Traversal<C, S, E> emit() {
- return TraversalUtil.insertRepeatInstruction(this, 'e', true);
- }
-
- @Override
- public Traversal<C, S, E> emit(final Traversal<C, ?, ?> emitTraversal) {
- return TraversalUtil.insertRepeatInstruction(this, 'e', TraversalUtil.getBytecode(emitTraversal));
- }
-
- @Override
- public Traversal<C, S, String> explain() {
- return this.addInstruction(Symbols.EXPLAIN);
- }
-
- @Override
- public Traversal<C, S, E> filter(final Traversal<C, E, ?> filterTraversal) {
- return this.addInstruction(Symbols.FILTER, TraversalUtil.getBytecode(filterTraversal));
- }
-
- @Override
- public <R> Traversal<C, S, R> flatMap(final Traversal<C, E, R> flatMapTraversal) {
- return this.addInstruction(Symbols.FLATMAP, TraversalUtil.getBytecode(flatMapTraversal));
- }
-
- @Override
- public Traversal<C, S, TMap<E, Long>> groupCount() {
- return this.addInstruction(Symbols.GROUP_COUNT);
- }
-
- @Override
- public <K, V> Traversal<C, S, TMap<K, V>> has(final K key, final V value) {
- return this.addInstruction(Symbols.HAS_KEY_VALUE, TraversalUtil.tryToGetBytecode(key), TraversalUtil.tryToGetBytecode(value));
- }
-
- @Override
- public <K, V> Traversal<C, S, TMap<K, V>> has(final Traversal<C, TMap<K, V>, K> keyTraversal, final V value) {
- return this.addInstruction(Symbols.HAS_KEY_VALUE, TraversalUtil.getBytecode(keyTraversal), TraversalUtil.tryToGetBytecode(value));
- }
-
- @Override
- public <K, V> Traversal<C, S, TMap<K, V>> has(final K key, final Traversal<C, TMap<K, V>, V> valueTraversal) {
- return this.addInstruction(Symbols.HAS_KEY_VALUE, TraversalUtil.tryToGetBytecode(key), TraversalUtil.getBytecode(valueTraversal));
- }
-
- @Override
- public <K, V> Traversal<C, S, TMap<K, V>> has(final Traversal<C, TMap<K, V>, K> keyTraversal, final Traversal<C, TMap<K, V>, V> valueTraversal) {
- return this.addInstruction(Symbols.HAS_KEY_VALUE, TraversalUtil.getBytecode(keyTraversal), TraversalUtil.getBytecode(valueTraversal));
- }
-
- @Override
- public <K, V> Traversal<C, S, TMap<K, V>> hasKey(final P<K> predicate) {
- return this.addInstruction(Symbols.HAS_KEY, predicate.type().name(), TraversalUtil.tryToGetBytecode(predicate.object()));
- }
-
- @Override
- public <K, V> Traversal<C, S, TMap<K, V>> hasKey(final K key) {
- return this.addInstruction(Symbols.HAS_KEY, TraversalUtil.tryToGetBytecode(key));
- }
-
- @Override
- public <K, V> Traversal<C, S, TMap<K, V>> hasKey(final Traversal<C, TMap<K, V>, K> keyTraversal) {
- return this.addInstruction(Symbols.HAS_KEY, TraversalUtil.getBytecode(keyTraversal));
- }
-
- @Override
- public Traversal<C, S, E> identity() {
- return this.addInstruction(Symbols.IDENTITY);
- }
-
- @Override
- public Traversal<C, S, E> is(final E object) {
- return this.addInstruction(Symbols.IS, Pred.eq.name(), TraversalUtil.tryToGetBytecode(object));
- }
-
- @Override
- public Traversal<C, S, E> is(final Traversal<C, E, ?> objectTraversal) {
- return this.addInstruction(Symbols.IS, Pred.eq.name(), TraversalUtil.getBytecode(objectTraversal));
- }
-
- @Override
- public Traversal<C, S, E> is(final P<E> predicate) {
- return this.addInstruction(Symbols.IS, predicate.type().name(), TraversalUtil.tryToGetBytecode(predicate.object()));
- }
-
- @Override
- public Traversal<C, S, Long> incr() {
- return this.addInstruction(Symbols.INCR);
- }
-
- @Override
- public Traversal<C, S, Integer> loops() {
- return this.addInstruction(Symbols.LOOPS);
- }
-
- @Override
- public <R> Traversal<C, S, R> map(final Traversal<C, E, R> mapTraversal) {
- return this.addInstruction(Symbols.MAP, TraversalUtil.getBytecode(mapTraversal));
- }
-
- @Override
- public Traversal<C, S, E> order() {
- return this.addInstruction(Symbols.ORDER);
- }
-
- @Override
- public Traversal<C, S, Path> path(final String... labels) {
- return this.addInstruction(Symbols.PATH, TraversalUtil.addObjects(labels, "|"));
- }
-
- @Override
- public Traversal<C, S, E> repeat(final Traversal<C, E, E> repeatTraversal) {
- return TraversalUtil.insertRepeatInstruction(this, 'r', TraversalUtil.getBytecode(repeatTraversal));
- }
-
- @Override
- public <R extends Number> Traversal<C, S, R> sum() {
- return this.addInstruction(Symbols.SUM);
- }
-
- @Override
- public Traversal<C, S, E> times(final int times) {
- return TraversalUtil.insertRepeatInstruction(this, 'u', times);
- }
-
- @Override
- public <R> Traversal<C, S, R> unfold() {
- return this.addInstruction(Symbols.UNFOLD);
- }
-
- @Override
- public <R> Traversal<C, S, R> union(final Traversal<C, E, R>... traversals) {
- return this.addInstruction(Symbols.BRANCH, TraversalUtil.createUnionArguments(traversals));
- }
-
- @Override
- public Traversal<C, S, E> until(final Traversal<C, ?, ?> untilTraversal) {
- return TraversalUtil.insertRepeatInstruction(this, 'u', TraversalUtil.getBytecode(untilTraversal));
- }
-
- @Override
- public <K, V> Traversal<C, S, V> value(final K key) {
- return this.addInstruction(Symbols.VALUE, key);
- }
-}
diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/__.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/__.java
deleted file mode 100644
index 0bd98df792..0000000000
--- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/common/__.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.language.gremlin.common;
-
-import org.apache.tinkerpop.language.gremlin.P;
-import org.apache.tinkerpop.language.gremlin.Traversal;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class __ {
-
- private __() {
- // static class
- }
-
- private static <C, S> Traversal<C, S, S> start() {
- return new CommonTraversal<>();
- }
-
- public static <C, S> Traversal<C, S, S> c(final C coefficient) {
- return __.<C, S>start().c(coefficient);
- }
-
- public static <C, S, E> Traversal<C, S, E> choose(final Traversal<C, S, ?> predicate, final Traversal<C, S, E> trueTraversal, final Traversal<C, S, E> falseTraversal) {
- return __.<C, S>start().choose(predicate, trueTraversal, falseTraversal);
- }
-
- public static <C, S, E> Traversal<C, S, E> choose(final Traversal<C, S, ?> predicate, final Traversal<C, S, E> trueTraversal) {
- return __.<C, S>start().choose(predicate, trueTraversal);
- }
-
- public static <C, S> Traversal<C, ?, S> constant(final S constant) {
- return __.<C, S>start().constant(constant);
- }
-
- public static <C, S, E> Traversal<C, S, E> flatMap(final Traversal<C, S, E> traversal) {
- return __.<C, S>start().flatMap(traversal);
- }
-
- public static <C, S> Traversal<C, S, S> identity() {
- return __.<C, S>start().identity();
- }
-
- public static <C> Traversal<C, Long, Long> incr() {
- return __.<C, Long>start().incr();
- }
-
- public static <C, S> Traversal<C, S, S> is(final S object) {
- return __.<C, S>start().is(object);
- }
-
- public static <C, S> Traversal<C, S, S> is(final P<S> predicate) {
- return __.<C, S>start().is(predicate);
- }
-
- public static <C, S> Traversal<C, S, S> is(final Traversal<C, S, S> objectTraversal) {
- return __.<C, S>start().is(objectTraversal);
- }
-
- public static <C, S> Traversal<C, S, Integer> loops() {
- return __.<C, S>start().loops();
- }
-
- public static <C, S, E> Traversal<C, S, E> map(final Traversal<C, S, E> traversal) {
- return __.<C, S>start().map(traversal);
- }
-
- public static <C, S extends Number> Traversal<C, S, S> sum() {
- return __.<C, S>start().sum();
- }
-
- public static <C, S> Traversal<C, S, Long> count() {
- return __.<C, S>start().count();
- }
-
- public static <C, S, E> Traversal<C, S, E> union(final Traversal<C, S, E>... traversals) {
- return __.<C, S>start().union(traversals);
- }
-}
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 1b7d9e1d25..111613c820 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
@@ -22,21 +22,16 @@ import org.apache.tinkerpop.language.gremlin.AbstractTraversal;
import org.apache.tinkerpop.language.gremlin.P;
import org.apache.tinkerpop.language.gremlin.Traversal;
import org.apache.tinkerpop.language.gremlin.TraversalUtil;
-import org.apache.tinkerpop.language.gremlin.common.__;
import org.apache.tinkerpop.machine.Machine;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CommonCompiler;
import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
-import org.apache.tinkerpop.machine.bytecode.compiler.Oper;
import org.apache.tinkerpop.machine.bytecode.compiler.Order;
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.data.TMap;
+import org.apache.tinkerpop.machine.structure.TTuple;
import org.apache.tinkerpop.machine.traverser.path.Path;
-import java.util.Map;
-
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -83,7 +78,7 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
@Override
public Traversal<C, S, E> by(final Traversal<C, ?, ?> byTraversal, final Order order) {
- this.bytecode.addArgs(TraversalUtil.getBytecode(byTraversal), order);
+ this.bytecode.addArgs(TraversalUtil.getBytecode(byTraversal), order.name());
return this;
}
@@ -105,13 +100,12 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
@Override
public <R> Traversal<C, S, R> constant(final R constant) {
- return this.addInstruction(Symbols.MAP, constant);
+ return this.addInstruction(Symbols.CONSTANT, constant);
}
@Override
public Traversal<C, S, Long> count() {
- this.addInstruction(Symbols.MAP, "traverser::count");
- return this.addInstruction(Symbols.REDUCE, Oper.sum.name(), 0L);
+ return this.addInstruction(Symbols.COUNT);
}
@Override
@@ -136,102 +130,77 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
@Override
public <R> Traversal<C, S, R> flatMap(final Traversal<C, E, R> flatMapTraversal) {
- return this.addInstruction(CommonCompiler.Symbols.FLATMAP, TraversalUtil.getBytecode(flatMapTraversal));
+ return this.addInstruction(Symbols.FLATMAP, TraversalUtil.getBytecode(flatMapTraversal));
}
@Override
- public Traversal<C, S, TMap<E, Long>> groupCount() {
+ public Traversal<C, S, TTuple<E, Long>> groupCount() {
return this.addInstruction(Symbols.GROUP_COUNT);
}
@Override
- public <K, V> Traversal<C, S, TMap<K, V>> hasKey(final P<K> predicate) {
- final Bytecode<C> internal = new Bytecode<>();
- internal.addInstruction(this.currentCoefficient, Symbols.FLATMAP, "dictionary::keys");
- internal.addInstruction(this.currentCoefficient, Symbols.FILTER, predicate.type().name(), TraversalUtil.tryToGetBytecode(predicate.object()));
- return this.addInstruction(Symbols.FILTER, internal);
+ public <K, V> Traversal<C, S, TTuple<K, V>> has(final K key, final V value) {
+ return this.addInstruction(Symbols.HAS_KEY_VALUE, TraversalUtil.tryToGetBytecode(key), TraversalUtil.tryToGetBytecode(value));
}
@Override
- public <K, V> Traversal<C, S, TMap<K, V>> hasKey(final K key) {
- final Bytecode<C> internal = new Bytecode<>();
- internal.addInstruction(this.currentCoefficient, Symbols.FLATMAP, "dictionary::keys");
- internal.addInstruction(this.currentCoefficient, Symbols.FILTER, Pred.eq.name(), key);
- return this.addInstruction(Symbols.FILTER, internal);
+ public <K, V> Traversal<C, S, TTuple<K, V>> has(final Traversal<C, TTuple<K, V>, K> keyTraversal, final V value) {
+ return this.addInstruction(Symbols.HAS_KEY_VALUE, TraversalUtil.getBytecode(keyTraversal), TraversalUtil.tryToGetBytecode(value));
}
@Override
- public <K, V> Traversal<C, S, TMap<K, V>> hasKey(final Traversal<C, TMap<K, V>, K> keyTraversal) {
- final Bytecode<C> internal = new Bytecode<>();
- internal.addInstruction(this.currentCoefficient, Symbols.FLATMAP, "dictionary::keys");
- internal.addInstruction(this.currentCoefficient, Symbols.FILTER, Pred.eq.name(), TraversalUtil.getBytecode(keyTraversal));
- return this.addInstruction(Symbols.FILTER, internal);
+ public <K, V> Traversal<C, S, TTuple<K, V>> has(final K key, final Traversal<C, TTuple<K, V>, V> valueTraversal) {
+ return this.addInstruction(Symbols.HAS_KEY_VALUE, TraversalUtil.tryToGetBytecode(key), TraversalUtil.getBytecode(valueTraversal));
}
@Override
- public <K, V> Traversal<C, S, TMap<K, V>> has(final K key, final V value) {
- final Bytecode<C> internal = new Bytecode<>();
- internal.addInstruction(this.currentCoefficient, Symbols.MAP, "dictionary::get", TraversalUtil.tryToGetBytecode(key));
- internal.addInstruction(this.currentCoefficient, Symbols.FILTER, Pred.eq.name(), value);
- return this.addInstruction(Symbols.FILTER, internal);
+ public <K, V> Traversal<C, S, TTuple<K, V>> has(final Traversal<C, TTuple<K, V>, K> keyTraversal, final Traversal<C, TTuple<K, V>, V> valueTraversal) {
+ return this.addInstruction(Symbols.HAS_KEY_VALUE, TraversalUtil.getBytecode(keyTraversal), TraversalUtil.getBytecode(valueTraversal));
}
@Override
- public <K, V> Traversal<C, S, TMap<K, V>> has(final Traversal<C, TMap<K, V>, K> keyTraversal, final V value) {
- final Bytecode<C> internal = new Bytecode<>();
- internal.addInstruction(this.currentCoefficient, Symbols.MAP, "dictionary::get", TraversalUtil.getBytecode(keyTraversal));
- internal.addInstruction(this.currentCoefficient, Symbols.FILTER, Pred.eq.name(), value);
- return this.addInstruction(Symbols.FILTER, internal);
+ public <K, V> Traversal<C, S, TTuple<K, V>> hasKey(final P<K> predicate) {
+ return this.addInstruction(Symbols.HAS_KEY, predicate.type().name(), TraversalUtil.tryToGetBytecode(predicate.object()));
}
@Override
- public <K, V> Traversal<C, S, TMap<K, V>> has(final K key, final Traversal<C, TMap<K, V>, V> valueTraversal) {
- final Bytecode<C> internal = new Bytecode<>();
- internal.addInstruction(this.currentCoefficient, Symbols.MAP, "dictionary::get", key);
- internal.addInstruction(this.currentCoefficient, Symbols.FILTER, Pred.eq.name(), TraversalUtil.getBytecode(valueTraversal));
- return this.addInstruction(Symbols.FILTER, internal);
+ public <K, V> Traversal<C, S, TTuple<K, V>> hasKey(final K key) {
+ return this.addInstruction(Symbols.HAS_KEY, TraversalUtil.tryToGetBytecode(key));
}
@Override
- public <K, V> Traversal<C, S, TMap<K, V>> has(final Traversal<C, TMap<K, V>, K> keyTraversal, final Traversal<C, TMap<K, V>, V> valueTraversal) {
- final Bytecode<C> internal = new Bytecode<>();
- internal.addInstruction(this.currentCoefficient, Symbols.MAP, "dictionary::get", TraversalUtil.getBytecode(keyTraversal));
- internal.addInstruction(this.currentCoefficient, Symbols.FILTER, Pred.eq.name(), TraversalUtil.getBytecode(valueTraversal));
- return this.addInstruction(Symbols.FILTER, internal);
+ public <K, V> Traversal<C, S, TTuple<K, V>> hasKey(final Traversal<C, TTuple<K, V>, K> keyTraversal) {
+ return this.addInstruction(Symbols.HAS_KEY, TraversalUtil.getBytecode(keyTraversal));
}
@Override
public Traversal<C, S, E> identity() {
- return this.addInstruction(Symbols.MAP, "traverser::object");
+ return this.addInstruction(Symbols.IDENTITY);
}
@Override
public Traversal<C, S, E> is(final E object) {
- return this.addInstruction(Symbols.FILTER, Pred.eq.name(), TraversalUtil.tryToGetBytecode(object));
+ return this.addInstruction(Symbols.IS, Pred.eq.name(), TraversalUtil.tryToGetBytecode(object));
}
@Override
public Traversal<C, S, E> is(final Traversal<C, E, ?> objectTraversal) {
- return this.addInstruction(Symbols.FILTER, Pred.eq.name(), TraversalUtil.getBytecode(objectTraversal));
+ return this.addInstruction(Symbols.IS, Pred.eq.name(), TraversalUtil.getBytecode(objectTraversal));
}
@Override
public Traversal<C, S, E> is(final P<E> predicate) {
- return this.addInstruction(Symbols.FILTER, predicate.type().name(), TraversalUtil.tryToGetBytecode(predicate.object()));
+ return this.addInstruction(Symbols.IS, predicate.type().name(), TraversalUtil.tryToGetBytecode(predicate.object()));
}
@Override
public Traversal<C, S, Long> incr() {
- return this.addInstruction(Symbols.MAP, "number::add", 1L);
- }
-
- public <K, V> Traversal<C, S, Map<K, V>> join(final Symbols.Tokens joinType, final CoreTraversal<?, ?, Map<K, V>> joinTraversal) {
- return this.addInstruction(Symbols.JOIN, joinType, joinTraversal.bytecode);
+ return this.addInstruction(Symbols.INCR);
}
@Override
public Traversal<C, S, Integer> loops() {
- return this.addInstruction(Symbols.MAP, "traverser:loops");
+ return this.addInstruction(Symbols.LOOPS);
}
@Override
@@ -241,7 +210,7 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
@Override
public Traversal<C, S, E> order() {
- throw new IllegalStateException("Unimplemented");
+ return this.addInstruction(Symbols.ORDER);
}
@Override
@@ -256,7 +225,7 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
@Override
public <R extends Number> Traversal<C, S, R> sum() {
- return this.addInstruction(Symbols.REDUCE, Oper.sum.name(), 0);
+ return this.addInstruction(Symbols.SUM);
}
@Override
@@ -266,7 +235,7 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
@Override
public <R> Traversal<C, S, R> unfold() {
- return this.addInstruction(Symbols.FLATMAP, "traverser::object");
+ return this.addInstruction(Symbols.UNFOLD);
}
@Override
@@ -281,6 +250,11 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
@Override
public <K, V> Traversal<C, S, V> value(final K key) {
- return this.addInstruction(Symbols.MAP, "dictionary::get", key);
+ return this.addInstruction(Symbols.VALUE, key);
+ }
+
+ @Override
+ public <K, V> Traversal<C, S, V> values(final K key) {
+ return this.addInstruction(Symbols.VALUES, key);
}
}
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 24a9af4cf8..72f13a1039 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
@@ -18,6 +18,7 @@
*/
package org.apache.tinkerpop.language.gremlin.core;
+import org.apache.tinkerpop.language.gremlin.P;
import org.apache.tinkerpop.language.gremlin.Traversal;
/**
@@ -37,10 +38,26 @@ public class __ {
return __.<C, S>start().c(coefficient);
}
+ public static <C, S, E> Traversal<C, S, E> choose(final Traversal<C, S, ?> predicate, final Traversal<C, S, E> trueTraversal, final Traversal<C, S, E> falseTraversal) {
+ return __.<C, S>start().choose(predicate, trueTraversal, falseTraversal);
+ }
+
+ public static <C, S, E> Traversal<C, S, E> choose(final Traversal<C, S, ?> predicate, final Traversal<C, S, E> trueTraversal) {
+ return __.<C, S>start().choose(predicate, trueTraversal);
+ }
+
public static <C, S> Traversal<C, ?, S> constant(final S constant) {
return __.<C, S>start().constant(constant);
}
+ public static <C, S, E> Traversal<C, S, E> flatMap(final Traversal<C, S, E> traversal) {
+ return __.<C, S>start().flatMap(traversal);
+ }
+
+ public static <C, S> Traversal<C, S, S> identity() {
+ return __.<C, S>start().identity();
+ }
+
public static <C> Traversal<C, Long, Long> incr() {
return __.<C, Long>start().incr();
}
@@ -49,6 +66,10 @@ public class __ {
return __.<C, S>start().is(object);
}
+ public static <C, S> Traversal<C, S, S> is(final P<S> predicate) {
+ return __.<C, S>start().is(predicate);
+ }
+
public static <C, S> Traversal<C, S, S> is(final Traversal<C, S, S> objectTraversal) {
return __.<C, S>start().is(objectTraversal);
}
@@ -57,6 +78,10 @@ public class __ {
return __.<C, S>start().loops();
}
+ public static <C, S, E> Traversal<C, S, E> map(final Traversal<C, S, E> traversal) {
+ return __.<C, S>start().map(traversal);
+ }
+
public static <C, S extends Number> Traversal<C, S, S> sum() {
return __.<C, S>start().sum();
}
@@ -64,4 +89,8 @@ public class __ {
public static <C, S> Traversal<C, S, Long> count() {
return __.<C, S>start().count();
}
+
+ public static <C, S, E> Traversal<C, S, E> union(final Traversal<C, S, E>... traversals) {
+ return __.<C, S>start().union(traversals);
+ }
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java
index 1e2ab57fe7..c4ea488171 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java
@@ -19,7 +19,6 @@
package org.apache.tinkerpop.machine.bytecode;
import org.apache.tinkerpop.machine.bytecode.compiler.BytecodeCompiler;
-import org.apache.tinkerpop.machine.bytecode.compiler.CommonCompiler;
import org.apache.tinkerpop.machine.bytecode.compiler.CompositeCompiler;
import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
@@ -71,12 +70,10 @@ public final class BytecodeUtil {
for (final SourceInstruction sourceInstruction : bytecode.getSourceInstructions()) {
if (sourceInstruction.op().equals(Symbols.WITH_STRATEGY)) {
strategies.add(((Class<? extends Strategy>) sourceInstruction.args()[0]).getConstructor().newInstance());
- } else if (sourceInstruction.op().equals(Symbols.WITH_PROCESSOR)) {
- strategies.addAll(ProcessorFactory.processorStrategies(((Class<? extends ProcessorFactory>) sourceInstruction.args()[0])));
- } else if (sourceInstruction.op().equals(Symbols.WITH_STRUCTURE)) {
- strategies.addAll(StructureFactory.structureStrategies(((Class<? extends StructureFactory>) sourceInstruction.args()[0])));
}
}
+ BytecodeUtil.getStructureFactory(bytecode).ifPresent(s -> strategies.addAll(s.getStrategies()));
+ BytecodeUtil.getProcessorFactory(bytecode).ifPresent(s -> strategies.addAll(s.getStrategies()));
return StrategyUtil.sortStrategies(strategies);
} catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
@@ -88,7 +85,7 @@ public final class BytecodeUtil {
final List<BytecodeCompiler> compilers = new ArrayList<>();
BytecodeUtil.getProcessorFactory(bytecode).ifPresent(f -> compilers.addAll(f.getCompilers()));
BytecodeUtil.getStructureFactory(bytecode).ifPresent(f -> compilers.addAll(f.getCompilers()));
- return CompositeCompiler.create(compilers.isEmpty() ? List.of(CoreCompiler.instance(), CommonCompiler.instance()) : compilers);
+ return CompositeCompiler.create(compilers.isEmpty() ? List.of(CoreCompiler.instance()) : compilers);
}
public static <C> Optional<Coefficient<C>> getCoefficient(final Bytecode<C> bytecode) {
@@ -111,9 +108,9 @@ public final class BytecodeUtil {
ProcessorFactory processor = null;
for (final SourceInstruction sourceInstruction : bytecode.getSourceInstructions()) {
if (sourceInstruction.op().equals(Symbols.WITH_PROCESSOR)) {
- processor = 1 == sourceInstruction.args().length ?
- ((Class<? extends ProcessorFactory>) sourceInstruction.args()[0]).getConstructor().newInstance() :
- ((Class<? extends ProcessorFactory>) sourceInstruction.args()[0]).getConstructor(Map.class).newInstance((Map) sourceInstruction.args()[1]);
+ processor = ((Class<? extends ProcessorFactory>) sourceInstruction.args()[0]).
+ getConstructor(Map.class).
+ newInstance(1 == sourceInstruction.args().length ? Map.of() : (Map) sourceInstruction.args()[1]);
}
}
return Optional.ofNullable(processor);
@@ -127,7 +124,9 @@ public final class BytecodeUtil {
StructureFactory structure = null;
for (final SourceInstruction sourceInstruction : bytecode.getSourceInstructions()) {
if (sourceInstruction.op().equals(Symbols.WITH_STRUCTURE)) {
- structure = ((Class<? extends StructureFactory>) sourceInstruction.args()[0]).getConstructor().newInstance();
+ structure = ((Class<? extends StructureFactory>) sourceInstruction.args()[0]).
+ getConstructor(Map.class).
+ newInstance(1 == sourceInstruction.args().length ? Map.of() : (Map) sourceInstruction.args()[1]);
}
}
return Optional.ofNullable(structure);
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CommonCompiler.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CommonCompiler.java
deleted file mode 100644
index bf86873c0b..0000000000
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CommonCompiler.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.machine.bytecode.compiler;
-
-import org.apache.tinkerpop.machine.bytecode.Instruction;
-import org.apache.tinkerpop.machine.function.CFunction;
-import org.apache.tinkerpop.machine.function.barrier.JoinBarrier;
-import org.apache.tinkerpop.machine.function.barrier.OrderBarrier;
-import org.apache.tinkerpop.machine.function.barrier.StallBarrier;
-import org.apache.tinkerpop.machine.function.branch.BranchBranch;
-import org.apache.tinkerpop.machine.function.branch.RepeatBranch;
-import org.apache.tinkerpop.machine.function.filter.FilterFilter;
-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.FlatMapFlatMap;
-import org.apache.tinkerpop.machine.function.flatmap.UnfoldFlatMap;
-import org.apache.tinkerpop.machine.function.initial.InitialInitial;
-import org.apache.tinkerpop.machine.function.map.ConstantMap;
-import org.apache.tinkerpop.machine.function.map.IncrMap;
-import org.apache.tinkerpop.machine.function.map.LoopsMap;
-import org.apache.tinkerpop.machine.function.map.MapMap;
-import org.apache.tinkerpop.machine.function.map.PathMap;
-import org.apache.tinkerpop.machine.function.map.ValueMap;
-import org.apache.tinkerpop.machine.function.reduce.CountReduce;
-import org.apache.tinkerpop.machine.function.reduce.GroupCountReduce;
-import org.apache.tinkerpop.machine.function.reduce.ReduceReduce;
-import org.apache.tinkerpop.machine.function.reduce.SumReduce;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class CommonCompiler implements BytecodeCompiler {
-
- private static final CommonCompiler INSTANCE = new CommonCompiler();
-
- private CommonCompiler() {
- // static instance
- }
-
- public static CommonCompiler instance() {
- return INSTANCE;
- }
-
- private static final Map<String, FunctionType> OP_TYPES = new HashMap<>() {{
- put(Symbols.BARRIER, FunctionType.BARRIER);
- put(Symbols.BRANCH, FunctionType.BRANCH);
- put(Symbols.CONSTANT, FunctionType.MAP);
- put(Symbols.COUNT, FunctionType.REDUCE);
- put(Symbols.FILTER, FunctionType.FILTER);
- put(Symbols.FLATMAP, FunctionType.FLATMAP);
- put(Symbols.GROUP_COUNT, FunctionType.REDUCE);
- put(Symbols.HAS_KEY, FunctionType.FILTER);
- put(Symbols.HAS_KEY_VALUE, FunctionType.FILTER);
- put(Symbols.IDENTITY, FunctionType.FILTER);
- put(Symbols.INCR, FunctionType.MAP);
- put(Symbols.INITIAL, FunctionType.INITIAL);
- put(Symbols.IS, FunctionType.FILTER);
- put(Symbols.JOIN, FunctionType.BARRIER);
- put(Symbols.LOOPS, FunctionType.MAP);
- put(Symbols.MAP, FunctionType.MAP);
- put(Symbols.ORDER, FunctionType.BARRIER);
- put(Symbols.PATH, FunctionType.MAP);
- put(Symbols.REDUCE, FunctionType.REDUCE);
- put(Symbols.REPEAT, FunctionType.BRANCH);
- put(Symbols.SUM, FunctionType.REDUCE);
- put(Symbols.UNFOLD, FunctionType.FLATMAP);
- put(Symbols.V, FunctionType.FLATMAP);
- put(Symbols.VALUE, FunctionType.MAP);
- }};
-
- @Override
- public <C> CFunction<C> compile(final Instruction<C> instruction) {
- switch (instruction.op()) {
- case Symbols.BARRIER:
- return StallBarrier.compile(instruction);
- case Symbols.BRANCH:
- return BranchBranch.compile(instruction);
- case Symbols.CONSTANT:
- return ConstantMap.compile(instruction);
- case Symbols.COUNT:
- return CountReduce.compile(instruction);
- case Symbols.FILTER:
- return FilterFilter.compile(instruction);
- case Symbols.FLATMAP:
- return FlatMapFlatMap.compile(instruction);
- case Symbols.GROUP_COUNT:
- return GroupCountReduce.compile(instruction);
- case Symbols.HAS_KEY:
- return HasKeyFilter.compile(instruction);
- case Symbols.HAS_KEY_VALUE:
- return HasKeyValueFilter.compile(instruction);
- case Symbols.IDENTITY:
- return IdentityFilter.compile(instruction);
- case Symbols.INCR:
- return IncrMap.compile(instruction);
- case Symbols.INITIAL:
- return InitialInitial.compile(instruction);
- case Symbols.IS:
- return IsFilter.compile(instruction);
- case Symbols.JOIN:
- return JoinBarrier.compile(instruction);
- case Symbols.LOOPS:
- return LoopsMap.compile(instruction);
- case Symbols.MAP:
- return MapMap.compile(instruction);
- case Symbols.ORDER:
- return OrderBarrier.compile(instruction);
- case Symbols.PATH:
- return PathMap.compile(instruction);
- case Symbols.REDUCE:
- return ReduceReduce.compile(instruction);
- case Symbols.REPEAT:
- return RepeatBranch.compile(instruction);
- case Symbols.SUM:
- return SumReduce.compile(instruction);
- case Symbols.UNFOLD:
- return UnfoldFlatMap.compile(instruction);
- case Symbols.VALUE:
- return ValueMap.compile(instruction);
- default:
- return null;
- }
- }
-
- @Override
- public FunctionType getFunctionType(final String op) {
- return OP_TYPES.get(op);
- }
-
- public static final class Symbols {
-
- private Symbols() {
- // static instance
- }
-
- public static enum Tokens {
- inner, left, right, full
- }
-
- // SOURCE OPS
- public static final String WITH_COEFFICIENT = "withCoefficient";
- public static final String WITH_PROCESSOR = "withProcessor";
- public static final String WITH_STRUCTURE = "withStructure";
- public static final String WITH_STRATEGY = "withStrategy";
-
-
- // ARGUMENT TOKENS
- public static final String EQ = "eq";
- public static final String NEQ = "neq";
- public static final String LT = "lt";
- public static final String GT = "gt";
- public static final String LTE = "lte";
- public static final String GTE = "gte";
- public static final String REGEX = "regex";
-
- // BRANCH TOKENS
- public static final String DEFAULT = "default";
-
- // INSTRUCTION OPS
- public static final String BARRIER = "barrier";
- public static final String BRANCH = "branch";
- public static final String CONSTANT = "constant";
- public static final String COUNT = "count";
- public static final String EXPLAIN = "explain";
- public static final String FILTER = "filter";
- public static final String FLATMAP = "flatmap";
- public static final String GROUP_COUNT = "groupCount";
- public static final String HAS_KEY = "hasKey";
- public static final String HAS_KEY_VALUE = "hasKeyValue";
- public static final String IDENTITY = "identity";
- public static final String INCR = "incr";
- public static final String INITIAL = "initial";
- public static final String IS = "is";
- public static final String JOIN = "join";
- public static final String LOOPS = "loops";
- public static final String MAP = "map";
- public static final String ORDER = "order";
- public static final String PATH = "path";
- public static final String REDUCE = "reduce";
- public static final String REPEAT = "repeat";
- public static final String SUM = "sum";
- public static final String UNFOLD = "unfold";
- public static final String V = "V";
- public static final String VALUE = "value";
- }
-}
\ No newline at end of file
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 0ce8a91ff3..d7f29049f2 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
@@ -21,16 +21,30 @@ package org.apache.tinkerpop.machine.bytecode.compiler;
import org.apache.tinkerpop.machine.bytecode.Instruction;
import org.apache.tinkerpop.machine.function.CFunction;
import org.apache.tinkerpop.machine.function.barrier.JoinBarrier;
+import org.apache.tinkerpop.machine.function.barrier.OrderBarrier;
import org.apache.tinkerpop.machine.function.barrier.StallBarrier;
import org.apache.tinkerpop.machine.function.branch.BranchBranch;
import org.apache.tinkerpop.machine.function.branch.RepeatBranch;
import org.apache.tinkerpop.machine.function.filter.FilterFilter;
+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.FlatMapFlatMap;
+import org.apache.tinkerpop.machine.function.flatmap.UnfoldFlatMap;
+import org.apache.tinkerpop.machine.function.flatmap.ValuesFlatMap;
+import org.apache.tinkerpop.machine.function.initial.DbInitial;
import org.apache.tinkerpop.machine.function.initial.InitialInitial;
+import org.apache.tinkerpop.machine.function.map.ConstantMap;
+import org.apache.tinkerpop.machine.function.map.IncrMap;
+import org.apache.tinkerpop.machine.function.map.LoopsMap;
import org.apache.tinkerpop.machine.function.map.MapMap;
import org.apache.tinkerpop.machine.function.map.PathMap;
+import org.apache.tinkerpop.machine.function.map.ValueMap;
+import org.apache.tinkerpop.machine.function.reduce.CountReduce;
import org.apache.tinkerpop.machine.function.reduce.GroupCountReduce;
import org.apache.tinkerpop.machine.function.reduce.ReduceReduce;
+import org.apache.tinkerpop.machine.function.reduce.SumReduce;
import java.util.HashMap;
import java.util.Map;
@@ -53,16 +67,32 @@ public final class CoreCompiler implements BytecodeCompiler {
private static final Map<String, FunctionType> OP_TYPES = new HashMap<>() {{
put(Symbols.BARRIER, FunctionType.BARRIER);
put(Symbols.BRANCH, FunctionType.BRANCH);
+ put(Symbols.CONSTANT, FunctionType.MAP);
+ put(Symbols.COUNT, FunctionType.REDUCE);
put(Symbols.FILTER, FunctionType.FILTER);
put(Symbols.FLATMAP, FunctionType.FLATMAP);
put(Symbols.GROUP_COUNT, FunctionType.REDUCE);
+ put(Symbols.HAS_KEY, FunctionType.FILTER);
+ put(Symbols.HAS_KEY_VALUE, FunctionType.FILTER);
+ put(Symbols.IDENTITY, FunctionType.FILTER);
+ put(Symbols.INCR, FunctionType.MAP);
put(Symbols.INITIAL, FunctionType.INITIAL);
+ put(Symbols.IS, FunctionType.FILTER);
put(Symbols.JOIN, FunctionType.BARRIER);
+ put(Symbols.LOOPS, FunctionType.MAP);
put(Symbols.MAP, FunctionType.MAP);
+ put(Symbols.ORDER, FunctionType.BARRIER);
put(Symbols.PATH, FunctionType.MAP);
put(Symbols.REDUCE, FunctionType.REDUCE);
put(Symbols.REPEAT, FunctionType.BRANCH);
+ put(Symbols.SUM, FunctionType.REDUCE);
+ put(Symbols.UNFOLD, FunctionType.FLATMAP);
put(Symbols.V, FunctionType.FLATMAP);
+ put(Symbols.VALUE, FunctionType.MAP);
+ put(Symbols.VALUES, FunctionType.FLATMAP);
+
+ //
+ put(Symbols.DB, FunctionType.FLATMAP);
}};
@Override
@@ -72,24 +102,52 @@ public final class CoreCompiler implements BytecodeCompiler {
return StallBarrier.compile(instruction);
case Symbols.BRANCH:
return BranchBranch.compile(instruction);
+ case Symbols.CONSTANT:
+ return ConstantMap.compile(instruction);
+ case Symbols.COUNT:
+ return CountReduce.compile(instruction);
case Symbols.FILTER:
return FilterFilter.compile(instruction);
case Symbols.FLATMAP:
return FlatMapFlatMap.compile(instruction);
case Symbols.GROUP_COUNT:
return GroupCountReduce.compile(instruction);
+ case Symbols.HAS_KEY:
+ return HasKeyFilter.compile(instruction);
+ case Symbols.HAS_KEY_VALUE:
+ return HasKeyValueFilter.compile(instruction);
+ case Symbols.IDENTITY:
+ return IdentityFilter.compile(instruction);
+ case Symbols.INCR:
+ return IncrMap.compile(instruction);
case Symbols.INITIAL:
return InitialInitial.compile(instruction);
+ case Symbols.IS:
+ return IsFilter.compile(instruction);
case Symbols.JOIN:
return JoinBarrier.compile(instruction);
+ case Symbols.LOOPS:
+ return LoopsMap.compile(instruction);
case Symbols.MAP:
return MapMap.compile(instruction);
+ case Symbols.ORDER:
+ return OrderBarrier.compile(instruction);
case Symbols.PATH:
return PathMap.compile(instruction);
case Symbols.REDUCE:
return ReduceReduce.compile(instruction);
case Symbols.REPEAT:
return RepeatBranch.compile(instruction);
+ case Symbols.SUM:
+ return SumReduce.compile(instruction);
+ case Symbols.UNFOLD:
+ return UnfoldFlatMap.compile(instruction);
+ case Symbols.VALUE:
+ return ValueMap.compile(instruction);
+ case Symbols.VALUES:
+ return ValuesFlatMap.compile(instruction);
+ case Symbols.DB:
+ return DbInitial.compile(instruction);
default:
return null;
}
@@ -112,7 +170,6 @@ public final class CoreCompiler implements BytecodeCompiler {
// SOURCE OPS
public static final String WITH_COEFFICIENT = "withCoefficient";
- public static final String WITH_MACHINE = "withMachine";
public static final String WITH_PROCESSOR = "withProcessor";
public static final String WITH_STRUCTURE = "withStructure";
public static final String WITH_STRATEGY = "withStrategy";
@@ -133,23 +190,32 @@ public final class CoreCompiler implements BytecodeCompiler {
// INSTRUCTION OPS
public static final String BARRIER = "barrier";
public static final String BRANCH = "branch";
+ public static final String CONSTANT = "constant";
+ public static final String COUNT = "count";
public static final String EXPLAIN = "explain";
- // [filter, [bc]]
public static final String FILTER = "filter";
public static final String FLATMAP = "flatmap";
- // [groupCount, ?[bc]]
public static final String GROUP_COUNT = "groupCount";
- // [incr]
+ public static final String HAS_KEY = "hasKey";
+ public static final String HAS_KEY_VALUE = "hasKeyValue";
+ public static final String IDENTITY = "identity";
+ public static final String INCR = "incr";
public static final String INITIAL = "initial";
+ public static final String IS = "is";
public static final String JOIN = "join";
- // [map, [bc]]
+ public static final String LOOPS = "loops";
public static final String MAP = "map";
+ public static final String ORDER = "order";
public static final String PATH = "path";
public static final String REDUCE = "reduce";
- // [repeat, (char, [bc]), ?(char, [bc]), ?(char, [bc])]
public static final String REPEAT = "repeat";
- // [V]
+ public static final String SUM = "sum";
+ public static final String UNFOLD = "unfold";
public static final String V = "V";
+ public static final String VALUE = "value";
+ public static final String VALUES = "values";
+ //
+ public static final String DB = "db";
}
-}
+}
\ No newline at end of file
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java
index f399f2eb60..c2aef2628c 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.machine.bytecode.compiler;
-import org.apache.tinkerpop.machine.structure.data.TElement;
+import org.apache.tinkerpop.machine.structure.TTuple;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.util.IteratorUtils;
import org.apache.tinkerpop.machine.util.NumberHelper;
@@ -52,9 +52,7 @@ public class MethodArgument<E> implements Argument<E> {
else if (this.method.equals("keys"))
return (E) ((Map) traverser.object()).keySet();
else if (this.method.equals("get"))
- return (E) (traverser.object() instanceof Map ?
- ((Map) traverser.object()).get(this.arguments[0].mapArg(traverser)) :
- ((TElement) traverser.object()).get(this.arguments[0].mapArg(traverser)));
+ return (E) ((TTuple) traverser.object()).value(this.arguments[0].mapArg(traverser));
else if (this.method.equals("add"))
return (E) NumberHelper.add((Number) traverser.object(), (Number) this.arguments[0].mapArg(traverser));
else
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/JoinBarrier.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/JoinBarrier.java
index 85c8dcfeba..1cfdca5ef7 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/JoinBarrier.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/JoinBarrier.java
@@ -20,8 +20,8 @@ package org.apache.tinkerpop.machine.function.barrier;
import org.apache.tinkerpop.machine.bytecode.Instruction;
import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
import org.apache.tinkerpop.machine.function.BarrierFunction;
@@ -39,12 +39,12 @@ import java.util.Map;
*/
public final class JoinBarrier<C, K, V> extends AbstractFunction<C> implements BarrierFunction<C, Map<K, V>, Map<K, V>, List<Map<K, V>>> {
- private final CoreCompiler.Symbols.Tokens joinType;
+ private final Symbols.Tokens joinType;
private final Compilation<C, Map<K, V>, Map<K, V>> joinCompilation;
private final Argument<K> joinKey;
private JoinBarrier(final Coefficient<C> coefficient, final String label,
- CoreCompiler.Symbols.Tokens joinType,
+ Symbols.Tokens joinType,
final Compilation<C, Map<K, V>, Map<K, V>> joinCompilation,
final Argument<K> joinKey) {
super(coefficient, label);
@@ -99,7 +99,7 @@ public final class JoinBarrier<C, K, V> extends AbstractFunction<C> implements B
public static <C, K, V> JoinBarrier<C, K, V> compile(final Instruction<C> instruction) {
return new JoinBarrier<>(instruction.coefficient(), instruction.label(),
- CoreCompiler.Symbols.Tokens.valueOf((String) instruction.args()[0]),
+ Symbols.Tokens.valueOf((String) instruction.args()[0]),
Compilation.compile(instruction.args()[1]),
Argument.create(instruction.args()[2]));
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/BranchBranch.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/BranchBranch.java
index b548b8c2f8..fd9ff100df 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/BranchBranch.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/BranchBranch.java
@@ -19,8 +19,8 @@
package org.apache.tinkerpop.machine.function.branch;
import org.apache.tinkerpop.machine.bytecode.Instruction;
-import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
+import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
import org.apache.tinkerpop.machine.function.BranchFunction;
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 81b1fbe376..835bf4d7ba 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,16 +24,15 @@ 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.data.TMap;
+import org.apache.tinkerpop.machine.structure.util.T2Tuple;
+import org.apache.tinkerpop.machine.structure.TTuple;
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)
*/
-public final class HasKeyFilter<C, K, V> extends AbstractFunction<C> implements FilterFunction<C, TMap<K, V>> {
+public final class HasKeyFilter<C, K, V> extends AbstractFunction<C> implements FilterFunction<C, TTuple<K, V>> {
private final Pred predicate;
private Argument<K> key;
@@ -45,15 +44,14 @@ public final class HasKeyFilter<C, K, V> extends AbstractFunction<C> implements
}
@Override
- public boolean test(final Traverser<C, TMap<K, V>> traverser) {
- final TMap<K, V> object = traverser.object();
+ public boolean test(final Traverser<C, TTuple<K, V>> traverser) {
+ final TTuple<K, V> object = traverser.object();
if (Pred.eq == this.predicate)
return object.has(this.key.mapArg(traverser));
else {
final K testKey = this.key.mapArg(traverser);
- final Iterator<K> keys = traverser.object().keys();
- while (keys.hasNext()) {
- if (this.predicate.test(keys.next(), testKey))
+ for (final T2Tuple<K, V> entry : traverser.object().entries()) {
+ if (this.predicate.test(entry.key(), testKey))
return true;
}
return false;
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyValueFilter.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyValueFilter.java
index bfbd541b89..f08f736bfc 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyValueFilter.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/filter/HasKeyValueFilter.java
@@ -23,14 +23,14 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
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.data.TMap;
+import org.apache.tinkerpop.machine.structure.TTuple;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.util.StringFactory;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class HasKeyValueFilter<C, K, V> extends AbstractFunction<C> implements FilterFunction<C, TMap<K, V>> {
+public final class HasKeyValueFilter<C, K, V> extends AbstractFunction<C> implements FilterFunction<C, TTuple<K, V>> {
private Argument<K> key;
private Argument<V> value;
@@ -42,9 +42,9 @@ public final class HasKeyValueFilter<C, K, V> extends AbstractFunction<C> implem
}
@Override
- public boolean test(final Traverser<C, TMap<K, V>> traverser) {
- final TMap<K, V> object = traverser.object();
- return this.value.mapArg(traverser).equals(object.get(this.key.mapArg(traverser)));
+ public boolean test(final Traverser<C, TTuple<K, V>> traverser) {
+ final TTuple<K, V> object = traverser.object();
+ return this.value.mapArg(traverser).equals(object.value(this.key.mapArg(traverser)));
}
@Override
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ValueMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/ValuesFlatMap.java
similarity index 63%
copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ValueMap.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/ValuesFlatMap.java
index 720f03e145..34cc5e36b4 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ValueMap.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/ValuesFlatMap.java
@@ -16,37 +16,39 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.function.map;
+package org.apache.tinkerpop.machine.function.flatmap;
import org.apache.tinkerpop.machine.bytecode.Instruction;
import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
-import org.apache.tinkerpop.machine.function.MapFunction;
-import org.apache.tinkerpop.machine.structure.data.TMap;
+import org.apache.tinkerpop.machine.function.FlatMapFunction;
+import org.apache.tinkerpop.machine.structure.TTuple;
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)
*/
-public final class ValueMap<C, K, V> extends AbstractFunction<C> implements MapFunction<C, TMap<K, V>, V> {
+public final class ValuesFlatMap<C, K, V> extends AbstractFunction<C> implements FlatMapFunction<C, TTuple<K, V>, V> {
private Argument<K> key;
- private ValueMap(final Coefficient<C> coefficient, final String label, final Argument<K> key) {
+ private ValuesFlatMap(final Coefficient<C> coefficient, final String label, final Argument<K> key) {
super(coefficient, label);
this.key = key;
}
@Override
- public V apply(final Traverser<C, TMap<K, V>> traverser) {
- return traverser.object().get(this.key.mapArg(traverser));
+ public Iterator<V> apply(final Traverser<C, TTuple<K, V>> traverser) {
+ return ((Iterable<V>) traverser.object().value(this.key.mapArg(traverser))).iterator();
}
@Override
- public ValueMap<C, K, V> clone() {
- final ValueMap<C, K, V> clone = (ValueMap<C, K, V>) super.clone();
+ public ValuesFlatMap<C, K, V> clone() {
+ final ValuesFlatMap<C, K, V> clone = (ValuesFlatMap<C, K, V>) super.clone();
clone.key = this.key.clone();
return clone;
}
@@ -61,7 +63,7 @@ public final class ValueMap<C, K, V> extends AbstractFunction<C> implements MapF
return StringFactory.makeFunctionString(this, this.key);
}
- public static <C, K, V> ValueMap<C, K, V> compile(final Instruction<C> instruction) {
- return new ValueMap<>(instruction.coefficient(), instruction.label(), Argument.create(instruction.args()[0]));
+ public static <C, K, V> ValuesFlatMap<C, K, V> compile(final Instruction<C> instruction) {
+ return new ValuesFlatMap<>(instruction.coefficient(), instruction.label(), Argument.create(instruction.args()[0]));
}
}
\ No newline at end of file
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java
similarity index 52%
copy from java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java
index 5d9e1d2479..9b983b6ac5 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java
@@ -16,30 +16,47 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.blueprints.function.initial;
+package org.apache.tinkerpop.machine.function.initial;
-import org.apache.tinkerpop.machine.structure.data.TVertex;
+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.blueprints.data.BlueprintsVertex;
-import org.apache.tinkerpop.machine.util.IteratorUtils;
+import org.apache.tinkerpop.machine.structure.table.TDatabase;
+import org.apache.tinkerpop.machine.util.StringFactory;
import java.util.Iterator;
-import java.util.Set;
+import java.util.List;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public class VerticesFlatMap<C> extends AbstractFunction<C> implements InitialFunction<C, TVertex> {
+public final class DbInitial<C> extends AbstractFunction<C> implements InitialFunction<C, TDatabase> {
- public VerticesFlatMap(final Coefficient<C> coefficient, final String label) {
+ private TDatabase database;
+
+ private DbInitial(final Coefficient<C> coefficient, final String label, final TDatabase database) {
super(coefficient, label);
+ this.database = database;
+ }
+
+
+ @Override
+ public Iterator<TDatabase> get() {
+ return List.of(this.database).iterator();
}
@Override
- public Iterator<TVertex> get() {
- return IteratorUtils.of(new BlueprintsVertex(), new BlueprintsVertex());
+ public int hashCode() {
+ return super.hashCode() ^ this.database.hashCode();
}
+ @Override
+ public String toString() {
+ return StringFactory.makeFunctionString(this, this.database);
+ }
+
+ public static <C> DbInitial<C> compile(final Instruction<C> instruction) {
+ return new DbInitial<>(instruction.coefficient(), instruction.label(), (TDatabase) instruction.args()[0]);
+ }
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ValueMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ValueMap.java
index 720f03e145..81f38b9ae6 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ValueMap.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/ValueMap.java
@@ -23,14 +23,14 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Argument;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
import org.apache.tinkerpop.machine.function.MapFunction;
-import org.apache.tinkerpop.machine.structure.data.TMap;
+import org.apache.tinkerpop.machine.structure.TTuple;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.util.StringFactory;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class ValueMap<C, K, V> extends AbstractFunction<C> implements MapFunction<C, TMap<K, V>, V> {
+public final class ValueMap<C, K, V> extends AbstractFunction<C> implements MapFunction<C, TTuple<K, V>, V> {
private Argument<K> key;
@@ -40,8 +40,8 @@ public final class ValueMap<C, K, V> extends AbstractFunction<C> implements MapF
}
@Override
- public V apply(final Traverser<C, TMap<K, V>> traverser) {
- return traverser.object().get(this.key.mapArg(traverser));
+ public V apply(final Traverser<C, TTuple<K, V>> traverser) {
+ return traverser.object().value(this.key.mapArg(traverser));
}
@Override
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 0e2dbaddc6..89eadb2f2f 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
@@ -23,18 +23,15 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
import org.apache.tinkerpop.machine.function.ReduceFunction;
-import org.apache.tinkerpop.machine.structure.data.JMap;
-import org.apache.tinkerpop.machine.structure.data.TMap;
+import org.apache.tinkerpop.machine.structure.util.JTuple;
+import org.apache.tinkerpop.machine.structure.TTuple;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.util.StringFactory;
-import java.util.HashMap;
-import java.util.Map;
-
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class GroupCountReduce<C, S, E> extends AbstractFunction<C> implements ReduceFunction<C, S, TMap<E, Long>> {
+public final class GroupCountReduce<C, S, E> extends AbstractFunction<C> implements ReduceFunction<C, S, TTuple<E, Long>> {
private Compilation<C, S, E> byCompilation;
@@ -44,23 +41,23 @@ public final class GroupCountReduce<C, S, E> extends AbstractFunction<C> impleme
}
@Override
- public TMap<E, Long> apply(final Traverser<C, S> traverser, final TMap<E, Long> currentValue) {
+ public TTuple<E, Long> apply(final Traverser<C, S> traverser, final TTuple<E, Long> currentValue) {
final E object = null == this.byCompilation ? (E) traverser.object() : this.byCompilation.mapObject(traverser.object()).object();
- currentValue.set(object, traverser.coefficient().count() + currentValue.get(object, 0L));
+ currentValue.set(object, traverser.coefficient().count() + currentValue.value(object, 0L));
return currentValue;
}
@Override
- public TMap<E, Long> merge(final TMap<E, Long> valueA, final TMap<E, Long> valueB) {
- final Map<E, Long> newMap = new HashMap<>();
- valueA.entries().forEachRemaining(entry -> newMap.put(entry.getA(), entry.getB()));
- valueB.entries().forEachRemaining(entry -> newMap.put(entry.getA(), entry.getB()));
- return new JMap<>(newMap);
+ 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()));
+ return new JTuple<>();
}
@Override
- public TMap<E, Long> getInitialValue() {
- return new JMap<>(new HashMap<>());
+ public TTuple<E, Long> getInitialValue() {
+ return new JTuple<>();
}
@Override
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/ProcessorFactory.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/ProcessorFactory.java
index 6d75232b57..5d5ae30692 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/ProcessorFactory.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/ProcessorFactory.java
@@ -23,7 +23,6 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.strategy.Strategy;
import java.io.Serializable;
-import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -43,11 +42,4 @@ public interface ProcessorFactory extends Serializable {
return Collections.emptyList();
}
- public static Set<Strategy<?>> processorStrategies(final Class<? extends ProcessorFactory> processFactoryClass) {
- try {
- return processFactoryClass.getConstructor().newInstance().getStrategies();
- } catch (final NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
- throw new RuntimeException(e.getMessage(), e);
- }
- }
}
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 e01bf9e44f..d60cfff907 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
@@ -20,8 +20,8 @@ package org.apache.tinkerpop.machine.strategy.decoration;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
-import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
+import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.coefficient.LongCoefficient;
import org.apache.tinkerpop.machine.strategy.AbstractStrategy;
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/finalization/CoefficientStrategy.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/finalization/CoefficientStrategy.java
index f0d7dce26b..20e1b1f0ae 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/finalization/CoefficientStrategy.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/finalization/CoefficientStrategy.java
@@ -20,8 +20,8 @@ package org.apache.tinkerpop.machine.strategy.finalization;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
import org.apache.tinkerpop.machine.bytecode.Instruction;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.coefficient.LongCoefficient;
import org.apache.tinkerpop.machine.strategy.AbstractStrategy;
@@ -36,14 +36,14 @@ public final class CoefficientStrategy extends AbstractStrategy<Strategy.Finaliz
Coefficient<C> coefficient = BytecodeUtil.getCoefficient(bytecode).orElse(null);
if (null == coefficient) {
coefficient = (Coefficient<C>) LongCoefficient.create();
- bytecode.addSourceInstruction(CoreCompiler.Symbols.WITH_COEFFICIENT, coefficient.getClass());
+ bytecode.addSourceInstruction(Symbols.WITH_COEFFICIENT, coefficient.getClass());
}
for (final Instruction<C> instruction : bytecode.getInstructions()) {
for (final Object arg : instruction.args()) {
if (arg instanceof Bytecode) {
final Bytecode<C> next = (Bytecode<C>) arg;
- if (!BytecodeUtil.hasSourceInstruction(next, CoreCompiler.Symbols.WITH_COEFFICIENT)) {
- next.addSourceInstruction(CoreCompiler.Symbols.WITH_COEFFICIENT, coefficient.getClass());
+ if (!BytecodeUtil.hasSourceInstruction(next, Symbols.WITH_COEFFICIENT)) {
+ next.addSourceInstruction(Symbols.WITH_COEFFICIENT, coefficient.getClass());
}
}
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/optimization/IdentityStrategy.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/optimization/IdentityStrategy.java
index 1b7bd9f816..eea7994472 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/optimization/IdentityStrategy.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/optimization/IdentityStrategy.java
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.machine.strategy.optimization;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.strategy.AbstractStrategy;
import org.apache.tinkerpop.machine.strategy.Strategy;
@@ -31,7 +31,7 @@ public final class IdentityStrategy extends AbstractStrategy<Strategy.Optimizati
@Override
public <C> void apply(final Bytecode<C> bytecode) {
bytecode.getInstructions().removeIf(instruction ->
- instruction.op().equals(CoreCompiler.Symbols.MAP) &&
+ instruction.op().equals(Symbols.MAP) &&
instruction.args().length == 1 &&
"traverser::object".equals(instruction.args()[0]) &&
null != instruction.label() &&
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/EmptyStructure.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/EmptyStructure.java
index c7a59aec09..a00abb73f5 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/EmptyStructure.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/EmptyStructure.java
@@ -32,7 +32,7 @@ public final class EmptyStructure implements Structure, StructureFactory {
}
@Override
- public Structure mint(final Map<String, Object> configuration) {
+ public Structure mint() {
return this;
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/StructureFactory.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/StructureFactory.java
index caf079627f..c93b57b00d 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/StructureFactory.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/StructureFactory.java
@@ -22,10 +22,8 @@ import org.apache.tinkerpop.machine.bytecode.compiler.BytecodeCompiler;
import org.apache.tinkerpop.machine.strategy.Strategy;
import java.io.Serializable;
-import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.List;
-import java.util.Map;
import java.util.Set;
/**
@@ -33,7 +31,7 @@ import java.util.Set;
*/
public interface StructureFactory extends Serializable {
- public Structure mint(final Map<String, Object> configuration);
+ public Structure mint();
public default Set<Strategy<?>> getStrategies() {
return Collections.emptySet();
@@ -42,12 +40,4 @@ public interface StructureFactory extends Serializable {
public default List<BytecodeCompiler> getCompilers() {
return Collections.emptyList();
}
-
- public static Set<Strategy<?>> structureStrategies(final Class<? extends StructureFactory> structureFactoryClass) {
- try {
- return structureFactoryClass.getConstructor().newInstance().getStrategies();
- } catch (final NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
- throw new RuntimeException(e.getMessage(), e);
- }
- }
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSequence.java
similarity index 87%
copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSequence.java
index e2c1c6e8d4..7e6cebaf2a 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSequence.java
@@ -16,15 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TTuple2<A, B> {
-
- public A getA();
-
- public B getB();
+public interface TSequence<V> extends Iterable<V> {
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSymbol.java
similarity index 87%
copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSymbol.java
index e2c1c6e8d4..67891bac81 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSymbol.java
@@ -16,15 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TTuple2<A, B> {
-
- public A getA();
-
- public B getB();
+public interface TSymbol {
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java
similarity index 73%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TMap.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java
index 0a4471b2bb..8228291ed2 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TMap.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java
@@ -16,28 +16,25 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure;
-import java.io.Serializable;
-import java.util.Iterator;
+import org.apache.tinkerpop.machine.structure.util.T2Tuple;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TMap<K, V> extends Serializable {
-
- public void set(final K key, final V value);
-
- public V get(final K key);
-
- public V get(final K key, final V defaultValue);
+public interface TTuple<K, V> {
public boolean has(final K key);
- public Iterator<K> keys();
+ public V value(final K key);
+
+ public default V value(final K key, final V defaultValue) {
+ return this.has(key) ? this.value(key) : defaultValue;
+ }
- public Iterator<V> values();
+ public void set(final K key, final V value);
- public Iterator<TTuple2<K, V>> entries();
+ public TSequence<T2Tuple<K, V>> entries();
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/JMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/JMap.java
deleted file mode 100644
index e80d641e0f..0000000000
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/JMap.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.machine.structure.data;
-
-import org.apache.tinkerpop.machine.util.IteratorUtils;
-
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class JMap<K, V> implements TMap<K, V> {
-
- private final Map<K, V> map;
-
- public JMap(final Map<K, V> map) {
- this.map = map;
- }
-
- @Override
- public void set(final K key, final V value) {
- this.map.put(key, value);
- }
-
- @Override
- public V get(final K key) {
- return this.map.get(key);
- }
-
- @Override
- public V get(final K key, final V defaultValue) {
- return this.map.getOrDefault(key, defaultValue);
- }
-
- @Override
- public boolean has(final K key) {
- return this.map.containsKey(key);
- }
-
- @Override
- public Iterator<K> keys() {
- return this.map.keySet().iterator();
- }
-
- @Override
- public Iterator<V> values() {
- return this.map.values().iterator();
- }
-
- @Override
- public Iterator<TTuple2<K, V>> entries() {
- return IteratorUtils.map(this.map.entrySet().iterator(),
- entry -> new JTuple2<>(entry.getKey(), entry.getValue()));
- }
-
- @Override
- public int hashCode() {
- return this.map.hashCode();
- }
-
- @Override
- public boolean equals(final Object object) {
- return object instanceof JMap && this.map.equals(((JMap) object).map);
- }
-
- @Override
- public String toString() {
- return this.map.toString();
- }
-
- public static <K, V> JMap<K, V> create(final Map<K, V> map) {
- return new JMap<>(map);
- }
-}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/IdSymbol.java
similarity index 85%
copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/IdSymbol.java
index e2c1c6e8d4..bda1787a51 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/IdSymbol.java
@@ -16,15 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure.graph;
+
+import org.apache.tinkerpop.machine.structure.TSymbol;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TTuple2<A, B> {
-
- public A getA();
-
- public B getB();
-
+public class IdSymbol implements TSymbol {
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/LabelSymbol.java
similarity index 84%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/LabelSymbol.java
index e2c1c6e8d4..09ae9f865b 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TTuple2.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/LabelSymbol.java
@@ -16,15 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure.graph;
+
+import org.apache.tinkerpop.machine.structure.TSymbol;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TTuple2<A, B> {
-
- public A getA();
-
- public B getB();
-
+public class LabelSymbol implements TSymbol {
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TEdge.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TEdge.java
similarity index 80%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TEdge.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TEdge.java
index 08885b6fd3..c5695e4ea6 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TEdge.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TEdge.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure.graph;
import org.apache.tinkerpop.machine.util.IteratorUtils;
@@ -27,11 +27,11 @@ import java.util.Iterator;
*/
public interface TEdge<V> extends TElement<V> {
- public TVertex<V> inVertex();
+ public TVertex<V> inV();
- public TVertex<V> outVertex();
+ public TVertex<V> outV();
- public default Iterator<TVertex<V>> bothVertices() {
- return IteratorUtils.of(this.inVertex(), this.outVertex());
+ public default Iterator<TVertex<V>> bothV() {
+ return IteratorUtils.of(this.inV(), this.outV());
}
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TElement.java
similarity index 84%
copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TElement.java
index b29423fc2e..7ef45cd11a 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TElement.java
@@ -16,12 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure.graph;
+
+import org.apache.tinkerpop.machine.structure.TTuple;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TElement<V> extends TMap<String, V> {
+public interface TElement<V> extends TTuple<String, V> {
public String label();
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TGraph.java
similarity index 78%
copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TGraph.java
index b29423fc2e..d515a3350f 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TGraph.java
@@ -16,14 +16,13 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure.graph;
+
+import org.apache.tinkerpop.machine.structure.TSequence;
+import org.apache.tinkerpop.machine.structure.TTuple;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TElement<V> extends TMap<String, V> {
-
- public String label();
-
- public Object id();
+public interface TGraph extends TTuple<String, TSequence<TVertex>> {
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TVertex.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertex.java
similarity index 79%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TVertex.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertex.java
index 7a07a8c223..360c25df01 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TVertex.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertex.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure.graph;
import org.apache.tinkerpop.machine.util.MultiIterator;
@@ -27,14 +27,14 @@ import java.util.Iterator;
*/
public interface TVertex<V> extends TElement<V> {
- public Iterator<TEdge<V>> inEdges();
+ public Iterator<TEdge<V>> inE();
- public Iterator<TEdge<V>> outEdges();
+ public Iterator<TEdge<V>> outE();
- public default Iterator<TEdge<V>> bothEdges() {
+ public default Iterator<TEdge<V>> bothE() {
final MultiIterator<TEdge<V>> iterator = new MultiIterator<>();
- iterator.addIterator(this.inEdges());
- iterator.addIterator(this.outEdges());
+ iterator.addIterator(this.inE());
+ iterator.addIterator(this.outE());
return iterator;
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertices.java
similarity index 83%
copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertices.java
index b29423fc2e..90890b22fd 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertices.java
@@ -16,14 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure.graph;
+
+import org.apache.tinkerpop.machine.structure.TSequence;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TElement<V> extends TMap<String, V> {
-
- public String label();
-
- public Object id();
+public interface TVertices extends TSequence<TVertex> {
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TDatabase.java
similarity index 83%
copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TDatabase.java
index b29423fc2e..445ed33166 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TDatabase.java
@@ -16,14 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure.table;
+
+import org.apache.tinkerpop.machine.structure.TTuple;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TElement<V> extends TMap<String, V> {
-
- public String label();
-
- public Object id();
+public interface TDatabase extends TTuple<String,TTable> {
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TRow.java
similarity index 84%
copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TRow.java
index b29423fc2e..d4161bbb9d 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TRow.java
@@ -16,14 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure.table;
+
+import org.apache.tinkerpop.machine.structure.TTuple;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TElement<V> extends TMap<String, V> {
-
- public String label();
-
- public Object id();
+public interface TRow<V> extends TTuple<String,V> {
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TTable.java
similarity index 84%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TTable.java
index b29423fc2e..f3d7679664 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/TElement.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/table/TTable.java
@@ -16,14 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure.table;
+
+import org.apache.tinkerpop.machine.structure.TSequence;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TElement<V> extends TMap<String, V> {
-
- public String label();
-
- public Object id();
+public interface TTable extends TSequence<TRow<?>> {
}
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
new file mode 100644
index 0000000000..4827f71f62
--- /dev/null
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.structure.util;
+
+import org.apache.tinkerpop.machine.structure.TSequence;
+
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class J2Tuple<K, V> implements T2Tuple<K, V> {
+
+ private K key;
+ private V value;
+
+ 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;
+ }
+
+ @Override
+ public V value(final K key) {
+ return this.key.equals(key) ? this.value : null;
+ }
+
+ @Override
+ public void set(final K key, final V value) {
+ throw new IllegalStateException("Can't set key/value for a 2-tuple");
+ }
+
+ @Override
+ public TSequence<T2Tuple<K, V>> entries() {
+ return () -> List.of((T2Tuple<K, V>) this).iterator();
+ }
+
+ @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/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java
similarity index 54%
copy from java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java
index 5d9e1d2479..edff5bd1f8 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java
@@ -16,30 +16,40 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.blueprints.function.initial;
+package org.apache.tinkerpop.machine.structure.util;
-import org.apache.tinkerpop.machine.structure.data.TVertex;
-import org.apache.tinkerpop.machine.coefficient.Coefficient;
-import org.apache.tinkerpop.machine.function.AbstractFunction;
-import org.apache.tinkerpop.machine.function.InitialFunction;
-import org.apache.tinkerpop.machine.structure.blueprints.data.BlueprintsVertex;
+import org.apache.tinkerpop.machine.structure.TSequence;
+import org.apache.tinkerpop.machine.structure.TTuple;
import org.apache.tinkerpop.machine.util.IteratorUtils;
-import java.util.Iterator;
-import java.util.Set;
+import java.util.HashMap;
+import java.util.Map;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public class VerticesFlatMap<C> extends AbstractFunction<C> implements InitialFunction<C, TVertex> {
+public class JTuple<K, V> implements TTuple<K, V> {
- public VerticesFlatMap(final Coefficient<C> coefficient, final String label) {
- super(coefficient, label);
+ private final Map<K, V> map = new HashMap<>();
+
+ @Override
+ public boolean has(final K key) {
+ return this.map.containsKey(key);
+ }
+
+ @Override
+ public V value(final K key) {
+ return this.map.get(key);
+ }
+
+ @Override
+ public void set(final K key, final V value) {
+ this.map.put(key, value);
}
@Override
- public Iterator<TVertex> get() {
- return IteratorUtils.of(new BlueprintsVertex(), new BlueprintsVertex());
+ public TSequence<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/structure/data/JTuple2.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/T2Tuple.java
similarity index 67%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/JTuple2.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/T2Tuple.java
index e8efb9c84f..f10b8ffc3d 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/data/JTuple2.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/T2Tuple.java
@@ -16,30 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.data;
+package org.apache.tinkerpop.machine.structure.util;
-import java.io.Serializable;
+import org.apache.tinkerpop.machine.structure.TTuple;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class JTuple2<A, B> implements TTuple2<A, B>, Serializable {
+public interface T2Tuple<K, V> extends TTuple<K, V> {
- private final A a;
- private final B b;
+ public K key();
- JTuple2(final A a, final B b) {
- this.a = a;
- this.b = b;
- }
-
- @Override
- public A getA() {
- return this.a;
- }
-
- @Override
- public B getB() {
- return this.b;
- }
+ public V value();
}
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 bf89aed4f0..1970f60d6f 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
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.machine.bytecode.compiler;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.coefficient.LongCoefficient;
import org.apache.tinkerpop.machine.function.CFunction;
-import org.apache.tinkerpop.machine.structure.data.TMap;
+import org.apache.tinkerpop.machine.structure.TTuple;
import org.junit.jupiter.api.Test;
import java.util.List;
@@ -38,12 +38,12 @@ class CompilationTest {
void shouldCloneCorrectly() {
final Bytecode<Long> bytecode = new Bytecode<>();
final Bytecode<Long> inner = new Bytecode<>();
- inner.addInstruction(LongCoefficient.create(), CommonCompiler.Symbols.VALUE, "name");
- bytecode.addInstruction(LongCoefficient.create(), CommonCompiler.Symbols.HAS_KEY, "eq", inner);
- bytecode.addInstruction(LongCoefficient.create(), CommonCompiler.Symbols.COUNT);
+ 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);
- final Compilation<Long, TMap, Long> compilationA = Compilation.compile(bytecode);
- final Compilation<Long, TMap, Long> compilationB = compilationA.clone();
+ final Compilation<Long, TTuple, Long> compilationA = Compilation.compile(bytecode);
+ final Compilation<Long, TTuple, Long> compilationB = compilationA.clone();
assertEquals(compilationA.hashCode(), compilationB.hashCode());
assertEquals(compilationA, compilationB);
assertNotSame(compilationA, compilationB);
diff --git a/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/species/LocalMachineTest.java b/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/species/LocalMachineTest.java
index 0d454583db..de66cb4494 100644
--- a/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/species/LocalMachineTest.java
+++ b/java/machine/machine-core/src/test/java/org/apache/tinkerpop/machine/species/LocalMachineTest.java
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.machine.species;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CommonCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
import org.apache.tinkerpop.machine.strategy.finalization.CoefficientStrategy;
import org.apache.tinkerpop.machine.strategy.optimization.IdentityStrategy;
import org.apache.tinkerpop.machine.strategy.verification.CoefficientVerificationStrategy;
@@ -40,8 +40,8 @@ class LocalMachineTest {
assertEquals(0, machine.sources.size());
///
final Bytecode<Long> sourceCode = new Bytecode<>();
- sourceCode.addSourceInstruction(CommonCompiler.Symbols.WITH_STRATEGY, IdentityStrategy.class);
- sourceCode.addSourceInstruction(CommonCompiler.Symbols.WITH_STRATEGY, CoefficientStrategy.class);
+ sourceCode.addSourceInstruction(CoreCompiler.Symbols.WITH_STRATEGY, IdentityStrategy.class);
+ sourceCode.addSourceInstruction(CoreCompiler.Symbols.WITH_STRATEGY, CoefficientStrategy.class);
assertEquals(2, sourceCode.getSourceInstructions().size());
assertEquals(0, sourceCode.getInstructions().size());
///
@@ -70,7 +70,7 @@ class LocalMachineTest {
assertEquals(bytecode, machine.register(bytecode));
assertEquals(1, machine.sources.size());
///
- bytecode.addSourceInstruction(CommonCompiler.Symbols.WITH_STRATEGY, CoefficientVerificationStrategy.class);
+ bytecode.addSourceInstruction(CoreCompiler.Symbols.WITH_STRATEGY, CoefficientVerificationStrategy.class);
assertFalse(machine.submit(bytecode).hasNext());
assertEquals(1, machine.sources.size());
assertNotEquals(bytecode, machine.register(bytecode));
diff --git a/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java b/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java
index 7b1b6e85cd..38918d2366 100644
--- a/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java
+++ b/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.machine;
-import org.apache.tinkerpop.language.gremlin.common.__;
+import org.apache.tinkerpop.language.gremlin.core.__;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.bytecode.compiler.Order;
import org.junit.jupiter.api.Test;
@@ -29,10 +29,10 @@ import java.util.stream.Stream;
import static org.apache.tinkerpop.language.gremlin.P.gt;
import static org.apache.tinkerpop.language.gremlin.P.lt;
-import static org.apache.tinkerpop.language.gremlin.common.__.choose;
-import static org.apache.tinkerpop.language.gremlin.common.__.incr;
-import static org.apache.tinkerpop.language.gremlin.common.__.is;
-import static org.apache.tinkerpop.language.gremlin.common.__.union;
+import static org.apache.tinkerpop.language.gremlin.core.__.choose;
+import static org.apache.tinkerpop.language.gremlin.core.__.incr;
+import static org.apache.tinkerpop.language.gremlin.core.__.is;
+import static org.apache.tinkerpop.language.gremlin.core.__.union;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
diff --git a/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/BeamProcessor.java b/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/BeamProcessor.java
index 53ed990855..44f26cce9d 100644
--- a/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/BeamProcessor.java
+++ b/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/BeamProcessor.java
@@ -19,9 +19,8 @@
package org.apache.tinkerpop.machine.processor.beam;
import org.apache.tinkerpop.machine.bytecode.compiler.BytecodeCompiler;
-import org.apache.tinkerpop.machine.bytecode.compiler.CommonCompiler;
-import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.processor.Processor;
import org.apache.tinkerpop.machine.processor.ProcessorFactory;
import org.apache.tinkerpop.machine.processor.beam.strategy.BeamStrategy;
@@ -39,17 +38,13 @@ import java.util.Set;
*/
public class BeamProcessor implements ProcessorFactory {
- private static final List<BytecodeCompiler> COMPILERS = List.of(CoreCompiler.instance(), CommonCompiler.instance());
+ private static final List<BytecodeCompiler> COMPILERS = List.of(CoreCompiler.instance());
private static final int DEFAULT_SERVER_PORT = 8888;
public static final String TRAVERSER_SERVER_LOCATION = "beam.traverserServer.location";
public static final String TRAVERSER_SERVER_PORT = "beam.traverserServer.port";
private final Map<String, Object> configuration;
- public BeamProcessor() {
- this.configuration = Collections.emptyMap();
- }
-
public BeamProcessor(final Map<String, Object> configuration) {
this.configuration = configuration;
}
diff --git a/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/SimpleLocalTest.java b/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/SimpleLocalTest.java
index 6f53981598..00db16edc9 100644
--- a/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/SimpleLocalTest.java
+++ b/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/SimpleLocalTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.machine.processor.beam;
import org.apache.tinkerpop.machine.SimpleTestSuite;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.species.LocalMachine;
/**
@@ -31,7 +31,7 @@ class SimpleLocalTest extends SimpleTestSuite {
private final static Bytecode<Long> BYTECODE = new Bytecode<>();
static {
- BYTECODE.addSourceInstruction(CoreCompiler.Symbols.WITH_PROCESSOR, BeamProcessor.class);
+ BYTECODE.addSourceInstruction(Symbols.WITH_PROCESSOR, BeamProcessor.class);
}
SimpleLocalTest() {
diff --git a/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/SimpleRemoteTest.java b/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/SimpleRemoteTest.java
index 72fac52055..eef8ec4a82 100644
--- a/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/SimpleRemoteTest.java
+++ b/java/machine/processor/beam/src/test/java/org/apache/tinkerpop/machine/processor/beam/SimpleRemoteTest.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.machine.processor.beam;
import org.apache.tinkerpop.machine.AbstractTestSuite;
import org.apache.tinkerpop.machine.SimpleTestSuite;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.species.remote.MachineServer;
import org.apache.tinkerpop.machine.species.remote.RemoteMachine;
import org.junit.jupiter.api.AfterAll;
@@ -38,7 +38,7 @@ public class SimpleRemoteTest extends SimpleTestSuite {
private static MachineServer SERVER = new MachineServer(7777);
static {
- BYTECODE.addSourceInstruction(CoreCompiler.Symbols.WITH_PROCESSOR,
+ BYTECODE.addSourceInstruction(Symbols.WITH_PROCESSOR,
BeamProcessor.class,
Map.of(BeamProcessor.TRAVERSER_SERVER_LOCATION,
"localhost", BeamProcessor.TRAVERSER_SERVER_PORT, 6666));
diff --git a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/PipesProcessor.java b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/PipesProcessor.java
index fa4890c1ad..6c26f48070 100644
--- a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/PipesProcessor.java
+++ b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/PipesProcessor.java
@@ -20,16 +20,14 @@ package org.apache.tinkerpop.machine.processor.pipes;
import org.apache.tinkerpop.machine.bytecode.compiler.BytecodeCompiler;
import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
-import org.apache.tinkerpop.machine.bytecode.compiler.CommonCompiler;
import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
import org.apache.tinkerpop.machine.processor.Processor;
import org.apache.tinkerpop.machine.processor.ProcessorFactory;
import org.apache.tinkerpop.machine.processor.pipes.strategy.PipesStrategy;
import org.apache.tinkerpop.machine.strategy.Strategy;
-import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.Set;
/**
@@ -37,9 +35,9 @@ import java.util.Set;
*/
public final class PipesProcessor implements ProcessorFactory {
- private static final List<BytecodeCompiler> COMPILERS = List.of(CoreCompiler.instance(), CommonCompiler.instance());
+ private static final List<BytecodeCompiler> COMPILERS = List.of(CoreCompiler.instance());
- public PipesProcessor() {
+ public PipesProcessor(final Map<String, Object> configuration) {
}
@Override
diff --git a/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/PipesTest.java b/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/PipesTest.java
index 8d9425090f..cbc087dc87 100644
--- a/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/PipesTest.java
+++ b/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/PipesTest.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.language.gremlin.Gremlin;
import org.apache.tinkerpop.language.gremlin.Traversal;
import org.apache.tinkerpop.language.gremlin.TraversalSource;
import org.apache.tinkerpop.language.gremlin.TraversalUtil;
-import org.apache.tinkerpop.language.gremlin.common.__;
+import org.apache.tinkerpop.language.gremlin.core.__;
import org.apache.tinkerpop.machine.Machine;
import org.apache.tinkerpop.machine.coefficient.LongCoefficient;
import org.apache.tinkerpop.machine.species.LocalMachine;
@@ -30,6 +30,8 @@ import org.apache.tinkerpop.machine.strategy.optimization.IdentityStrategy;
import org.apache.tinkerpop.machine.structure.blueprints.BlueprintsStructure;
import org.junit.jupiter.api.Test;
+import static org.apache.tinkerpop.language.gremlin.core.__.count;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -44,7 +46,7 @@ class PipesTest {
.withStructure(BlueprintsStructure.class)
.withStrategy(IdentityStrategy.class);
- Traversal<Long, ?, ?> traversal = g.V().identity().union(__.count(), __.count()).map(__.<Long, Long>count().identity()).explain();
+ Traversal<Long, ?, ?> traversal = g.V().identity().union(count(), count()).map(__.<Long, Long>count().identity()).explain();
System.out.println(TraversalUtil.getBytecode(traversal));
System.out.println(traversal);
System.out.println(TraversalUtil.getBytecode(traversal));
diff --git a/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/SimpleLocalTest.java b/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/SimpleLocalTest.java
index be12546f8e..5e5c2cf33d 100644
--- a/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/SimpleLocalTest.java
+++ b/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/SimpleLocalTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.machine.processor.pipes;
import org.apache.tinkerpop.machine.SimpleTestSuite;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.species.LocalMachine;
/**
@@ -31,7 +31,7 @@ class SimpleLocalTest extends SimpleTestSuite {
private final static Bytecode<Long> BYTECODE = new Bytecode<>();
static {
- BYTECODE.addSourceInstruction(CoreCompiler.Symbols.WITH_PROCESSOR, PipesProcessor.class);
+ BYTECODE.addSourceInstruction(Symbols.WITH_PROCESSOR, PipesProcessor.class);
}
SimpleLocalTest() {
diff --git a/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/SimpleRemoteTest.java b/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/SimpleRemoteTest.java
index f895ada1a4..9a43238010 100644
--- a/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/SimpleRemoteTest.java
+++ b/java/machine/processor/pipes/src/test/java/org/apache/tinkerpop/machine/processor/pipes/SimpleRemoteTest.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.machine.processor.pipes;
import org.apache.tinkerpop.machine.AbstractTestSuite;
import org.apache.tinkerpop.machine.SimpleTestSuite;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.species.remote.MachineServer;
import org.apache.tinkerpop.machine.species.remote.RemoteMachine;
import org.junit.jupiter.api.AfterAll;
@@ -36,7 +36,7 @@ class SimpleRemoteTest extends SimpleTestSuite {
private static MachineServer SERVER = new MachineServer(7777);
static {
- BYTECODE.addSourceInstruction(CoreCompiler.Symbols.WITH_PROCESSOR, PipesProcessor.class);
+ BYTECODE.addSourceInstruction(Symbols.WITH_PROCESSOR, PipesProcessor.class);
}
SimpleRemoteTest() {
diff --git a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/RxJavaProcessor.java b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/RxJavaProcessor.java
index 23346f50c5..b2ad367062 100644
--- a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/RxJavaProcessor.java
+++ b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/RxJavaProcessor.java
@@ -26,7 +26,6 @@ import org.apache.tinkerpop.machine.processor.rxjava.strategy.RxJavaStrategy;
import org.apache.tinkerpop.machine.strategy.Strategy;
import org.apache.tinkerpop.machine.util.StringFactory;
-import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -45,10 +44,6 @@ public final class RxJavaProcessor implements ProcessorFactory {
private final Map<String, Object> configuration;
- public RxJavaProcessor() {
- this.configuration = Collections.emptyMap();
- }
-
public RxJavaProcessor(final Map<String, Object> configuration) {
this.configuration = configuration;
}
diff --git a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/strategy/RxJavaStrategy.java b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/strategy/RxJavaStrategy.java
index 4e9de21626..96729551aa 100644
--- a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/strategy/RxJavaStrategy.java
+++ b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/strategy/RxJavaStrategy.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.machine.processor.rxjava.strategy;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
import org.apache.tinkerpop.machine.bytecode.SourceInstruction;
-import org.apache.tinkerpop.machine.bytecode.compiler.CommonCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
import org.apache.tinkerpop.machine.bytecode.compiler.CompositeCompiler;
import org.apache.tinkerpop.machine.bytecode.compiler.FunctionType;
import org.apache.tinkerpop.machine.processor.rxjava.RxJavaProcessor;
@@ -42,12 +42,12 @@ public final class RxJavaStrategy extends AbstractStrategy<Strategy.ProviderStra
if (bytecode.getParent().isEmpty()) { // root bytecode
final String id = UUID.randomUUID().toString();
bytecode.addSourceInstruction(RxJavaProcessor.RX_ROOT_BYTECODE_ID, id);
- } else if (!BytecodeUtil.hasSourceInstruction(bytecode, CommonCompiler.Symbols.WITH_PROCESSOR)) {
+ } else if (!BytecodeUtil.hasSourceInstruction(bytecode, CoreCompiler.Symbols.WITH_PROCESSOR)) {
if (RxJavaStrategy.isSimple(bytecode)) {
- bytecode.addSourceInstruction(CommonCompiler.Symbols.WITH_PROCESSOR, RxJavaProcessor.class, Map.of(RxJavaProcessor.RX_THREAD_POOL_SIZE, 0)); // guaranteed serial execution
+ bytecode.addSourceInstruction(CoreCompiler.Symbols.WITH_PROCESSOR, RxJavaProcessor.class, Map.of(RxJavaProcessor.RX_THREAD_POOL_SIZE, 0)); // guaranteed serial execution
} else {
final Bytecode<C> root = BytecodeUtil.getRootBytecode(bytecode);
- final List<SourceInstruction> processors = BytecodeUtil.getSourceInstructions(root, CommonCompiler.Symbols.WITH_PROCESSOR); // potential parallel execution
+ final List<SourceInstruction> processors = BytecodeUtil.getSourceInstructions(root, CoreCompiler.Symbols.WITH_PROCESSOR); // potential parallel execution
for (final SourceInstruction sourceInstruction : processors) {
bytecode.addSourceInstruction(sourceInstruction.op(), sourceInstruction.args());
}
diff --git a/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/RxJavaBenchmark.java b/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/RxJavaBenchmark.java
index 5ec8fc2fc2..faa53394db 100644
--- a/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/RxJavaBenchmark.java
+++ b/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/RxJavaBenchmark.java
@@ -20,11 +20,10 @@ package org.apache.tinkerpop.machine.processor.rxjava;
import org.apache.tinkerpop.language.gremlin.Gremlin;
import org.apache.tinkerpop.language.gremlin.TraversalSource;
-import org.apache.tinkerpop.language.gremlin.common.__;
+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.LocalMachine;
-import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
diff --git a/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleLocalParallelTest.java b/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleLocalParallelTest.java
index 46b37d23b3..994f5757c8 100644
--- a/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleLocalParallelTest.java
+++ b/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleLocalParallelTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.machine.processor.rxjava;
import org.apache.tinkerpop.machine.SimpleTestSuite;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.species.LocalMachine;
import java.util.Map;
@@ -33,7 +33,7 @@ public class SimpleLocalParallelTest extends SimpleTestSuite {
private final static Bytecode<Long> BYTECODE = new Bytecode<>();
static {
- BYTECODE.addSourceInstruction(CoreCompiler.Symbols.WITH_PROCESSOR, RxJavaProcessor.class, Map.of(RxJavaProcessor.RX_THREAD_POOL_SIZE, Runtime.getRuntime().availableProcessors()-1));
+ BYTECODE.addSourceInstruction(Symbols.WITH_PROCESSOR, RxJavaProcessor.class, Map.of(RxJavaProcessor.RX_THREAD_POOL_SIZE, Runtime.getRuntime().availableProcessors()-1));
}
SimpleLocalParallelTest() {
diff --git a/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleLocalSerialTest.java b/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleLocalSerialTest.java
index 5afa1e7b49..cf1780e4bf 100644
--- a/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleLocalSerialTest.java
+++ b/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleLocalSerialTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.machine.processor.rxjava;
import org.apache.tinkerpop.machine.SimpleTestSuite;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.species.LocalMachine;
/**
@@ -31,7 +31,7 @@ class SimpleLocalSerialTest extends SimpleTestSuite {
private final static Bytecode<Long> BYTECODE = new Bytecode<>();
static {
- BYTECODE.addSourceInstruction(CoreCompiler.Symbols.WITH_PROCESSOR, RxJavaProcessor.class);
+ BYTECODE.addSourceInstruction(Symbols.WITH_PROCESSOR, RxJavaProcessor.class);
}
SimpleLocalSerialTest() {
diff --git a/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleRemoteParallelTest.java b/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleRemoteParallelTest.java
index 11daedf095..0f697fc41f 100644
--- a/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleRemoteParallelTest.java
+++ b/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleRemoteParallelTest.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.machine.processor.rxjava;
import org.apache.tinkerpop.machine.AbstractTestSuite;
import org.apache.tinkerpop.machine.SimpleTestSuite;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.species.remote.MachineServer;
import org.apache.tinkerpop.machine.species.remote.RemoteMachine;
import org.junit.jupiter.api.AfterAll;
@@ -38,7 +38,7 @@ class SimpleRemoteParallelTest extends SimpleTestSuite {
private static MachineServer SERVER = new MachineServer(7777);
static {
- BYTECODE.addSourceInstruction(CoreCompiler.Symbols.WITH_PROCESSOR, RxJavaProcessor.class, Map.of(RxJavaProcessor.RX_THREAD_POOL_SIZE, Runtime.getRuntime().availableProcessors() - 1));
+ BYTECODE.addSourceInstruction(Symbols.WITH_PROCESSOR, RxJavaProcessor.class, Map.of(RxJavaProcessor.RX_THREAD_POOL_SIZE, Runtime.getRuntime().availableProcessors() - 1));
}
SimpleRemoteParallelTest() {
diff --git a/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleRemoteSerialTest.java b/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleRemoteSerialTest.java
index 8582bb884d..dba44e7d63 100644
--- a/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleRemoteSerialTest.java
+++ b/java/machine/processor/rxjava/src/test/java/org/apache/tinkerpop/machine/processor/rxjava/SimpleRemoteSerialTest.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.machine.processor.rxjava;
import org.apache.tinkerpop.machine.AbstractTestSuite;
import org.apache.tinkerpop.machine.SimpleTestSuite;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.species.remote.MachineServer;
import org.apache.tinkerpop.machine.species.remote.RemoteMachine;
import org.junit.jupiter.api.AfterAll;
@@ -36,7 +36,7 @@ public class SimpleRemoteSerialTest extends SimpleTestSuite {
private static MachineServer SERVER = new MachineServer(7777);
static {
- BYTECODE.addSourceInstruction(CoreCompiler.Symbols.WITH_PROCESSOR, RxJavaProcessor.class);
+ BYTECODE.addSourceInstruction(Symbols.WITH_PROCESSOR, RxJavaProcessor.class);
}
SimpleRemoteSerialTest() {
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/BlueprintsStructure.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/BlueprintsStructure.java
index 144439c9c8..7e0478353a 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/BlueprintsStructure.java
+++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/BlueprintsStructure.java
@@ -36,8 +36,12 @@ public class BlueprintsStructure implements StructureFactory {
private static final List<BytecodeCompiler> COMPILERS = List.of(BlueprintsCompiler.instance());
+ public BlueprintsStructure(final Map<String, Object> configuration) {
+
+ }
+
@Override
- public Structure mint(final Map<String, Object> configuration) {
+ public Structure mint() {
return new Blueprints();
}
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 7a3f18956b..a88b146965 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,10 @@
*/
package org.apache.tinkerpop.machine.structure.blueprints.data;
-import org.apache.tinkerpop.machine.structure.data.TEdge;
-import org.apache.tinkerpop.machine.structure.data.TTuple2;
-import org.apache.tinkerpop.machine.structure.data.TVertex;
-import org.apache.tinkerpop.machine.util.IteratorUtils;
+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 java.io.Serializable;
import java.util.Collections;
@@ -34,12 +34,12 @@ import java.util.UUID;
public class BlueprintsVertex<V> implements TVertex<V>, Serializable {
@Override
- public Iterator<TEdge<V>> inEdges() {
+ public Iterator<TEdge<V>> inE() {
return Collections.emptyIterator();
}
@Override
- public Iterator<TEdge<V>> outEdges() {
+ public Iterator<TEdge<V>> outE() {
return Collections.emptyIterator();
}
@@ -59,12 +59,12 @@ public class BlueprintsVertex<V> implements TVertex<V>, Serializable {
}
@Override
- public V get(String key) {
+ public V value(String key) {
return (V) "marko";
}
@Override
- public V get(String key, V defaultValue) {
+ public V value(String key, V defaultValue) {
return defaultValue;
}
@@ -74,18 +74,8 @@ public class BlueprintsVertex<V> implements TVertex<V>, Serializable {
}
@Override
- public Iterator keys() {
- return IteratorUtils.of("name");
- }
-
- @Override
- public Iterator values() {
- return IteratorUtils.of("marko");
- }
-
- @Override
- public Iterator<TTuple2<String, V>> entries() {
- return Collections.emptyIterator();
+ public TSequence<T2Tuple<String, V>> entries() {
+ return Collections::emptyIterator;
}
@Override
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
index 5d9e1d2479..2790291eaa 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
+++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.machine.structure.blueprints.function.initial;
-import org.apache.tinkerpop.machine.structure.data.TVertex;
+import org.apache.tinkerpop.machine.structure.graph.TVertex;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
import org.apache.tinkerpop.machine.function.InitialFunction;
@@ -26,7 +26,6 @@ import org.apache.tinkerpop.machine.structure.blueprints.data.BlueprintsVertex;
import org.apache.tinkerpop.machine.util.IteratorUtils;
import java.util.Iterator;
-import java.util.Set;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
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 56a9b9cf6e..8cbe34fa94 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
@@ -20,8 +20,8 @@ package org.apache.tinkerpop.machine.structure.blueprints.strategy.provider;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
import org.apache.tinkerpop.machine.bytecode.Instruction;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.strategy.AbstractStrategy;
import org.apache.tinkerpop.machine.strategy.Strategy;
import org.apache.tinkerpop.machine.structure.blueprints.bytecode.compiler.BlueprintsCompiler;
@@ -34,7 +34,7 @@ public class BlueprintsVerticesStrategy extends AbstractStrategy<Strategy.Provid
public <C> void apply(final Bytecode<C> bytecode) {
Instruction<C> temp = null;
for (final Instruction<C> instruction : bytecode.getInstructions()) {
- if (instruction.op().equals(CoreCompiler.Symbols.V))
+ if (instruction.op().equals(Symbols.V))
temp = instruction;
}
if (null != temp)
diff --git a/java/machine/structure/jdbc/pom.xml b/java/machine/structure/jdbc/pom.xml
new file mode 100644
index 0000000000..ce250865e4
--- /dev/null
+++ b/java/machine/structure/jdbc/pom.xml
@@ -0,0 +1,72 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>structure</artifactId>
+ <groupId>org.apache.tinkerpop</groupId>
+ <version>4.0.0-SNAPSHOT</version>
+ </parent>
+ <name>Apache TinkerPop :: Machine :: JDBC</name>
+ <artifactId>jdbc</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>machine-core</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <!-- TEST -->
+ <dependency>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>gremlin</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tinkerpop</groupId>
+ <artifactId>pipes</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <version>1.4.199</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <directory>${basedir}/target</directory>
+ <finalName>${project.artifactId}-${project.version}</finalName>
+ <testResources>
+ <testResource>
+ <directory>${basedir}/src/test/resources
+ </directory>
+ </testResource>
+ </testResources>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+</project>
\ No newline at end of file
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
new file mode 100644
index 0000000000..cad8d9c2db
--- /dev/null
+++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.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.util.T2Tuple;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+final class JDBCDatabase implements TDatabase, Structure {
+
+ private final Connection connection;
+
+ JDBCDatabase(final String connectionURI) {
+ try {
+ this.connection = DriverManager.getConnection(connectionURI);
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public boolean has(final String key) {
+ try {
+ final ResultSet result = this.connection.createStatement().executeQuery("SHOW TABLES");
+ while (result.next()) {
+ if (result.getString(1).equalsIgnoreCase(key))
+ return true;
+ }
+ return false;
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public TTable value(final String key) {
+ return new JDBCTable(this.connection, key);
+ }
+
+ @Override
+ public void set(final String key, final TTable value) {
+
+ }
+
+ @Override
+ public TSequence<T2Tuple<String, TTable>> entries() {
+ return null;
+ }
+
+}
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
new file mode 100644
index 0000000000..57017ada7a
--- /dev/null
+++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCRow.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.structure.jdbc;
+
+import org.apache.tinkerpop.machine.structure.TSequence;
+import org.apache.tinkerpop.machine.structure.table.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.Iterator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+final class JDBCRow<V> implements TRow<V> {
+
+ private final ResultSet rows;
+ private final int rowId;
+
+ JDBCRow(final ResultSet rows, final int rowId) {
+ this.rows = rows;
+ this.rowId = rowId;
+
+ }
+
+ @Override
+ public boolean has(final String key) {
+ try {
+ this.rows.absolute(this.rowId);
+ this.rows.findColumn(key);
+ return true;
+ } catch (final SQLException e) {
+ return false;
+ }
+ }
+
+ @Override
+ public V value(final String key) {
+ try {
+ this.rows.absolute(this.rowId);
+ return (V) this.rows.getObject(key);
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public void set(final String key, final V value) {
+ try {
+ this.rows.absolute(this.rowId);
+ this.rows.updateObject(key, value);
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public TSequence<T2Tuple<String, V>> entries() {
+ try {
+ this.rows.absolute(this.rowId);
+ return () -> new Iterator<>() {
+
+ int column = 1;
+
+ @Override
+ public boolean hasNext() {
+ try {
+ return rows.getMetaData().getColumnCount() + 1 != column;
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public T2Tuple<String, V> next() {
+ try {
+ final J2Tuple<String, V> temp = new J2Tuple<>(rows.getMetaData().getColumnName(column), (V) rows.getObject(column));
+ column++;
+ return temp;
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+ };
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+}
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/BlueprintsStructure.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCStructure.java
similarity index 60%
copy from java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/BlueprintsStructure.java
copy to java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCStructure.java
index 144439c9c8..778a36b45b 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/BlueprintsStructure.java
+++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCStructure.java
@@ -16,39 +16,34 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.blueprints;
+package org.apache.tinkerpop.machine.structure.jdbc;
-import org.apache.tinkerpop.machine.bytecode.compiler.BytecodeCompiler;
import org.apache.tinkerpop.machine.strategy.Strategy;
import org.apache.tinkerpop.machine.structure.Structure;
import org.apache.tinkerpop.machine.structure.StructureFactory;
-import org.apache.tinkerpop.machine.structure.blueprints.bytecode.compiler.BlueprintsCompiler;
-import org.apache.tinkerpop.machine.structure.blueprints.strategy.provider.BlueprintsVerticesStrategy;
+import org.apache.tinkerpop.machine.structure.jdbc.strategy.JDBCStrategy;
-import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public class BlueprintsStructure implements StructureFactory {
+public class JDBCStructure implements StructureFactory {
- private static final List<BytecodeCompiler> COMPILERS = List.of(BlueprintsCompiler.instance());
+ private final Map<String, Object> configuration;
- @Override
- public Structure mint(final Map<String, Object> configuration) {
- return new Blueprints();
+ public JDBCStructure(final Map<String, Object> configuration) {
+ this.configuration = configuration;
}
@Override
public Set<Strategy<?>> getStrategies() {
- return Set.of(new BlueprintsVerticesStrategy());
+ return Set.of(new JDBCStrategy());
}
@Override
- public List<BytecodeCompiler> getCompilers() {
- return COMPILERS;
+ public Structure mint() {
+ 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
new file mode 100644
index 0000000000..de8b46a3c2
--- /dev/null
+++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTable.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.structure.jdbc;
+
+import org.apache.tinkerpop.machine.structure.table.TRow;
+import org.apache.tinkerpop.machine.structure.table.TTable;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Iterator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+final class JDBCTable implements TTable {
+
+ private final Connection connection;
+ private final String name;
+
+ JDBCTable(final Connection connection, final String name) {
+ this.connection = connection;
+ this.name = name;
+ }
+
+ @Override
+ public Iterator<TRow<?>> iterator() {
+ try {
+ final ResultSet resultSet = this.connection.createStatement().executeQuery("SELECT * FROM " + this.name);
+ return new Iterator<>() {
+
+ private boolean done = false;
+
+ @Override
+ public boolean hasNext() {
+ return !this.done;
+ }
+
+ @Override
+ public TRow<?> next() {
+ try {
+ resultSet.next();
+ this.done = resultSet.isLast();
+ return new JDBCRow<>(resultSet, resultSet.getRow());
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+ };
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+}
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCStrategy.java
similarity index 65%
copy from java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java
copy to java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCStrategy.java
index 56a9b9cf6e..84466cd406 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java
+++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCStrategy.java
@@ -16,28 +16,34 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.blueprints.strategy.provider;
+package org.apache.tinkerpop.machine.structure.jdbc.strategy;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
-import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler;
import org.apache.tinkerpop.machine.bytecode.Instruction;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
import org.apache.tinkerpop.machine.strategy.AbstractStrategy;
import org.apache.tinkerpop.machine.strategy.Strategy;
-import org.apache.tinkerpop.machine.structure.blueprints.bytecode.compiler.BlueprintsCompiler;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public class BlueprintsVerticesStrategy extends AbstractStrategy<Strategy.ProviderStrategy> implements Strategy.ProviderStrategy {
+public final class JDBCStrategy extends AbstractStrategy<Strategy.ProviderStrategy> implements Strategy.ProviderStrategy {
+
@Override
public <C> void apply(final Bytecode<C> bytecode) {
- Instruction<C> temp = null;
+ Instruction<C> dbInstruction = null;
for (final Instruction<C> instruction : bytecode.getInstructions()) {
- if (instruction.op().equals(CoreCompiler.Symbols.V))
- temp = instruction;
+ if (instruction.op().equals(Symbols.DB)) {
+ dbInstruction = instruction;
+ }
+ }
+ if (null != dbInstruction) {
+ BytecodeUtil.replaceInstruction(bytecode, dbInstruction,
+ new Instruction<>(
+ dbInstruction.coefficient(),
+ Symbols.DB,
+ BytecodeUtil.getStructureFactory(BytecodeUtil.getRootBytecode(bytecode)).get().mint()));
}
- if (null != temp)
- BytecodeUtil.replaceInstruction(bytecode, temp, new Instruction<>(temp.coefficient(), BlueprintsCompiler.Symbols.BP_V));
}
}
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
new file mode 100644
index 0000000000..be9a7d2c18
--- /dev/null
+++ b/java/machine/structure/jdbc/src/test/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTest.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.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.machine.Machine;
+import org.apache.tinkerpop.machine.processor.pipes.PipesProcessor;
+import org.apache.tinkerpop.machine.species.BasicMachine;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.util.Map;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class JDBCTest {
+
+ @Test
+ void doStuff2() throws Exception {
+ final Connection connection = DriverManager.getConnection("jdbc:h2:/tmp/test");
+ connection.createStatement().execute("CREATE TABLE IF NOT EXISTS people (\n" +
+ " name VARCHAR(255) NOT NULL,\n" +
+ " age TINYINT NOT NULL)");
+ //connection.createStatement().execute("INSERT INTO people(`name`,`age`) VALUES ('marko',29)");
+
+
+ /* final TDatabase db = new JDBCDatabase("jdbc:h2:/tmp/test");
+ System.out.println(db.has("people"));
+ final TTable table = db.value("people");
+ for (final TRow<?> row : table) {
+ row.entries().forEach(System.out::println);
+ }
+ */
+
+
+ ////////
+
+ final Machine machine = BasicMachine.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());
+ }
+}
diff --git a/java/machine/structure/pom.xml b/java/machine/structure/pom.xml
index 1dc2c29e79..13d48c2275 100644
--- a/java/machine/structure/pom.xml
+++ b/java/machine/structure/pom.xml
@@ -26,5 +26,6 @@ limitations under the License.
<artifactId>structure</artifactId>
<modules>
<module>blueprints</module>
+ <module>jdbc</module>
</modules>
</project>
\ No newline at end of file
(tinkerpop) 06/13: 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.
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 706ad64b78ba1144276294805f325d7cd44ea024
Author: Marko A. Rodriguez <ok...@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 c281220d9f..5015a9e15d 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 82f3ddc576..bcbf648fa1 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 111613c820..86f2329dd9 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;
/**
@@ -108,6 +110,11 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
return this.addInstruction(Symbols.COUNT);
}
+ @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);
@@ -118,6 +125,11 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
return TraversalUtil.insertRepeatInstruction(this, 'e', TraversalUtil.getBytecode(emitTraversal));
}
+ @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 72f13a1039..77b3a40b3a 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 42216f5950..eeeeacc7f4 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 d7f29049f2..b77011b1cd 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 835bf4d7ba..d6ef5db1a1 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 9b983b6ac5..4143cc55b7 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 9b983b6ac5..246f0726f2 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 89eadb2f2f..6549ad2d8b 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 7e6cebaf2a..7c57095dbe 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 8228291ed2..c324caf4ba 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 09ae9f865b..5b0f6d06ca 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 bda1787a51..43f6b8fe0e 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 09ae9f865b..cbeb33ba11 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 d515a3350f..f0fa9b4972 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 445ed33166..56d51577de 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 d4161bbb9d..d80e399d93 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 f3d7679664..ba447f4577 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 4827f71f62..e94e138407 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 d515a3350f..6b54a54526 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 edff5bd1f8..7f59f9a656 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 e1844c01b3..19c3736162 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;
/**
@@ -32,12 +36,43 @@ public final class BasicPath implements Path {
public BasicPath() {
}
+ @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 b8c5c7ce3a..b3b0a6d17d 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)
*/
@@ -29,11 +34,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 eb853b92e0..cd911b504b 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 cc5a4cfb1f..f93f644ad6 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 a88b146965..fa08d2485d 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
@@ -58,6 +58,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 cad8d9c2db..ed57e74c5e 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 57017ada7a..259155373b 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 778a36b45b..8c6a2ab6b0 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 de8b46a3c2..a0b8cf5935 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 84466cd406..fc3b154701 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 be9a7d2c18..242bba7c2a 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());
}
}
(tinkerpop) 12/13: minor nothing. done for the day.
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 0ae83d2e1fb6ece61202b5ffa2e9fbeff47ec9e5
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Mon Apr 29 17:02:50 2019 -0600
minor nothing. done for the day.
---
.../org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java
index 1635b2b7c2..8dbf75bbe4 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java
@@ -42,7 +42,7 @@ public final class InjectFlatMap<C, S, E> extends AbstractFunction<C> implements
}
@Override
- public Iterator<E> apply(Traverser<C, S> traverser) {
+ public Iterator<E> apply(final Traverser<C, S> traverser) {
return new ArrayIterator<>(this.objects);
}
(tinkerpop) 13/13: 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.
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit bd79bcc4c1d5db3f1bcf3e40e7f1d27892c928e4
Author: Marko A. Rodriguez <ok...@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 51f7e080d9..793a469315 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 5015a9e15d..b9745027ea 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 1b91203b5d..6fa1d4c76d 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 35c01edeca..085a542270 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 75196521a9..038a781d8a 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 430479ddac..184dacfeca 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 d6ef5db1a1..541bb7f48d 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 a071ec7e5d..7218e9fdcb 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 4143cc55b7..e7affead9c 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 6549ad2d8b..e39b2179e4 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 65e02cb5fe..ec2958c8cf 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 aeffd07074..394ed10922 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 cc4763df55..1f40518c2e 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 c5695e4ea6..b75a462516 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 360c25df01..9f3197bfae 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 6b54a54526..c50d4ad896 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 f10b8ffc3d..fd07f98572 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 6b54a54526..6b509d498e 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 46f5cf95b5..59046f02fa 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;
@@ -48,22 +49,6 @@ public class JTuple<K, V> implements TTuple<K, V> {
this.map.put(key, value);
}
- @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 5b7f0781a1..3ef84c95fb 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;
@@ -40,13 +40,6 @@ public final class BasicPath implements Path {
return this.labels.contains(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);
@@ -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 e3039f1177..847eebebf6 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 0d06f73a0d..7d07c50c21 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 9653d522da..69df8d9970 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 ed2b723bde..0a184a3266 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 1970f60d6f..f59e509bc4 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 120533e00c..911ab108cd 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
@@ -58,11 +59,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 6b18d77d66..65980d2856 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 3e4e93faf5..03f4c45ed9 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;
@@ -73,11 +73,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 {
@@ -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 36d2c9607c..1b841b8cdc 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;
@@ -73,23 +73,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 {
@@ -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 eb75b44851..52506eaf46 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 af5f2b0777..4863568dd8 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 203bcdb8dc..9ad05c81bd 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 60a3c285c6..8415412ec0 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()));
}
(tinkerpop) 08/13: Created a JDBCQueryStrategy that looks for 'join' semantics in the bytecode and folds it into a custom jdbs:sql instruction that does a SELECT call.
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 7142dc16d8fc81ad8bd4090096b42e5b9b1744f4
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Mon Apr 29 13:56:21 2019 -0600
Created a JDBCQueryStrategy that looks for 'join' semantics in the bytecode and folds it into a custom jdbs:sql instruction that does a SELECT call.
---
.../tinkerpop/machine/bytecode/Bytecode.java | 5 +
.../tinkerpop/machine/bytecode/BytecodeUtil.java | 12 +++
.../bytecode/compiler/BytecodeCompiler.java | 3 +-
.../machine/bytecode/compiler/Compilation.java | 4 +-
.../bytecode/compiler/SourceCompilation.java | 4 +-
.../machine/function/barrier/OrderBarrier.java | 2 +-
.../machine/function/branch/RepeatBranch.java | 4 +-
.../machine/function/initial/FlatMapInitial.java | 9 +-
.../processor/{ => util}/EmptyProcessor.java | 5 +-
.../processor/{ => util}/FilterProcessor.java | 2 +-
.../processor/{ => util}/LoopsProcessor.java | 2 +-
.../processor/{ => util}/SimpleProcessor.java | 4 +-
.../tinkerpop/machine/structure/TSymbol.java | 26 -----
.../machine/structure/graph/IdSymbol.java | 52 ----------
.../machine/structure/graph/LabelSymbol.java | 52 ----------
.../tinkerpop/machine/structure/graph/TGraph.java | 4 +-
.../machine/structure/graph/TVertices.java | 27 ------
.../structure/{ => util}/EmptyStructure.java | 5 +-
.../tinkerpop/machine/structure/util/JTuple.java | 5 +
.../structure/{graph/G.java => util/TSymbol.java} | 22 +++--
.../machine/traverser/path/BasicPath.java | 1 +
.../machine/structure/jdbc/JDBCDatabase.java | 6 +-
.../machine/structure/jdbc/JDBCStructure.java | 11 ++-
.../jdbc/bytecode/compiler/JDBCCompiler.java | 69 ++++++++++++++
.../jdbc/function/flatmap/SqlFlatMap.java | 105 +++++++++++++++++++++
.../structure/jdbc/strategy/JDBCQueryStrategy.java | 55 +++++++++++
.../structure/jdbc/strategy/JDBCStrategy.java | 7 ++
.../tinkerpop/machine/structure/jdbc/JDBCTest.java | 8 +-
28 files changed, 324 insertions(+), 187 deletions(-)
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 eeeeacc7f4..75196521a9 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
@@ -64,6 +64,11 @@ public final class Bytecode<C> implements Cloneable, Serializable {
this.instructions.add(new Instruction<>(coefficient, op, args));
}
+ public void addInstruction(final int index, final Coefficient<C> coefficient, final String op, final Object... args) {
+ BytecodeUtil.linkBytecodeChildren(this, args);
+ this.instructions.add(index, new Instruction<>(coefficient, op, args));
+ }
+
public List<Instruction<C>> getInstructions() {
return this.instructions;
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java
index c4ea488171..afb3072289 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/BytecodeUtil.java
@@ -187,4 +187,16 @@ public final class BytecodeUtil {
}
return Optional.of(COP_TraverserFactory.instance());
}
+
+ public static <C> boolean startsWith(final Bytecode<C> bytecode, String... ops) {
+ int i = 0;
+ for (final Instruction<C> instruction : bytecode.getInstructions()) {
+ if (!instruction.op().equals(ops[i]))
+ return false;
+ i++;
+ if (i >= ops.length)
+ return true;
+ }
+ return false;
+ }
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
index 16cf912b0b..07b49edd92 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.machine.bytecode.compiler;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
+import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
import org.apache.tinkerpop.machine.bytecode.Instruction;
import org.apache.tinkerpop.machine.function.CFunction;
import org.apache.tinkerpop.machine.function.initial.FlatMapInitial;
@@ -37,7 +38,7 @@ public interface BytecodeCompiler {
for (final Instruction<C> instruction : bytecode.getInstructions()) {
final CFunction function = this.compile(instruction);
functions.add(functions.isEmpty() && bytecode.getParent().isEmpty() && function instanceof Initializing ?
- new FlatMapInitial<>(function.coefficient(), function.label(), (Initializing) function) : function);
+ new FlatMapInitial<>(function.coefficient(), function.label(), (Initializing) function, BytecodeUtil.getTraverserFactory(bytecode).get()) : function);
}
return functions;
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java
index f7105d988d..b7370ff0f6 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java
@@ -21,10 +21,10 @@ package org.apache.tinkerpop.machine.bytecode.compiler;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
import org.apache.tinkerpop.machine.function.CFunction;
-import org.apache.tinkerpop.machine.processor.EmptyProcessor;
+import org.apache.tinkerpop.machine.processor.util.EmptyProcessor;
import org.apache.tinkerpop.machine.processor.Processor;
import org.apache.tinkerpop.machine.processor.ProcessorFactory;
-import org.apache.tinkerpop.machine.structure.EmptyStructure;
+import org.apache.tinkerpop.machine.structure.util.EmptyStructure;
import org.apache.tinkerpop.machine.structure.StructureFactory;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.TraverserFactory;
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/SourceCompilation.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/SourceCompilation.java
index 70a960357f..9feeb59ae5 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/SourceCompilation.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/SourceCompilation.java
@@ -20,10 +20,10 @@ package org.apache.tinkerpop.machine.bytecode.compiler;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
-import org.apache.tinkerpop.machine.processor.EmptyProcessor;
+import org.apache.tinkerpop.machine.processor.util.EmptyProcessor;
import org.apache.tinkerpop.machine.processor.ProcessorFactory;
import org.apache.tinkerpop.machine.strategy.Strategy;
-import org.apache.tinkerpop.machine.structure.EmptyStructure;
+import org.apache.tinkerpop.machine.structure.util.EmptyStructure;
import org.apache.tinkerpop.machine.structure.StructureFactory;
import java.util.Set;
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/OrderBarrier.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/OrderBarrier.java
index ed8139360c..05f02e231d 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/OrderBarrier.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/barrier/OrderBarrier.java
@@ -25,7 +25,7 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Order;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
import org.apache.tinkerpop.machine.function.BarrierFunction;
-import org.apache.tinkerpop.machine.processor.FilterProcessor;
+import org.apache.tinkerpop.machine.processor.util.FilterProcessor;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.TraverserSet;
import org.apache.tinkerpop.machine.traverser.species.ProjectedTraverser;
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/RepeatBranch.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/RepeatBranch.java
index 378eb6db12..8d73d5f46a 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/RepeatBranch.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/branch/RepeatBranch.java
@@ -23,8 +23,8 @@ import org.apache.tinkerpop.machine.bytecode.Instruction;
import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
-import org.apache.tinkerpop.machine.processor.FilterProcessor;
-import org.apache.tinkerpop.machine.processor.LoopsProcessor;
+import org.apache.tinkerpop.machine.processor.util.FilterProcessor;
+import org.apache.tinkerpop.machine.processor.util.LoopsProcessor;
import org.apache.tinkerpop.machine.util.StringFactory;
import java.util.ArrayList;
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
index 2a2ca21ee3..8b065678db 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.machine.function.initial;
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.traverser.species.EmptyTraverser;
+import org.apache.tinkerpop.machine.traverser.TraverserFactory;
import java.util.Iterator;
@@ -31,14 +31,17 @@ import java.util.Iterator;
public final class FlatMapInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, S> {
private final Initializing<C, ?, S> function;
+ private final TraverserFactory<C> traverserFactory;
- public FlatMapInitial(final Coefficient<C> coefficient, final String label, final Initializing<C, ?, S> function) {
+
+ public FlatMapInitial(final Coefficient<C> coefficient, final String label, final Initializing<C, ?, S> function, final TraverserFactory<C> traverserFactory) {
super(coefficient, label);
this.function = function;
+ this.traverserFactory = traverserFactory;
}
@Override
public Iterator<S> get() {
- return this.function.apply(EmptyTraverser.instance());
+ return this.function.apply(traverserFactory.create(this, null));
}
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/EmptyProcessor.java
similarity index 91%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/EmptyProcessor.java
index d3da9cbecc..a56bb98f6c 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/EmptyProcessor.java
@@ -16,11 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.processor;
+package org.apache.tinkerpop.machine.processor.util;
import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
+import org.apache.tinkerpop.machine.processor.Processor;
+import org.apache.tinkerpop.machine.processor.ProcessorFactory;
import org.apache.tinkerpop.machine.traverser.Traverser;
-import org.apache.tinkerpop.machine.util.FastNoSuchElementException;
import java.util.Collections;
import java.util.Iterator;
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/FilterProcessor.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/FilterProcessor.java
similarity index 96%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/FilterProcessor.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/FilterProcessor.java
index a83e0d94df..61294f7678 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/FilterProcessor.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/FilterProcessor.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.processor;
+package org.apache.tinkerpop.machine.processor.util;
import org.apache.tinkerpop.machine.traverser.Traverser;
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/LoopsProcessor.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/LoopsProcessor.java
similarity index 96%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/LoopsProcessor.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/LoopsProcessor.java
index 25a44e1cc5..9d97f8256b 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/LoopsProcessor.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/LoopsProcessor.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.processor;
+package org.apache.tinkerpop.machine.processor.util;
import org.apache.tinkerpop.machine.traverser.Traverser;
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/SimpleProcessor.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/SimpleProcessor.java
similarity index 93%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/SimpleProcessor.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/SimpleProcessor.java
index e2a0955514..95b3edfad0 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/SimpleProcessor.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/util/SimpleProcessor.java
@@ -16,9 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.processor;
+package org.apache.tinkerpop.machine.processor.util;
import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
+import org.apache.tinkerpop.machine.processor.Processor;
+import org.apache.tinkerpop.machine.processor.ProcessorFactory;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.util.FastNoSuchElementException;
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSymbol.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSymbol.java
deleted file mode 100644
index 67891bac81..0000000000
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TSymbol.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.machine.structure;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TSymbol {
-
-}
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
deleted file mode 100644
index 43f6b8fe0e..0000000000
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/IdSymbol.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.machine.structure.graph;
-
-import org.apache.tinkerpop.machine.structure.TSymbol;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-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
deleted file mode 100644
index cbeb33ba11..0000000000
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/LabelSymbol.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.machine.structure.graph;
-
-import org.apache.tinkerpop.machine.structure.TSymbol;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-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 f0fa9b4972..6b8f122b48 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
@@ -18,11 +18,11 @@
*/
package org.apache.tinkerpop.machine.structure.graph;
+import org.apache.tinkerpop.machine.structure.Structure;
import org.apache.tinkerpop.machine.structure.TSequence;
-import org.apache.tinkerpop.machine.structure.TTuple;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TGraph extends TSequence<TVertex> {
+public interface TGraph extends TSequence<TVertex>, Structure {
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertices.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertices.java
deleted file mode 100644
index 90890b22fd..0000000000
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/TVertices.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.machine.structure.graph;
-
-import org.apache.tinkerpop.machine.structure.TSequence;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TVertices extends TSequence<TVertex> {
-}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/EmptyStructure.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/EmptyStructure.java
similarity index 87%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/EmptyStructure.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/EmptyStructure.java
index a00abb73f5..a367dc1c7c 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/EmptyStructure.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/EmptyStructure.java
@@ -16,9 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure;
+package org.apache.tinkerpop.machine.structure.util;
-import java.util.Map;
+import org.apache.tinkerpop.machine.structure.Structure;
+import org.apache.tinkerpop.machine.structure.StructureFactory;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
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 5966aa2c32..46f5cf95b5 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
@@ -79,4 +79,9 @@ public class JTuple<K, V> implements TTuple<K, V> {
return IteratorUtils.map(this.map.entrySet().iterator(), e -> new J2Tuple<>(e.getKey(), e.getValue()));
}
+ @Override
+ public String toString() {
+ return this.map.toString();
+ }
+
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/G.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/TSymbol.java
similarity index 63%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/G.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/TSymbol.java
index 5b0f6d06ca..a5ffd61fcd 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/graph/G.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/TSymbol.java
@@ -16,19 +16,27 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.graph;
-
-import org.apache.tinkerpop.machine.structure.TSymbol;
+package org.apache.tinkerpop.machine.structure.util;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class G {
+public final class TSymbol {
- private G() {
+ private TSymbol() {
// static instance
}
- public static TSymbol id = IdSymbol.instance();
- public static TSymbol label = LabelSymbol.instance();
+ public static final String id = "#id";
+ public static final String label = "#label";
+ public static final String key = "#key";
+ public static final String value = "#value";
+
+ public static boolean isSymbol(final String string) {
+ return string.startsWith("#");
+ }
+
+ public static String asSymbol(final String string) {
+ return string.startsWith("#") ? string : "#" + string;
+ }
}
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 5b7f0781a1..5b46c9e2dc 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
@@ -79,6 +79,7 @@ public final class BasicPath implements Path {
@Override
public Object get(final Pop pop, final String label) {
+ System.out.println(this.labels + ":::" + this.objects);
if (Pop.last == pop) {
for (int i = this.labels.size() - 1; i >= 0; i--) {
if (label.equals(this.labels.get(i)))
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 b04e89444e..3e4e93faf5 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
@@ -33,7 +33,7 @@ import java.util.Iterator;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-final class JDBCDatabase implements TDatabase {
+public final class JDBCDatabase implements TDatabase {
private final Connection connection;
@@ -45,6 +45,10 @@ final class JDBCDatabase implements TDatabase {
}
}
+ public Connection getConnection() {
+ return this.connection;
+ }
+
@Override
public boolean has(final String key) {
try {
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 8c6a2ab6b0..f951075ba5 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
@@ -18,11 +18,15 @@
*/
package org.apache.tinkerpop.machine.structure.jdbc;
+import org.apache.tinkerpop.machine.bytecode.compiler.BytecodeCompiler;
import org.apache.tinkerpop.machine.strategy.Strategy;
import org.apache.tinkerpop.machine.structure.Structure;
import org.apache.tinkerpop.machine.structure.StructureFactory;
+import org.apache.tinkerpop.machine.structure.jdbc.bytecode.compiler.JDBCCompiler;
+import org.apache.tinkerpop.machine.structure.jdbc.strategy.JDBCQueryStrategy;
import org.apache.tinkerpop.machine.structure.jdbc.strategy.JDBCStrategy;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -41,11 +45,16 @@ public class JDBCStructure implements StructureFactory {
@Override
public Set<Strategy<?>> getStrategies() {
- return Set.of(new JDBCStrategy());
+ return Set.of(new JDBCStrategy(), new JDBCQueryStrategy());
}
@Override
public Structure mint() {
return new JDBCDatabase((String) this.configuration.get(JDBC_CONNECTION));
}
+
+ @Override
+ public List<BytecodeCompiler> getCompilers() {
+ return List.of(JDBCCompiler.instance());
+ }
}
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
new file mode 100644
index 0000000000..eb75b44851
--- /dev/null
+++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/bytecode/compiler/JDBCCompiler.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.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)
+ */
+public final class JDBCCompiler implements BytecodeCompiler {
+
+ private static final JDBCCompiler INSTANCE = new JDBCCompiler();
+
+ private JDBCCompiler() {
+ // 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]);
+ else
+ return null;
+ }
+
+ @Override
+ public FunctionType getFunctionType(final String op) {
+ return op.equals(Symbols.JDBC_SQL) ? FunctionType.FLATMAP : null;
+ }
+
+ public static class Symbols {
+
+ private Symbols() {
+ // static instance
+ }
+
+ public static final String JDBC_SQL = "jdbc:sql";
+ }
+}
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
new file mode 100644
index 0000000000..af5f2b0777
--- /dev/null
+++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/function/flatmap/SqlFlatMap.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.structure.jdbc.function.flatmap;
+
+import org.apache.tinkerpop.machine.coefficient.Coefficient;
+import org.apache.tinkerpop.machine.function.AbstractFunction;
+import org.apache.tinkerpop.machine.function.initial.Initializing;
+import org.apache.tinkerpop.machine.structure.TTuple;
+import org.apache.tinkerpop.machine.structure.util.JTuple;
+import org.apache.tinkerpop.machine.traverser.Traverser;
+import org.apache.tinkerpop.machine.traverser.path.BasicPath;
+import org.apache.tinkerpop.machine.traverser.path.Path;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SqlFlatMap<C, S> extends AbstractFunction<C> implements Initializing<C, S, Path> {
+
+ private final Connection connection;
+ private final String sqlQuery;
+ private final String as1;
+ private final String as2;
+
+ public SqlFlatMap(final Coefficient<C> coefficient, final String label, final Connection connection, final String as1, final String as2, final String sqlQuery) {
+ super(coefficient, label);
+ this.connection = connection;
+ this.sqlQuery = sqlQuery;
+ this.as1 = as1;
+ this.as2 = as2;
+ }
+
+ @Override
+ public Iterator<Path> apply(final Traverser<C, S> traverser) {
+ try {
+ final ResultSet resultSet = this.connection.createStatement().executeQuery(this.sqlQuery);
+ return new Iterator<>() {
+ boolean done = false;
+
+ @Override
+ public boolean hasNext() {
+ return !this.done;
+ }
+
+ @Override
+ public Path next() {
+ try {
+ resultSet.next();
+ int size = resultSet.getMetaData().getColumnCount();
+ final Path row = new BasicPath();
+ final TTuple<String, Object> tuple1 = new JTuple<>();
+ final TTuple<String, Object> tuple2 = new JTuple<>();
+ Set<String> labels = new HashSet<>();
+ boolean stay = true;
+ for (int i = 1; i <= size; i++) {
+ final String temp = resultSet.getMetaData().getColumnLabel(i);
+ stay = stay && labels.add(temp);
+ if (stay) {
+ tuple1.set(resultSet.getMetaData().getColumnName(i), resultSet.getObject(i));
+ } else {
+ tuple2.set(resultSet.getMetaData().getColumnName(i), resultSet.getObject(i));
+ }
+ }
+ row.add(as1, tuple1);
+ row.add(as2, tuple2);
+ this.done = resultSet.isLast();
+ return row;
+
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+ };
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public SqlFlatMap<C, S> clone() {
+ return this; // TODO;
+ }
+}
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
new file mode 100644
index 0000000000..3adb915344
--- /dev/null
+++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/strategy/JDBCQueryStrategy.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.structure.jdbc.strategy;
+
+import org.apache.tinkerpop.machine.bytecode.Bytecode;
+import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
+import org.apache.tinkerpop.machine.bytecode.Instruction;
+import org.apache.tinkerpop.machine.bytecode.compiler.CoreCompiler.Symbols;
+import org.apache.tinkerpop.machine.strategy.AbstractStrategy;
+import org.apache.tinkerpop.machine.strategy.Strategy;
+import org.apache.tinkerpop.machine.structure.jdbc.JDBCDatabase;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class JDBCQueryStrategy extends AbstractStrategy<Strategy.ProviderStrategy> implements Strategy.ProviderStrategy {
+
+ @Override
+ public <C> void apply(final Bytecode<C> bytecode) {
+ if (bytecode.getParent().isEmpty() && BytecodeUtil.startsWith(bytecode, Symbols.DB, Symbols.VALUES, Symbols.DB, Symbols.VALUES, Symbols.HAS_KEY_VALUE, Symbols.PATH)) {
+ System.out.println(bytecode);
+ final JDBCDatabase db = (JDBCDatabase) bytecode.getInstructions().get(0).args()[0];
+ bytecode.getInstructions().remove(0); // DB
+ final String table1 = (String) bytecode.getInstructions().get(0).args()[0];
+ final String as1 = bytecode.getInstructions().get(0).label();
+ bytecode.getInstructions().remove(0); // VALUES
+ bytecode.getInstructions().remove(0); // DB
+ final String table2 = (String) bytecode.getInstructions().get(0).args()[0];
+ final String as2 = bytecode.getInstructions().get(0).label();
+ bytecode.getInstructions().remove(0); // VALUES
+ final String join = as1 + "." + bytecode.getInstructions().get(0).args()[0] + "=" + as2 + "." + ((Bytecode<C>) ((Bytecode<C>) bytecode.getInstructions().get(0).args()[1]).getInstructions().get(0).args()[1]).getInstructions().get(0).args()[0];
+ 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);
+ System.out.println(bytecode);
+ }
+ }
+}
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 fc3b154701..60a3c285c6 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,9 @@ 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;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -49,4 +51,9 @@ public final class JDBCStrategy extends AbstractStrategy<Strategy.ProviderStrate
BytecodeUtil.getStructureFactory(BytecodeUtil.getRootBytecode(bytecode)).get().mint()));
}
}
+
+ @Override
+ public Set<Class<? extends ProviderStrategy>> applyPost() {
+ return Set.of(JDBCQueryStrategy.class);
+ }
}
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 6429f078ad..1fa6c6cebb 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
@@ -41,8 +41,13 @@ public class JDBCTest {
connection.createStatement().execute("CREATE TABLE IF NOT EXISTS people (\n" +
" name VARCHAR(255) NOT NULL,\n" +
" age TINYINT NOT NULL)");
+ connection.createStatement().execute("CREATE TABLE IF NOT EXISTS addresses (\n" +
+ " name VARCHAR(255) NOT NULL,\n" +
+ " city VARCHAR(255) NOT NULL)");
//connection.createStatement().execute("INSERT INTO people(`name`,`age`) VALUES ('marko',29)");
//connection.createStatement().execute("INSERT INTO people(`name`,`age`) VALUES ('josh',32)");
+ //connection.createStatement().execute("INSERT INTO addresses(`name`,`city`) VALUES ('josh','san jose')");
+ //connection.createStatement().execute("INSERT INTO addresses(`name`,`city`) VALUES ('marko','santa fe')");
/* final TDatabase db = new JDBCDatabase("jdbc:h2:/tmp/test");
@@ -67,6 +72,7 @@ public class JDBCTest {
System.out.println(jdbc.db().values("people").toList());
System.out.println(jdbc.db().values("people").value("name").toList());
System.out.println(jdbc.db().values("people").entries().toList());
- System.out.println(jdbc.db().values("people").as("x").db().values("people").has("name", __.path("x").by("name")).as("y").path("x", "y").toList());
+ System.out.println(jdbc.db().values("people").as("x").db().values("addresses").as("y").has("name", __.path("x").by("name")).path("x", "y").toList());
+ System.out.println(jdbc.db().values("people").as("x").db().values("addresses").as("y").has("name", __.path("x").by("name")).path("x", "y").explain().toList());
}
}
(tinkerpop) 03/13: some reorg on RxJava.
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit d9a986302a487359ebb42387bfb7a3a851ffcbca
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Tue Apr 23 05:02:31 2019 -0600
some reorg on RxJava.
---
.../tinkerpop/machine/processor/pipes/Pipes.java | 1 -
.../machine/processor/rxjava/AbstractRxJava.java | 23 +++++++++-------------
.../machine/processor/rxjava/ParallelRxJava.java | 5 +++--
.../machine/processor/rxjava/SerialRxJava.java | 5 +++--
4 files changed, 15 insertions(+), 19 deletions(-)
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 9f3c7c88c7..317659fcf1 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
@@ -100,7 +100,6 @@ public final class Pipes<C, S, E> implements Processor<C, S, E> {
@Override
public Iterator<Traverser<C, E>> iterator(final Iterator<Traverser<C, S>> starts) {
-
if (this.isRunning())
throw Processor.Exceptions.processorIsCurrentlyRunning(this);
diff --git a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/AbstractRxJava.java b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/AbstractRxJava.java
index d16a4e14c4..9d88651f04 100644
--- a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/AbstractRxJava.java
+++ b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/AbstractRxJava.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.processor.Processor;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.TraverserSet;
+import org.apache.tinkerpop.machine.util.IteratorUtils;
import java.util.Iterator;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -63,15 +64,8 @@ public abstract class AbstractRxJava<C, S, E> implements Processor<C, S, E> {
@Override
public Iterator<Traverser<C, E>> iterator(final Iterator<Traverser<C, S>> starts) {
- if (this.isRunning())
- throw Processor.Exceptions.processorIsCurrentlyRunning(this);
-
- this.running.set(Boolean.TRUE);
- this.starts.clear();
- this.ends.clear();
- starts.forEachRemaining(this.starts::add);
- this.prepareFlow(this.ends::add);
- return new Iterator<>() {
+ this.prepareFlow(starts, this.ends::add);
+ return IteratorUtils.onLast(new Iterator<>() {
@Override
public boolean hasNext() {
waitForCompletionOrResult();
@@ -83,11 +77,15 @@ public abstract class AbstractRxJava<C, S, E> implements Processor<C, S, E> {
waitForCompletionOrResult();
return ends.remove();
}
- };
+ }, this::stop);
}
@Override
public void subscribe(final Iterator<Traverser<C, S>> starts, final Consumer<Traverser<C, E>> consumer) {
+ this.prepareFlow(starts, consumer::accept);
+ }
+
+ protected void prepareFlow(final Iterator<Traverser<C, S>> starts, final io.reactivex.functions.Consumer<? super Traverser<C, E>> consumer) {
if (this.isRunning())
throw Processor.Exceptions.processorIsCurrentlyRunning(this);
@@ -95,13 +93,10 @@ public abstract class AbstractRxJava<C, S, E> implements Processor<C, S, E> {
this.starts.clear();
this.ends.clear();
starts.forEachRemaining(this.starts::add);
- this.prepareFlow(consumer::accept);
}
- protected abstract void prepareFlow(final io.reactivex.functions.Consumer<? super Traverser<C, E>> consumer);
-
private void waitForCompletionOrResult() {
- while (this.ends.isEmpty() && this.isRunning()) {
+ while (this.ends.isEmpty() && this.running.get()) {
// wait until either the flow is complete or there is a traverser result
}
}
diff --git a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/ParallelRxJava.java b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/ParallelRxJava.java
index b0d92b120e..3aac6a29d4 100644
--- a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/ParallelRxJava.java
+++ b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/ParallelRxJava.java
@@ -34,13 +34,13 @@ import org.apache.tinkerpop.machine.function.InitialFunction;
import org.apache.tinkerpop.machine.function.MapFunction;
import org.apache.tinkerpop.machine.function.ReduceFunction;
import org.apache.tinkerpop.machine.function.branch.RepeatBranch;
-import org.apache.tinkerpop.machine.processor.Processor;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.TraverserFactory;
import org.apache.tinkerpop.machine.util.IteratorUtils;
import org.reactivestreams.Publisher;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
@@ -65,7 +65,8 @@ public final class ParallelRxJava<C, S, E> extends AbstractRxJava<C, S, E> {
}
@Override
- protected void prepareFlow(final Consumer<? super Traverser<C, E>> consumer) {
+ protected void prepareFlow(final Iterator<Traverser<C, S>> starts, final Consumer<? super Traverser<C, E>> consumer) {
+ super.prepareFlow(starts, consumer);
this.disposable = this.flowable
.doOnNext(consumer)
.sequential()
diff --git a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java
index 0d4cbce60b..b8d8bc46b4 100644
--- a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java
+++ b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java
@@ -32,13 +32,13 @@ import org.apache.tinkerpop.machine.function.InitialFunction;
import org.apache.tinkerpop.machine.function.MapFunction;
import org.apache.tinkerpop.machine.function.ReduceFunction;
import org.apache.tinkerpop.machine.function.branch.RepeatBranch;
-import org.apache.tinkerpop.machine.processor.Processor;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.TraverserFactory;
import org.apache.tinkerpop.machine.util.IteratorUtils;
import org.reactivestreams.Publisher;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -56,7 +56,8 @@ public final class SerialRxJava<C, S, E> extends AbstractRxJava<C, S, E> {
}
@Override
- protected void prepareFlow(final Consumer<? super Traverser<C, E>> consumer) {
+ protected void prepareFlow(final Iterator<Traverser<C, S>> starts, final Consumer<? super Traverser<C, E>> consumer) {
+ super.prepareFlow(starts, consumer);
this.disposable = this.flowable
.subscribeOn(Schedulers.newThread()) // don't block the execution so results can be streamed back in real-time
.doFinally(() -> this.running.set(Boolean.FALSE))
(tinkerpop) 01/13: I have a working implementation of recurssive-based repeat() in RxJava. This was an intense slog. Learned alot. I have written some pretty nasty nested branching test cases and the model is holding up.
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 6b39526f4bd0109d6789af5c1d300bc18463c6d3
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Thu Apr 18 11:12:23 2019 -0600
I have a working implementation of recurssive-based repeat() in RxJava. This was an intense slog. Learned alot. I have written some pretty nasty nested branching test cases and the model is holding up.
---
.../apache/tinkerpop/machine/SimpleTestSuite.java | 14 +++
.../machine/processor/rxjava/RepeatHead.java | 135 +++++++++++++++++++++
.../machine/processor/rxjava/RepeatTail.java | 119 ++++++++++++++++++
.../machine/processor/rxjava/SerialRxJava.java | 41 ++++---
4 files changed, 290 insertions(+), 19 deletions(-)
diff --git a/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java b/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java
index 862ff71b90..7b1b6e85cd 100644
--- a/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java
+++ b/java/machine/machine-test/src/main/java/org/apache/tinkerpop/machine/SimpleTestSuite.java
@@ -24,6 +24,8 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Order;
import org.junit.jupiter.api.Test;
import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import static org.apache.tinkerpop.language.gremlin.P.gt;
import static org.apache.tinkerpop.language.gremlin.P.lt;
@@ -225,6 +227,18 @@ public class SimpleTestSuite extends AbstractTestSuite<Long> {
g.inject(1L).repeat(union(incr(), __.<Long>incr().incr())).times(2));
}
+ // @Test (Parallel RxJava finds this too compute intensive)
+ void g_injectX1X_repeatXunionXincr__incrX_unionXincr__incrXX_timesX3X() {
+ verify(Stream.generate(() -> 7L).limit(64).collect(Collectors.toList()),
+ g.inject(1L).repeat(__.<Long,Long,Long>union(incr(), incr()).union(incr(),incr())).times(3));
+ }
+
+ // @Test (Parallel RxJava finds this too compute intensive)
+ void g_injectX1X_repeatXunionXincr__unionXincr__incrXX_unionXincr__incrXX_timesX3X() {
+ verify(Stream.generate(() -> 7L).limit(216).collect(Collectors.toList()),
+ g.inject(1L).repeat(__.<Long,Long,Long>union(incr(), __.union(incr(),incr())).union(incr(),incr())).times(3));
+ }
+
@Test
void g_injectX1X_repeatXunionXincr__incr_incrXX_timesX3X() {
verify(List.of(4L, 5L, 5L, 6L, 5L, 6L, 6L, 7L),
diff --git a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/RepeatHead.java b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/RepeatHead.java
new file mode 100644
index 0000000000..ef94b8b4b6
--- /dev/null
+++ b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/RepeatHead.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.processor.rxjava;
+
+import io.reactivex.Flowable;
+import io.reactivex.FlowableTransformer;
+import org.apache.tinkerpop.machine.function.branch.RepeatBranch;
+import org.apache.tinkerpop.machine.traverser.Traverser;
+import org.apache.tinkerpop.machine.traverser.TraverserSet;
+import org.reactivestreams.Processor;
+import org.reactivestreams.Publisher;
+import org.reactivestreams.Subscriber;
+import org.reactivestreams.Subscription;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+final class RepeatHead<C, S> implements Processor<Traverser<C, S>, Traverser<C, S>>, FlowableTransformer<Traverser<C, S>, Traverser<C, S>> {
+
+ private final TraverserSet<C, S> starts = new TraverserSet<>();
+ private final RepeatBranch<C, S> repeatBranch;
+ private Publisher<Traverser<C, S>> source;
+ private Subscription upstream;
+ private Subscriber<? super Traverser<C, S>> downstream;
+ private RepeatTail<C, S> repeatTail;
+
+ RepeatHead(final RepeatBranch<C, S> repeatBranch) {
+ this.repeatBranch = repeatBranch;
+ }
+
+ void setRepeatTail(final RepeatTail<C, S> repeatTail) {
+ this.repeatTail = repeatTail;
+ }
+
+
+ @Override
+ public void subscribe(final Subscriber<? super Traverser<C, S>> subscriber) {
+ this.downstream = subscriber;
+ this.source.subscribe(this);
+ Subscription subscription = new Subscription() {
+ @Override
+ public void request(long l) {
+ upstream.request(l);
+ drain();
+ }
+
+ @Override
+ public void cancel() {
+ upstream.cancel();
+ }
+ };
+ this.downstream.onSubscribe(subscription);
+ }
+
+ void tailComplete() {
+ drain();
+ downstream.onComplete();
+ }
+
+ @Override
+ public void onSubscribe(final Subscription subscription) {
+ this.upstream = subscription;
+
+ }
+
+ void addTraverser(final Traverser<C, S> traverser) {
+ this.starts.add(traverser);
+ }
+
+ @Override
+ public void onNext(final Traverser<C, S> traverser) {
+ this.processTraverser(traverser);
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ this.downstream.onError(throwable);
+ }
+
+ @Override
+ public void onComplete() {
+ this.upstream.cancel();
+ }
+
+ private void drain() {
+ while (!this.starts.isEmpty()) {
+ final Traverser<C, S> traverser = this.starts.remove();
+ this.processTraverser(traverser);
+ }
+ }
+
+ private void processTraverser(final Traverser<C, S> traverser) {
+ if (this.repeatBranch.hasStartPredicates()) {
+ if (1 == this.repeatBranch.getUntilLocation()) {
+ if (this.repeatBranch.getUntil().filterTraverser(traverser)) {
+ this.repeatTail.onNextSkip(traverser.repeatDone(this.repeatBranch));
+ } else if (2 == this.repeatBranch.getEmitLocation() && this.repeatBranch.getEmit().filterTraverser(traverser)) {
+ this.downstream.onNext(traverser);
+ this.repeatTail.onNextSkip(traverser.repeatDone(this.repeatBranch));
+ } else
+ this.downstream.onNext(traverser);
+ } else if (1 == this.repeatBranch.getEmitLocation()) {
+ if (this.repeatBranch.getEmit().filterTraverser(traverser))
+ this.repeatTail.onNextSkip(traverser.repeatDone(this.repeatBranch));
+ if (2 == this.repeatBranch.getUntilLocation() && this.repeatBranch.getUntil().filterTraverser(traverser))
+ this.repeatTail.onNextSkip(traverser.repeatDone(this.repeatBranch));
+ else
+ this.downstream.onNext(traverser);
+ }
+ } else
+ this.downstream.onNext(traverser);
+ }
+
+ @Override
+ public Publisher<Traverser<C, S>> apply(final Flowable<Traverser<C, S>> flowable) {
+ this.source = flowable;
+ return this;
+ }
+}
diff --git a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/RepeatTail.java b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/RepeatTail.java
new file mode 100644
index 0000000000..a6ea696e00
--- /dev/null
+++ b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/RepeatTail.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.processor.rxjava;
+
+import io.reactivex.Flowable;
+import io.reactivex.FlowableTransformer;
+import org.apache.tinkerpop.machine.function.branch.RepeatBranch;
+import org.apache.tinkerpop.machine.traverser.Traverser;
+import org.reactivestreams.Processor;
+import org.reactivestreams.Publisher;
+import org.reactivestreams.Subscriber;
+import org.reactivestreams.Subscription;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+final class RepeatTail<C, S> implements Processor<Traverser<C, S>, Traverser<C, S>>, FlowableTransformer<Traverser<C, S>, Traverser<C, S>> {
+
+ private Publisher<Traverser<C, S>> source;
+ private final RepeatBranch<C, S> repeatBranch;
+ private Subscription upstream;
+ private RepeatHead<C, S> repeatHead;
+ private Subscriber<? super Traverser<C, S>> downstream;
+
+ RepeatTail(final RepeatBranch<C, S> repeatBranch) {
+ this.repeatBranch = repeatBranch;
+ }
+
+ void setRepeatHead(final RepeatHead<C, S> repeatHead) {
+ this.repeatHead = repeatHead;
+ }
+
+ @Override
+ public Publisher<Traverser<C, S>> apply(final Flowable<Traverser<C, S>> flowable) {
+ this.source = flowable;
+ return this;
+ }
+
+
+ @Override
+ public void subscribe(final Subscriber<? super Traverser<C, S>> subscriber) {
+ this.downstream = subscriber;
+ this.source.subscribe(this);
+ this.downstream.onSubscribe(new Subscription() {
+ @Override
+ public void request(long l) {
+ upstream.request(l);
+ repeatHead.tailComplete();
+ }
+
+ @Override
+ public void cancel() {
+ upstream.cancel();
+ }
+ });
+ }
+
+ @Override
+ public void onSubscribe(final Subscription subscription) {
+ this.upstream = subscription;
+
+ }
+
+ void onNextSkip(final Traverser<C,S> traverser) {
+ this.downstream.onNext(traverser);
+ }
+
+ @Override
+ public void onNext(final Traverser<C, S> traverser) {
+ final Traverser<C, S> t = traverser.repeatLoop(this.repeatBranch);
+ if (this.repeatBranch.hasEndPredicates()) {
+ if (3 == this.repeatBranch.getUntilLocation()) {
+ if (this.repeatBranch.getUntil().filterTraverser(t)) {
+ this.downstream.onNext(t.repeatDone(this.repeatBranch));
+ } else if (4 == this.repeatBranch.getEmitLocation() && this.repeatBranch.getEmit().filterTraverser(t)) {
+ this.repeatHead.addTraverser(t);
+ this.downstream.onNext(t.repeatDone(this.repeatBranch));
+ } else
+ this.repeatHead.addTraverser(t);
+ } else if (3 == this.repeatBranch.getEmitLocation()) {
+ if (this.repeatBranch.getEmit().filterTraverser(t))
+ this.downstream.onNext(t.repeatDone(this.repeatBranch));
+ if (4 == this.repeatBranch.getUntilLocation() && this.repeatBranch.getUntil().filterTraverser(t))
+ this.downstream.onNext(t.repeatDone(this.repeatBranch));
+ else
+ this.repeatHead.addTraverser(t);
+ }
+ } else {
+ this.repeatHead.addTraverser(t);
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ this.downstream.onError(throwable);
+ }
+
+ @Override
+ public void onComplete() {
+ this.downstream.onComplete();
+ }
+
+}
diff --git a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java
index 230467e93a..ee04fb3489 100644
--- a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java
+++ b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java
@@ -91,7 +91,7 @@ public final class SerialRxJava<C, S, E> extends AbstractRxJava<C, S, E> {
final BarrierFunction<C, S, E, B> barrierFunction = (BarrierFunction<C, S, E, B>) function;
return flow.reduce(barrierFunction.getInitialValue(), new Barrier<>(barrierFunction)).toFlowable().flatMapIterable(new BarrierFlow<>(barrierFunction, traverserFactory));
} else if (function instanceof BranchFunction) {
- final Flowable<List> selectorFlow = flow.map(new BranchFlow<>((BranchFunction<C, S, B>) function)).share();
+ final Flowable<List> selectorFlow = flow.map(new BranchFlow<>((BranchFunction<C, S, B>) function));
final List<Publisher<Traverser<C, E>>> branchFlows = new ArrayList<>();
int branchCounter = 0;
for (final Map.Entry<Compilation<C, S, ?>, List<Compilation<C, S, E>>> branches : ((BranchFunction<C, S, E>) function).getBranches().entrySet()) {
@@ -107,25 +107,28 @@ public final class SerialRxJava<C, S, E> extends AbstractRxJava<C, S, E> {
return PublishProcessor.merge(branchFlows);
} else if (function instanceof RepeatBranch) {
final RepeatBranch<C, S> repeatBranch = (RepeatBranch<C, S>) function;
- final List<Publisher<Traverser<C, S>>> outputs = new ArrayList<>();
- Flowable<List> selectorFlow;
- for (int i = 0; i < MAX_REPETITIONS; i++) {
- if (repeatBranch.hasStartPredicates()) {
- selectorFlow = flow.flatMapIterable(new RepeatStart<>(repeatBranch)).share();
- outputs.add(selectorFlow.filter(list -> list.get(0).equals(0)).map(list -> (Traverser<C, S>) list.get(1)));
- flow = compile(selectorFlow.filter(list -> list.get(0).equals(1)).map(list -> (Traverser<C, S>) list.get(1)), repeatBranch.getRepeat());
- } else
- flow = compile(flow, repeatBranch.getRepeat());
- ///
- if (repeatBranch.hasEndPredicates()) {
- selectorFlow = flow.flatMapIterable(new RepeatEnd<>(repeatBranch)).share();
- outputs.add(selectorFlow.filter(list -> list.get(0).equals(0)).map(list -> (Traverser<C, S>) list.get(1)));
- flow = selectorFlow.filter(list -> list.get(0).equals(1)).map(list -> (Traverser<C, S>) list.get(1));
- } else
- flow = flow.map(t -> t.repeatLoop(repeatBranch));
- }
- return (Flowable) PublishProcessor.merge(outputs);
+ final RepeatHead<C, S> repeatHead = new RepeatHead<>(repeatBranch);
+ final RepeatTail<C, S> repeatTail = new RepeatTail<>(repeatBranch);
+ repeatHead.setRepeatTail(repeatTail);
+ repeatTail.setRepeatHead(repeatHead);
+ int branches = countBranches(repeatBranch.getRepeat());
+ return (Flowable) compile(flow.compose(repeatHead).publish().refCount(0 == branches ? 1 : branches), repeatBranch.getRepeat()).compose(repeatTail);
}
throw new RuntimeException("Need a new execution plan step: " + function);
}
+
+ private static <C, S, E> int countBranches(final Compilation<C, S, E> compilation) {
+ int counter = 0;
+ for (final CFunction<C> function : compilation.getFunctions()) {
+ if (function instanceof BranchFunction) {
+ for (final List<Compilation<C, S, E>> branches : ((BranchFunction<C, S, E>) function).getBranches().values()) {
+ counter = counter + branches.size();
+ for (final Compilation<C, S, E> branch : branches) {
+ counter = counter + countBranches(branch);
+ }
+ }
+ }
+ }
+ return counter;
+ }
}
(tinkerpop) 09/13: dah. commited with System.out.printlns(). I'm pooped. Need to rest.
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 36770acdaf1d8becd67e75f8fb5528043d16345c
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Mon Apr 29 14:13:10 2019 -0600
dah. commited with System.out.printlns(). I'm pooped. Need to rest.
---
.../java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java | 1 -
.../tinkerpop/machine/structure/jdbc/strategy/JDBCQueryStrategy.java | 2 --
2 files changed, 3 deletions(-)
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 5b46c9e2dc..5b7f0781a1 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
@@ -79,7 +79,6 @@ public final class BasicPath implements Path {
@Override
public Object get(final Pop pop, final String label) {
- System.out.println(this.labels + ":::" + this.objects);
if (Pop.last == pop) {
for (int i = this.labels.size() - 1; i >= 0; i--) {
if (label.equals(this.labels.get(i)))
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 3adb915344..203bcdb8dc 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
@@ -34,7 +34,6 @@ public final class JDBCQueryStrategy extends AbstractStrategy<Strategy.ProviderS
@Override
public <C> void apply(final Bytecode<C> bytecode) {
if (bytecode.getParent().isEmpty() && BytecodeUtil.startsWith(bytecode, Symbols.DB, Symbols.VALUES, Symbols.DB, Symbols.VALUES, Symbols.HAS_KEY_VALUE, Symbols.PATH)) {
- System.out.println(bytecode);
final JDBCDatabase db = (JDBCDatabase) bytecode.getInstructions().get(0).args()[0];
bytecode.getInstructions().remove(0); // DB
final String table1 = (String) bytecode.getInstructions().get(0).args()[0];
@@ -49,7 +48,6 @@ public final class JDBCQueryStrategy extends AbstractStrategy<Strategy.ProviderS
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);
- System.out.println(bytecode);
}
}
}
(tinkerpop) 07/13: There are no more InitialFunctions. If a FlatMapFunction implements Initializing then that means it can generate an output that isn't dependent on input. This way, we can have V() and mid-traversal V() without having two steps. Likewise for db() and inject(). Created PathObjectMap which is for path('x').by()... it will emit a single object, not a Path. Lots of other cleanup and organization.
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 1494567d9371d885ac9af7e435efff9621a87ca6
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Mon Apr 29 11:04:37 2019 -0600
There are no more InitialFunctions. If a FlatMapFunction implements Initializing then that means it can generate an output that isn't dependent on input. This way, we can have V() and mid-traversal V() without having two steps. Likewise for db() and inject(). Created PathObjectMap which is for path('x').by()... it will emit a single object, not a Path. Lots of other cleanup and organization.
---
.../language/gremlin/TraversalSource.java | 2 +-
.../tinkerpop/language/gremlin/TraversalUtil.java | 9 ++-
.../language/gremlin/core/CoreTraversal.java | 11 +--
.../apache/tinkerpop/language/gremlin/core/__.java | 6 +-
.../machine/bytecode/compiler/Argument.java | 3 -
.../bytecode/compiler/BytecodeCompiler.java | 6 +-
.../machine/bytecode/compiler/CoreCompiler.java | 16 ++--
.../machine/bytecode/compiler/FunctionType.java | 2 +-
.../machine/bytecode/compiler/MethodArgument.java | 93 ----------------------
.../DbInitial.java => flatmap/DbFlatMap.java} | 26 +++---
.../InjectFlatMap.java} | 24 ++++--
.../machine/function/initial/FlatMapInitial.java} | 18 ++---
.../initial/Initializing.java} | 9 +--
.../tinkerpop/machine/function/map/PathMap.java | 32 +++++---
.../machine/function/map/PathObjectMap.java | 65 +++++++++++++++
.../strategy/decoration/ExplainStrategy.java | 2 +-
.../apache/tinkerpop/machine/structure/TTuple.java | 2 +
.../tinkerpop/machine/structure/util/J2Tuple.java | 5 ++
.../tinkerpop/machine/structure/util/JTuple.java | 5 ++
.../machine/traverser/path/BasicPath.java | 6 --
.../machine/traverser/path/EmptyPath.java | 5 --
.../tinkerpop/machine/traverser/path/Path.java | 7 +-
.../tinkerpop/machine/processor/pipes/Pipes.java | 6 +-
.../bytecode/compiler/BlueprintsCompiler.java | 4 +-
.../blueprints/data/BlueprintsVertex.java | 5 ++
.../{initial => flatmap}/VerticesFlatMap.java | 16 ++--
.../provider/BlueprintsVerticesStrategy.java | 2 +-
.../machine/structure/jdbc/JDBCDatabase.java | 6 ++
.../tinkerpop/machine/structure/jdbc/JDBCRow.java | 10 +++
.../tinkerpop/machine/structure/jdbc/JDBCTest.java | 2 +-
30 files changed, 209 insertions(+), 196 deletions(-)
diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java
index bcbf648fa1..1b91203b5d 100644
--- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java
+++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalSource.java
@@ -97,7 +97,7 @@ public class TraversalSource<C> implements Cloneable {
this.prepareSourceCode();
final Bytecode<C> bytecode = this.bytecode.clone();
final Coefficient<C> coefficient = this.coefficient.clone();
- bytecode.addInstruction(coefficient, Symbols.INITIAL, objects);
+ bytecode.addInstruction(coefficient, Symbols.INJECT, objects);
return new CoreTraversal<>(this.machine, bytecode, coefficient); // TODO
}
diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java
index 25157fda14..3f9895908a 100644
--- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java
+++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/TraversalUtil.java
@@ -61,10 +61,11 @@ public final class TraversalUtil {
return args;
}
- public static Object[] addObjects(final Object[] original, final Object... updates) {
- final Object[] objects = new Object[original.length + updates.length];
- System.arraycopy(original, 0, objects, 0, original.length);
- System.arraycopy(updates, 0, objects, original.length, updates.length);
+ public static Object[] addObjects(final Object head, final Object[] original, final Object... updates) {
+ final Object[] objects = new Object[original.length + updates.length + 1];
+ objects[0] = head;
+ System.arraycopy(original, 0, objects, 1, original.length);
+ System.arraycopy(updates, 0, objects, original.length+1, updates.length);
return objects;
}
}
diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java
index 86f2329dd9..35c01edeca 100644
--- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java
+++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/CoreTraversal.java
@@ -63,8 +63,7 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
@Override
public Traversal<C, S, E> by(final String byString) {
- this.bytecode.addArgs(byString);
- return this;
+ return this.by(__.value(byString));
}
@Override
@@ -232,16 +231,12 @@ public class CoreTraversal<C, S, E> extends AbstractTraversal<C, S, E> {
@Override
public <R> Traversal<C, S, R> path(final String label) {
- this.addInstruction(Symbols.PATH, label, "|");
- return (Traversal) this.addInstruction(Symbols.VALUE, label);
+ return this.addInstruction(Symbols.PATH, label);
}
@Override
public Traversal<C, S, Path> path(final String label, final String... labels) {
- this.addInstruction(Symbols.PATH, label);
- this.bytecode.addArgs((Object[]) labels);
- this.bytecode.addArgs("|");
- return (Traversal) this;
+ return this.addInstruction(Symbols.PATH,TraversalUtil.addObjects(label,labels,"|"));
}
@Override
diff --git a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java
index 77b3a40b3a..e2f973f1ea 100644
--- a/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java
+++ b/java/language/gremlin/src/main/java/org/apache/tinkerpop/language/gremlin/core/__.java
@@ -87,7 +87,7 @@ public class __ {
return __.<C, S>start().path();
}
- public static <C, S, R> Traversal<C, S, R> path(final String label) {
+ public static <C, S, E> Traversal<C, S, E> path(final String label) {
return __.<C, S>start().path(label);
}
@@ -106,4 +106,8 @@ public class __ {
public static <C, S, E> Traversal<C, S, E> union(final Traversal<C, S, E>... traversals) {
return __.<C, S>start().union(traversals);
}
+
+ public static <C, S, E> Traversal<C, S, E> value(final String key) {
+ return __.<C, S>start().value(key);
+ }
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java
index 85f87c6a8a..3931d589ea 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Argument.java
@@ -22,7 +22,6 @@ import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.traverser.Traverser;
import java.io.Serializable;
-import java.util.Arrays;
import java.util.Iterator;
/**
@@ -39,8 +38,6 @@ public interface Argument<E> extends Serializable, Cloneable {
public static <C, S, E> Argument<E> create(final Object... args) {
if (args[0] instanceof Bytecode)
return new BytecodeArgument<>((Bytecode<C>) args[0]);
- else if (args[0] instanceof String && ((String) args[0]).contains("::"))
- return new MethodArgument<>((String) args[0], Arrays.copyOfRange(args, 1, args.length));
else
return new ConstantArgument<>((E) args[0]);
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
index 50582bf775..16cf912b0b 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
@@ -21,6 +21,8 @@ package org.apache.tinkerpop.machine.bytecode.compiler;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.bytecode.Instruction;
import org.apache.tinkerpop.machine.function.CFunction;
+import org.apache.tinkerpop.machine.function.initial.FlatMapInitial;
+import org.apache.tinkerpop.machine.function.initial.Initializing;
import java.util.ArrayList;
import java.util.List;
@@ -33,7 +35,9 @@ public interface BytecodeCompiler {
public default <C> List<CFunction<C>> compile(final Bytecode<C> bytecode) {
final List<CFunction<C>> functions = new ArrayList<>();
for (final Instruction<C> instruction : bytecode.getInstructions()) {
- functions.add(this.compile(instruction));
+ final CFunction function = this.compile(instruction);
+ functions.add(functions.isEmpty() && bytecode.getParent().isEmpty() && function instanceof Initializing ?
+ new FlatMapInitial<>(function.coefficient(), function.label(), (Initializing) function) : function);
}
return functions;
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java
index b77011b1cd..69a23a4bcb 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/CoreCompiler.java
@@ -30,12 +30,12 @@ import org.apache.tinkerpop.machine.function.filter.HasKeyFilter;
import org.apache.tinkerpop.machine.function.filter.HasKeyValueFilter;
import org.apache.tinkerpop.machine.function.filter.IdentityFilter;
import org.apache.tinkerpop.machine.function.filter.IsFilter;
+import org.apache.tinkerpop.machine.function.flatmap.DbFlatMap;
import org.apache.tinkerpop.machine.function.flatmap.EntriesFlatMap;
import org.apache.tinkerpop.machine.function.flatmap.FlatMapFlatMap;
+import org.apache.tinkerpop.machine.function.flatmap.InjectFlatMap;
import org.apache.tinkerpop.machine.function.flatmap.UnfoldFlatMap;
import org.apache.tinkerpop.machine.function.flatmap.ValuesFlatMap;
-import org.apache.tinkerpop.machine.function.initial.DbInitial;
-import org.apache.tinkerpop.machine.function.initial.InitialInitial;
import org.apache.tinkerpop.machine.function.map.ConstantMap;
import org.apache.tinkerpop.machine.function.map.IncrMap;
import org.apache.tinkerpop.machine.function.map.LoopsMap;
@@ -78,7 +78,7 @@ public final class CoreCompiler implements BytecodeCompiler {
put(Symbols.HAS_KEY_VALUE, FunctionType.FILTER);
put(Symbols.IDENTITY, FunctionType.FILTER);
put(Symbols.INCR, FunctionType.MAP);
- put(Symbols.INITIAL, FunctionType.INITIAL);
+ put(Symbols.INJECT, FunctionType.FLATMAP);
put(Symbols.IS, FunctionType.FILTER);
put(Symbols.JOIN, FunctionType.BARRIER);
put(Symbols.LOOPS, FunctionType.MAP);
@@ -89,12 +89,12 @@ public final class CoreCompiler implements BytecodeCompiler {
put(Symbols.REPEAT, FunctionType.BRANCH);
put(Symbols.SUM, FunctionType.REDUCE);
put(Symbols.UNFOLD, FunctionType.FLATMAP);
- put(Symbols.V, FunctionType.FLATMAP);
put(Symbols.VALUE, FunctionType.MAP);
put(Symbols.VALUES, FunctionType.FLATMAP);
//
put(Symbols.DB, FunctionType.FLATMAP);
+ put(Symbols.V, FunctionType.FLATMAP);
}};
@Override
@@ -124,8 +124,8 @@ public final class CoreCompiler implements BytecodeCompiler {
return IdentityFilter.compile(instruction);
case Symbols.INCR:
return IncrMap.compile(instruction);
- case Symbols.INITIAL:
- return InitialInitial.compile(instruction);
+ case Symbols.INJECT:
+ return InjectFlatMap.compile(instruction);
case Symbols.IS:
return IsFilter.compile(instruction);
case Symbols.JOIN:
@@ -151,7 +151,7 @@ public final class CoreCompiler implements BytecodeCompiler {
case Symbols.VALUES:
return ValuesFlatMap.compile(instruction);
case Symbols.DB:
- return DbInitial.compile(instruction);
+ return DbFlatMap.compile(instruction);
default:
return null;
}
@@ -205,7 +205,7 @@ public final class CoreCompiler implements BytecodeCompiler {
public static final String HAS_KEY_VALUE = "hasKeyValue";
public static final String IDENTITY = "identity";
public static final String INCR = "incr";
- public static final String INITIAL = "initial";
+ public static final String INJECT = "initial";
public static final String IS = "is";
public static final String JOIN = "join";
public static final String LOOPS = "loops";
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java
index d3580d63a5..3ceca4b848 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java
@@ -23,6 +23,6 @@ package org.apache.tinkerpop.machine.bytecode.compiler;
*/
public enum FunctionType {
- BARRIER, INITIAL, MAP, FLATMAP, FILTER, REDUCE, BRANCH
+ BARRIER, MAP, FLATMAP, FILTER, REDUCE, BRANCH
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java
deleted file mode 100644
index c2aef2628c..0000000000
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/MethodArgument.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.machine.bytecode.compiler;
-
-import org.apache.tinkerpop.machine.structure.TTuple;
-import org.apache.tinkerpop.machine.traverser.Traverser;
-import org.apache.tinkerpop.machine.util.IteratorUtils;
-import org.apache.tinkerpop.machine.util.NumberHelper;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class MethodArgument<E> implements Argument<E> {
-
- private final String method;
- private final Argument[] arguments;
-
- public MethodArgument(final String method, final Object... arguments) {
- this.method = method.split("::")[1];
- this.arguments = new Argument[arguments.length];
- for (int i = 0; i < arguments.length; i++) {
- this.arguments[i] = Argument.create(arguments[i]);
- }
- }
-
- @Override
- public <C, S> E mapArg(final Traverser<C, S> traverser) {
- if (this.method.equals("object"))
- return (E) traverser.object();
- else if (this.method.equals("count"))
- return (E) traverser.coefficient().count();
- else if (this.method.equals("keys"))
- return (E) ((Map) traverser.object()).keySet();
- else if (this.method.equals("get"))
- return (E) ((TTuple) traverser.object()).value(this.arguments[0].mapArg(traverser));
- else if (this.method.equals("add"))
- return (E) NumberHelper.add((Number) traverser.object(), (Number) this.arguments[0].mapArg(traverser));
- else
- throw new RuntimeException("Unknown method");
- }
-
- @Override
- public <C, S> Iterator<E> flatMapArg(final Traverser<C, S> traverser) {
- return IteratorUtils.of(this.mapArg(traverser));
- }
-
- @Override
- public <C, S> boolean filterArg(final Traverser<C, S> traverser) {
- return false;
- }
-
- @Override
- public int hashCode() {
- return this.method.hashCode() ^ Arrays.hashCode(this.arguments);
- }
-
- @Override
- public boolean equals(final Object object) {
- return object instanceof MethodArgument &&
- this.method.equals(((MethodArgument) object).method) &&
- Arrays.equals(this.arguments, ((MethodArgument) object).arguments);
- }
-
- @Override
- public MethodArgument<E> clone() {
- return this;
- }
-
- @Override
- public String toString() {
- return this.method + "(" + Arrays.toString(this.arguments) + ")";
- }
-}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java
similarity index 70%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java
index 246f0726f2..a071ec7e5d 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/DbInitial.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/DbFlatMap.java
@@ -16,38 +16,32 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.function.initial;
+package org.apache.tinkerpop.machine.function.flatmap;
import org.apache.tinkerpop.machine.bytecode.Instruction;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
-import org.apache.tinkerpop.machine.function.InitialFunction;
-import org.apache.tinkerpop.machine.function.MapFunction;
+import org.apache.tinkerpop.machine.function.initial.Initializing;
import org.apache.tinkerpop.machine.structure.rdbms.TDatabase;
import org.apache.tinkerpop.machine.traverser.Traverser;
+import org.apache.tinkerpop.machine.util.IteratorUtils;
import org.apache.tinkerpop.machine.util.StringFactory;
import java.util.Iterator;
-import java.util.List;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class DbInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, TDatabase>, MapFunction<C, S, TDatabase> {
+public final class DbFlatMap<C, S> extends AbstractFunction<C> implements Initializing<C, S, TDatabase> {
private TDatabase database;
- private DbInitial(final Coefficient<C> coefficient, final String label, final TDatabase database) {
+ private DbFlatMap(final Coefficient<C> coefficient, final String label, final TDatabase database) {
super(coefficient, label);
this.database = database;
}
- @Override
- public Iterator<TDatabase> get() {
- return List.of(this.database).iterator();
- }
-
@Override
public int hashCode() {
return super.hashCode() ^ this.database.hashCode();
@@ -58,17 +52,17 @@ public final class DbInitial<C, S> extends AbstractFunction<C> implements Initia
return StringFactory.makeFunctionString(this, this.database);
}
- public static <C, S> DbInitial<C, S> compile(final Instruction<C> instruction) {
- return new DbInitial<>(instruction.coefficient(), instruction.label(), (TDatabase) instruction.args()[0]);
+ public static <C, S> DbFlatMap<C, S> compile(final Instruction<C> instruction) {
+ return new DbFlatMap<>(instruction.coefficient(), instruction.label(), (TDatabase) instruction.args()[0]);
}
@Override
- public TDatabase apply(final Traverser<C, S> traverser) {
- return this.database;
+ public Iterator<TDatabase> apply(final Traverser<C, S> traverser) {
+ return IteratorUtils.of(this.database);
}
@Override
- public DbInitial<C, S> clone() {
+ public DbFlatMap<C, S> clone() { // TODO
return this;
}
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java
similarity index 67%
rename from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java
rename to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java
index d0438926c3..1635b2b7c2 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/InitialInitial.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/flatmap/InjectFlatMap.java
@@ -16,12 +16,13 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.function.initial;
+package org.apache.tinkerpop.machine.function.flatmap;
import org.apache.tinkerpop.machine.bytecode.Instruction;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
-import org.apache.tinkerpop.machine.function.InitialFunction;
+import org.apache.tinkerpop.machine.function.initial.Initializing;
+import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.util.ArrayIterator;
import org.apache.tinkerpop.machine.util.StringFactory;
@@ -31,17 +32,17 @@ import java.util.Iterator;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class InitialInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, S> {
+public final class InjectFlatMap<C, S, E> extends AbstractFunction<C> implements Initializing<C, S, E> {
- private final S[] objects;
+ private final E[] objects;
- private InitialInitial(final Coefficient<C> coefficient, final String label, final S... objects) {
+ private InjectFlatMap(final Coefficient<C> coefficient, final String label, final E... objects) {
super(coefficient, label);
this.objects = objects;
}
@Override
- public Iterator<S> get() {
+ public Iterator<E> apply(Traverser<C, S> traverser) {
return new ArrayIterator<>(this.objects);
}
@@ -55,7 +56,14 @@ public final class InitialInitial<C, S> extends AbstractFunction<C> implements I
return StringFactory.makeFunctionString(this, this.objects);
}
- public static <C, S> InitialInitial<C, S> compile(final Instruction<C> instruction) {
- return new InitialInitial<>(instruction.coefficient(), instruction.label(), (S[]) instruction.args());
+ @Override
+ public InjectFlatMap<C, S, E> clone() {
+ return this; // TODO
+ }
+
+ public static <C, S, E> InjectFlatMap<C, S, E> compile(final Instruction<C> instruction) {
+ return new InjectFlatMap<>(instruction.coefficient(), instruction.label(), (E[]) instruction.args());
}
+
+
}
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
similarity index 66%
copy from java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
index 2790291eaa..2a2ca21ee3 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
@@ -16,29 +16,29 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.blueprints.function.initial;
+package org.apache.tinkerpop.machine.function.initial;
-import org.apache.tinkerpop.machine.structure.graph.TVertex;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
import org.apache.tinkerpop.machine.function.InitialFunction;
-import org.apache.tinkerpop.machine.structure.blueprints.data.BlueprintsVertex;
-import org.apache.tinkerpop.machine.util.IteratorUtils;
+import org.apache.tinkerpop.machine.traverser.species.EmptyTraverser;
import java.util.Iterator;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public class VerticesFlatMap<C> extends AbstractFunction<C> implements InitialFunction<C, TVertex> {
+public final class FlatMapInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, S> {
- public VerticesFlatMap(final Coefficient<C> coefficient, final String label) {
+ private final Initializing<C, ?, S> function;
+
+ public FlatMapInitial(final Coefficient<C> coefficient, final String label, final Initializing<C, ?, S> function) {
super(coefficient, label);
+ this.function = function;
}
@Override
- public Iterator<TVertex> get() {
- return IteratorUtils.of(new BlueprintsVertex(), new BlueprintsVertex());
+ public Iterator<S> get() {
+ return this.function.apply(EmptyTraverser.instance());
}
-
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/Initializing.java
similarity index 82%
copy from java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java
copy to java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/Initializing.java
index d3580d63a5..782e1f3a58 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/FunctionType.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/Initializing.java
@@ -16,13 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.bytecode.compiler;
+package org.apache.tinkerpop.machine.function.initial;
+
+import org.apache.tinkerpop.machine.function.FlatMapFunction;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public enum FunctionType {
-
- BARRIER, INITIAL, MAP, FLATMAP, FILTER, REDUCE, BRANCH
-
+public interface Initializing<C, S, E> extends FlatMapFunction<C, S, E> {
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java
index 7702568b6d..5aac466d1d 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathMap.java
@@ -29,6 +29,7 @@ import org.apache.tinkerpop.machine.traverser.path.BasicPath;
import org.apache.tinkerpop.machine.traverser.path.Path;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
/**
@@ -82,20 +83,25 @@ public final class PathMap<C, S> extends AbstractFunction<C> implements MapFunct
return clone;
}
- public static <C, S> PathMap<C, S> compile(final Instruction<C> instruction) {
- final List<String> labels = new ArrayList<>();
- final List<Compilation<C, Object, Object>> compilations = new ArrayList<>();
- boolean processingLabels = true;
- for (final Object arg : instruction.args()) {
- if (arg.equals("|")) {
- processingLabels = false;
- continue;
+ public static <C, S, E> MapFunction<C, S, E> compile(final Instruction<C> instruction) {
+ if (Arrays.stream(instruction.args()).anyMatch("|"::equals)) {
+ final List<String> labels = new ArrayList<>();
+ final List<Compilation<C, Object, Object>> compilations = new ArrayList<>();
+ boolean processingLabels = true;
+ for (final Object arg : instruction.args()) {
+ if (arg.equals("|")) {
+ processingLabels = false;
+ continue;
+ }
+ if (processingLabels)
+ labels.add((String) arg);
+ else
+ compilations.add(Compilation.compile(arg));
}
- if (processingLabels)
- labels.add((String) arg);
- else
- compilations.add(Compilation.compile(arg));
+ return (MapFunction<C, S, E>) new PathMap<>(instruction.coefficient(), instruction.label(), labels, compilations);
+ } else {
+ return PathObjectMap.compile(instruction);
}
- return new PathMap<>(instruction.coefficient(), instruction.label(), labels, compilations);
+
}
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathObjectMap.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathObjectMap.java
new file mode 100644
index 0000000000..b124ac1f5b
--- /dev/null
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/map/PathObjectMap.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.function.map;
+
+import org.apache.tinkerpop.machine.bytecode.Instruction;
+import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
+import org.apache.tinkerpop.machine.coefficient.Coefficient;
+import org.apache.tinkerpop.machine.function.AbstractFunction;
+import org.apache.tinkerpop.machine.function.MapFunction;
+import org.apache.tinkerpop.machine.traverser.Traverser;
+import org.apache.tinkerpop.machine.traverser.path.Path;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class PathObjectMap<C, S, E> extends AbstractFunction<C> implements MapFunction<C, S, E> {
+
+ private final String pathLabel;
+ private Compilation<C, Object, Object> byCompilation;
+
+ private PathObjectMap(final Coefficient<C> coefficient, final String label, final String pathLabel, final Compilation<C, Object, Object> byCompilation) {
+ super(coefficient, label);
+ this.pathLabel = pathLabel;
+ this.byCompilation = byCompilation;
+ }
+
+ @Override
+ public E apply(final Traverser<C, S> traverser) {
+ final Object object = traverser.path().get(Path.Pop.last, this.pathLabel);
+ return (E) (null == this.byCompilation ? object : this.byCompilation.mapObject(object).object());
+ }
+
+
+ @Override
+ public int hashCode() {
+ return super.hashCode() ^ this.pathLabel.hashCode() ^ (null == this.byCompilation ? 1 : this.byCompilation.hashCode());
+ }
+
+ @Override
+ public PathObjectMap<C, S, E> clone() {
+ final PathObjectMap<C, S, E> clone = (PathObjectMap<C, S, E>) super.clone();
+ clone.byCompilation = null == this.byCompilation ? null : this.byCompilation.clone();
+ return clone;
+ }
+
+ public static <C, S, E> PathObjectMap<C, S, E> compile(final Instruction<C> instruction) {
+ return new PathObjectMap<>(instruction.coefficient(), instruction.label(), (String) instruction.args()[0], Compilation.compileOrNull(1, instruction.args()));
+ }
+}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java
index d60cfff907..65e02cb5fe 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/strategy/decoration/ExplainStrategy.java
@@ -50,7 +50,7 @@ public final class ExplainStrategy extends AbstractStrategy<Strategy.DecorationS
bytecode.getInstructions().clear();
bytecode.addInstruction(
(Coefficient<C>) LongCoefficient.create(),
- Symbols.INITIAL,
+ Symbols.INJECT,
ExplainStrategy.explainBytecode(clone));
}
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java
index c324caf4ba..cc4763df55 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/TTuple.java
@@ -41,6 +41,8 @@ public interface TTuple<K, V> {
public void remove(final K key);
+ public int size();
+
public Iterator<T2Tuple<K, V>> entries();
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/J2Tuple.java
index e94e138407..aeffd07074 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
@@ -65,6 +65,11 @@ public final class J2Tuple<K, V> implements T2Tuple<K, V> {
throw new IllegalStateException("Can't remove key/value for a 2-tuple");
}
+ @Override
+ public int size() {
+ return 1;
+ }
+
@Override
public Iterator<T2Tuple<K, V>> entries() {
return IteratorUtils.of(this);
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/util/JTuple.java
index 7f59f9a656..5966aa2c32 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
@@ -69,6 +69,11 @@ public class JTuple<K, V> implements TTuple<K, V> {
this.map.remove(key);
}
+ @Override
+ public int size() {
+ return this.map.size();
+ }
+
@Override
public Iterator<T2Tuple<K, V>> entries() {
return IteratorUtils.map(this.map.entrySet().iterator(), e -> new J2Tuple<>(e.getKey(), e.getValue()));
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java
index 19c3736162..5b7f0781a1 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/BasicPath.java
@@ -19,7 +19,6 @@
package org.apache.tinkerpop.machine.traverser.path;
import org.apache.tinkerpop.machine.structure.util.T2Tuple;
-import org.apache.tinkerpop.machine.util.IteratorUtils;
import java.util.ArrayList;
import java.util.Iterator;
@@ -41,11 +40,6 @@ public final class BasicPath implements Path {
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);
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 b3b0a6d17d..e3039f1177 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
@@ -39,11 +39,6 @@ public final class EmptyPath implements Path {
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) {
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 cd911b504b..0d06f73a0d 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/traverser/path/Path.java
@@ -25,7 +25,7 @@ import java.io.Serializable;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface Path extends Serializable, Cloneable, TTuple<String,Object> {
+public interface Path extends Serializable, Cloneable, TTuple<String, Object> {
public enum Pop {
first, last, all;
@@ -39,6 +39,11 @@ public interface Path extends Serializable, Cloneable, TTuple<String,Object> {
public Object get(final Pop pop, final String label);
+ @Override
+ public default Object value(final String key) {
+ return this.get(Pop.last, key);
+ }
+
public int size();
public Path clone();
diff --git a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java
index f93f644ad6..cc5a4cfb1f 100644
--- a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java
+++ b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java
@@ -59,9 +59,7 @@ public final class Pipes<C, S, E> implements Processor<C, S, E> {
previousStep = this.startStep;
}
- if (this.steps.isEmpty() && function instanceof InitialFunction)
- nextStep = new InitialStep<>((InitialFunction<C, S>) function, compilation.getTraverserFactory()); // TODO: this is a hack for DB
- else if (function instanceof RepeatBranch)
+ if (function instanceof RepeatBranch)
nextStep = new RepeatStep<>(previousStep, (RepeatBranch<C, S>) function);
else if (function instanceof BranchFunction)
nextStep = new BranchStep<>(previousStep, (BranchFunction<C, S, E>) function);
@@ -71,6 +69,8 @@ public final class Pipes<C, S, E> implements Processor<C, S, E> {
nextStep = new FlatMapStep<>(previousStep, (FlatMapFunction<C, S, E>) function);
else if (function instanceof MapFunction)
nextStep = new MapStep<>(previousStep, (MapFunction<C, S, E>) function);
+ else if (function instanceof InitialFunction)
+ nextStep = new InitialStep<>((InitialFunction<C, S>) function, compilation.getTraverserFactory());
else if (function instanceof BarrierFunction)
nextStep = new BarrierStep<>(previousStep, (BarrierFunction<C, S, E, Object>) function, compilation.getTraverserFactory());
else if (function instanceof ReduceFunction)
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java
index 06f77c155d..eb3dc6c991 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java
+++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/bytecode/compiler/BlueprintsCompiler.java
@@ -23,7 +23,7 @@ import org.apache.tinkerpop.machine.bytecode.compiler.BytecodeCompiler;
import org.apache.tinkerpop.machine.bytecode.compiler.FunctionType;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.CFunction;
-import org.apache.tinkerpop.machine.structure.blueprints.function.initial.VerticesFlatMap;
+import org.apache.tinkerpop.machine.structure.blueprints.function.flatmap.VerticesFlatMap;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -53,7 +53,7 @@ public final class BlueprintsCompiler implements BytecodeCompiler {
@Override
public FunctionType getFunctionType(final String op) {
- return op.equals(Symbols.BP_V) ? FunctionType.INITIAL : null;
+ return op.equals(Symbols.BP_V) ? FunctionType.FLATMAP : null;
}
public static class Symbols {
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/data/BlueprintsVertex.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/data/BlueprintsVertex.java
index fa08d2485d..120533e00c 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
@@ -68,6 +68,11 @@ public class BlueprintsVertex<V> implements TVertex<V>, Serializable {
}
+ @Override
+ public int size() {
+ return 0;
+ }
+
@Override
public V value(String key) {
return (V) "marko";
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/flatmap/VerticesFlatMap.java
similarity index 79%
rename from java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
rename to java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/flatmap/VerticesFlatMap.java
index 2790291eaa..0f9c2e799e 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/initial/VerticesFlatMap.java
+++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/function/flatmap/VerticesFlatMap.java
@@ -16,13 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.machine.structure.blueprints.function.initial;
+package org.apache.tinkerpop.machine.structure.blueprints.function.flatmap;
-import org.apache.tinkerpop.machine.structure.graph.TVertex;
import org.apache.tinkerpop.machine.coefficient.Coefficient;
import org.apache.tinkerpop.machine.function.AbstractFunction;
-import org.apache.tinkerpop.machine.function.InitialFunction;
+import org.apache.tinkerpop.machine.function.FlatMapFunction;
import org.apache.tinkerpop.machine.structure.blueprints.data.BlueprintsVertex;
+import org.apache.tinkerpop.machine.structure.graph.TVertex;
+import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.util.IteratorUtils;
import java.util.Iterator;
@@ -30,15 +31,20 @@ import java.util.Iterator;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public class VerticesFlatMap<C> extends AbstractFunction<C> implements InitialFunction<C, TVertex> {
+public class VerticesFlatMap<C, S> extends AbstractFunction<C> implements FlatMapFunction<C, S, TVertex> {
public VerticesFlatMap(final Coefficient<C> coefficient, final String label) {
super(coefficient, label);
}
@Override
- public Iterator<TVertex> get() {
+ public Iterator<TVertex> apply(final Traverser<C, S> traverser) {
return IteratorUtils.of(new BlueprintsVertex(), new BlueprintsVertex());
}
+ @Override
+ public VerticesFlatMap<C, S> clone() {
+ return this; // TODO;
+ }
+
}
diff --git a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java
index 8cbe34fa94..6b18d77d66 100644
--- a/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java
+++ b/java/machine/structure/blueprints/src/main/java/org/apache/tinkerpop/machine/structure/blueprints/strategy/provider/BlueprintsVerticesStrategy.java
@@ -38,6 +38,6 @@ public class BlueprintsVerticesStrategy extends AbstractStrategy<Strategy.Provid
temp = instruction;
}
if (null != temp)
- BytecodeUtil.replaceInstruction(bytecode, temp, new Instruction<>(temp.coefficient(), BlueprintsCompiler.Symbols.BP_V));
+ BytecodeUtil.replaceInstruction(bytecode, temp, new Instruction<>(temp.coefficient(), BlueprintsCompiler.Symbols.BP_V)); // TODO: as(label)
}
}
diff --git a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java
index ed57e74c5e..b04e89444e 100644
--- a/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java
+++ b/java/machine/structure/jdbc/src/main/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCDatabase.java
@@ -22,6 +22,7 @@ import org.apache.tinkerpop.machine.structure.rdbms.TDatabase;
import org.apache.tinkerpop.machine.structure.rdbms.TTable;
import org.apache.tinkerpop.machine.structure.util.J2Tuple;
import org.apache.tinkerpop.machine.structure.util.T2Tuple;
+import org.apache.tinkerpop.machine.util.IteratorUtils;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -82,6 +83,11 @@ final class JDBCDatabase implements TDatabase {
}
}
+ @Override
+ public int size() {
+ return (int) IteratorUtils.count(this.entries());
+ }
+
@Override
public Iterator<T2Tuple<String, TTable>> entries() {
try {
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 259155373b..36d2c9607c 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
@@ -100,6 +100,16 @@ final class JDBCRow<V> implements TRow<V> {
}
}
+ @Override
+ public int size() {
+ try {
+ this.rows.absolute(this.rowId);
+ return this.rows.getMetaData().getColumnCount();
+ } catch (final SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
@Override
public Iterator<T2Tuple<String, V>> entries() {
try {
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 242bba7c2a..6429f078ad 100644
--- a/java/machine/structure/jdbc/src/test/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTest.java
+++ b/java/machine/structure/jdbc/src/test/java/org/apache/tinkerpop/machine/structure/jdbc/JDBCTest.java
@@ -67,6 +67,6 @@ public class JDBCTest {
System.out.println(jdbc.db().values("people").toList());
System.out.println(jdbc.db().values("people").value("name").toList());
System.out.println(jdbc.db().values("people").entries().toList());
- System.out.println(jdbc.db().values("people").as("x").db().values("people").has("name", __.path("x").value("name")).as("y").path("x", "y").toList());
+ System.out.println(jdbc.db().values("people").as("x").db().values("people").has("name", __.path("x").by("name")).as("y").path("x", "y").toList());
}
}
(tinkerpop) 11/13: added hashCode() and toString() to FlatMapInitial.
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 57dfb646ffbc466f964aaf04bcab9f42b1350c61
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Mon Apr 29 16:41:52 2019 -0600
added hashCode() and toString() to FlatMapInitial.
---
.../tinkerpop/machine/function/initial/FlatMapInitial.java | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
index 2a2ca21ee3..66afefb1c4 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
@@ -22,6 +22,7 @@ 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.traverser.species.EmptyTraverser;
+import org.apache.tinkerpop.machine.util.StringFactory;
import java.util.Iterator;
@@ -41,4 +42,14 @@ public final class FlatMapInitial<C, S> extends AbstractFunction<C> implements I
public Iterator<S> get() {
return this.function.apply(EmptyTraverser.instance());
}
+
+ @Override
+ public int hashCode() {
+ return super.hashCode() ^ this.function.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return StringFactory.makeFunctionString(this, this.function);
+ }
}
(tinkerpop) 02/13: Processor no longer implement Iterator. It now supports both a push-based and a pull-based execution via subscribe(Consumer) and iterator(), respectively. I haven't done this properly for Beam as I need to rework TraverserServer. Also, need to think about how to use Compilation within a push-based system so that local/nested traversals don't block on iterator.next().
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 2cf7cdfed05234a22b29a124c6617fb45bf5e7de
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Tue Apr 23 04:38:15 2019 -0600
Processor no longer implement Iterator. It now supports both a push-based and a pull-based execution via subscribe(Consumer) and iterator(), respectively. I haven't done this properly for Beam as I need to rework TraverserServer. Also, need to think about how to use Compilation within a push-based system so that local/nested traversals don't block on iterator.next().
---
.../machine/bytecode/compiler/Compilation.java | 39 +++++++------
.../machine/processor/EmptyProcessor.java | 16 ++++--
.../machine/processor/FilterProcessor.java | 7 ++-
.../machine/processor/LoopsProcessor.java | 5 +-
.../tinkerpop/machine/processor/Processor.java | 45 +++++++++++++--
.../machine/processor/SimpleProcessor.java | 44 +++++++++++----
.../tinkerpop/machine/species/BasicMachine.java | 3 +-
.../tinkerpop/machine/species/LocalMachine.java | 5 +-
.../tinkerpop/machine/util/IteratorUtils.java | 35 +++++++++++-
.../tinkerpop/machine/processor/beam/Beam.java | 43 ++++++++++----
.../machine/processor/pipes/BranchStep.java | 4 +-
.../tinkerpop/machine/processor/pipes/Pipes.java | 45 +++++++++++----
.../machine/processor/pipes/RepeatStep.java | 22 +++++---
.../machine/processor/rxjava/AbstractRxJava.java | 65 ++++++++++++++++------
.../machine/processor/rxjava/ParallelRxJava.java | 31 +++++------
.../machine/processor/rxjava/SerialRxJava.java | 15 +++--
16 files changed, 305 insertions(+), 119 deletions(-)
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java
index 32a04e449c..f7105d988d 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/Compilation.java
@@ -28,6 +28,7 @@ import org.apache.tinkerpop.machine.structure.EmptyStructure;
import org.apache.tinkerpop.machine.structure.StructureFactory;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.TraverserFactory;
+import org.apache.tinkerpop.machine.util.IteratorUtils;
import java.io.Serializable;
import java.util.ArrayList;
@@ -75,53 +76,51 @@ public final class Compilation<C, S, E> implements Serializable, Cloneable {
}
public Processor<C, S, E> getProcessor() {
- if (null == this.processor)
- this.processor = this.processorFactory.mint(this);
+ this.prepareProcessor();
return this.processor;
}
private void prepareProcessor() {
if (null == this.processor)
this.processor = this.processorFactory.mint(this);
- else
- this.processor.reset();
}
- private Traverser<C, S> prepareTraverser(final Traverser<C, S> traverser) {
+ private Iterator<Traverser<C, S>> prepareTraverser(final Traverser<C, S> traverser) {
final Traverser<C, S> clone = traverser.clone();
clone.coefficient().unity();
- return clone;
+ return IteratorUtils.of(clone);
}
public Traverser<C, E> mapTraverser(final Traverser<C, S> traverser) {
this.prepareProcessor();
- this.processor.addStart(this.prepareTraverser(traverser));
- if (!this.processor.hasNext())
+ final Iterator<Traverser<C, E>> iterator = this.processor.iterator(this.prepareTraverser(traverser));
+ if (!iterator.hasNext())
throw new RuntimeException("The nested traversal is not a map function: " + this);
- return this.processor.next();
+ final Traverser<C, E> result = iterator.next();
+ this.processor.stop();
+ return result;
}
public Traverser<C, E> mapObject(final S object) {
this.prepareProcessor();
- this.processor.addStart(this.traverserFactory.create(this.functions.get(0), object));
- return this.processor.next();
+ final Iterator<Traverser<C, E>> iterator = this.processor.iterator(this.prepareTraverser(this.traverserFactory.create(this.functions.get(0), object)));
+ final Traverser<C, E> result = iterator.next();
+ this.processor.stop();
+ return result;
}
public Iterator<Traverser<C, E>> flatMapTraverser(final Traverser<C, S> traverser) {
this.prepareProcessor();
- this.processor.addStart(this.prepareTraverser(traverser));
- return this.processor;
+ final Iterator<Traverser<C, E>> iterator = this.processor.iterator(this.prepareTraverser(traverser));
+ return IteratorUtils.onLast(iterator, () -> processor.stop());
}
public boolean filterTraverser(final Traverser<C, S> traverser) {
this.prepareProcessor();
- this.processor.addStart(this.prepareTraverser(traverser));
- return this.processor.hasNext();
- }
-
- public Processor<C, S, E> addTraverser(final Traverser<C, S> traverser) {
- this.getProcessor().addStart(traverser);
- return this.processor;
+ final Iterator<Traverser<C, E>> iterator = this.processor.iterator(this.prepareTraverser(traverser));
+ final boolean hasNext = iterator.hasNext();
+ this.processor.stop();
+ return hasNext;
}
public List<CFunction<C>> getFunctions() {
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java
index 127f028fa8..d3da9cbecc 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/EmptyProcessor.java
@@ -22,6 +22,10 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.util.FastNoSuchElementException;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.function.Consumer;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -34,22 +38,22 @@ public final class EmptyProcessor<C, S, E> implements Processor<C, S, E>, Proces
}
@Override
- public void addStart(final Traverser<C, S> traverser) {
+ public void stop() {
}
@Override
- public Traverser<C, E> next() {
- throw FastNoSuchElementException.instance();
+ public boolean isRunning() {
+ return false;
}
@Override
- public boolean hasNext() {
- return false;
+ public Iterator<Traverser<C, E>> iterator(final Iterator<Traverser<C,S>> starts) {
+ return Collections.emptyIterator();
}
@Override
- public void reset() {
+ public void subscribe(final Iterator<Traverser<C,S>> starts, final Consumer<Traverser<C, E>> consumer) {
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/FilterProcessor.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/FilterProcessor.java
index 1a23279eb3..a83e0d94df 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/FilterProcessor.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/FilterProcessor.java
@@ -20,6 +20,8 @@ package org.apache.tinkerpop.machine.processor;
import org.apache.tinkerpop.machine.traverser.Traverser;
+import java.util.Iterator;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -32,9 +34,8 @@ public final class FilterProcessor<C, S> extends SimpleProcessor<C, S, S> {
}
@Override
- public void addStart(final Traverser<C, S> traverser) {
+ protected void processTraverser(Iterator<Traverser<C, S>> starts) {
if (this.allow)
- this.traverser = traverser;
+ this.traverser = starts.next();
}
-
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/LoopsProcessor.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/LoopsProcessor.java
index d367356c1c..25a44e1cc5 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/LoopsProcessor.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/LoopsProcessor.java
@@ -20,6 +20,8 @@ package org.apache.tinkerpop.machine.processor;
import org.apache.tinkerpop.machine.traverser.Traverser;
+import java.util.Iterator;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -32,7 +34,8 @@ public final class LoopsProcessor<C, S> extends SimpleProcessor<C, S, S> {
}
@Override
- public void addStart(final Traverser<C, S> traverser) {
+ protected void processTraverser(final Iterator<Traverser<C, S>> starts) {
+ final Traverser<C, S> traverser = starts.next();
this.traverser = traverser.loops() == this.loops ? traverser : null;
}
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java
index 282d1a5753..6196de4eb4 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/Processor.java
@@ -19,19 +19,54 @@
package org.apache.tinkerpop.machine.processor;
import org.apache.tinkerpop.machine.traverser.Traverser;
+import org.apache.tinkerpop.machine.util.IteratorUtils;
import java.util.Iterator;
+import java.util.function.Consumer;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface Processor<C, S, E> extends Iterator<Traverser<C, E>> {
+public interface Processor<C, S, E> {
- public void addStart(final Traverser<C, S> traverser);
+ /**
+ * A processor is started using {@link Processor#iterator(Iterator)} or {@link Processor#subscribe(Iterator, Consumer)}.
+ * When the iterator is empty or the subscriber has no more traversers to consume, then the process is no longer running.
+ *
+ * @return whether the processor is running
+ */
+ public boolean isRunning();
- public Traverser<C, E> next();
+ /**
+ * When a processor is stopped, subscriptions and iteration are halted.
+ */
+ public void stop();
- public boolean hasNext();
+ /**
+ * Start the processor and return a pull-based iterator.
+ * If pull-based iteration is used, then push-based subscription can not be used while the processor is running.
+ *
+ * @return an iterator of traverser results
+ */
+ public Iterator<Traverser<C, E>> iterator(final Iterator<Traverser<C, S>> starts);
+
+ public default Iterator<Traverser<C, E>> iterator(final Traverser<C, S> start) {
+ return this.iterator(IteratorUtils.of(start));
+ }
+
+ /**
+ * Start the processor and process the resultant traversers using the push-based consumer.
+ * If push-based subscription is used, then pull-based iteration can not be used while the processor is running.
+ *
+ * @param consumer a consumer of traversers results
+ */
+ public void subscribe(final Iterator<Traverser<C, S>> starts, final Consumer<Traverser<C, E>> consumer);
+
+ public class Exceptions {
+
+ public static IllegalStateException processorIsCurrentlyRunning(final Processor processor) {
+ return new IllegalStateException("The processor can not be started because it is currently running: " + processor);
+ }
+ }
- public void reset();
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/SimpleProcessor.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/SimpleProcessor.java
index 1052891722..e2a0955514 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/SimpleProcessor.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/processor/SimpleProcessor.java
@@ -22,6 +22,9 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.util.FastNoSuchElementException;
+import java.util.Iterator;
+import java.util.function.Consumer;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -30,23 +33,42 @@ public abstract class SimpleProcessor<C, S, E> implements Processor<C, S, E>, Pr
protected Traverser<C, E> traverser = null;
@Override
- public Traverser<C, E> next() {
- if (null == this.traverser)
- throw FastNoSuchElementException.instance();
- else {
- final Traverser<C, E> temp = this.traverser;
- this.traverser = null;
- return temp;
- }
+ public void stop() {
+ this.traverser = null;
}
@Override
- public boolean hasNext() {
+ public boolean isRunning() {
return null != this.traverser;
}
@Override
- public void reset() {
+ public Iterator<Traverser<C, E>> iterator(final Iterator<Traverser<C, S>> starts) {
+ this.processTraverser(starts);
+ return new Iterator<>() {
+ @Override
+ public boolean hasNext() {
+ return null != traverser;
+ }
+
+ @Override
+ public Traverser<C, E> next() {
+ if (null == traverser)
+ throw FastNoSuchElementException.instance();
+ else {
+ final Traverser<C, E> temp = traverser;
+ traverser = null;
+ return temp;
+ }
+ }
+ };
+ }
+
+ @Override
+ public void subscribe(final Iterator<Traverser<C, S>> starts, final Consumer<Traverser<C, E>> consumer) {
+ this.processTraverser(starts);
+ if (null != this.traverser)
+ consumer.accept(this.traverser);
this.traverser = null;
}
@@ -54,4 +76,6 @@ public abstract class SimpleProcessor<C, S, E> implements Processor<C, S, E>, Pr
public <D, T, F> Processor<D, T, F> mint(final Compilation<D, T, F> compilation) {
return (Processor<D, T, F>) this;
}
+
+ protected abstract void processTraverser(final Iterator<Traverser<C, S>> starts);
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/species/BasicMachine.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/species/BasicMachine.java
index 5dbe4aa8e4..386353ad0c 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/species/BasicMachine.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/species/BasicMachine.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.machine.bytecode.Bytecode;
import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.traverser.Traverser;
+import java.util.Collections;
import java.util.Iterator;
/**
@@ -46,7 +47,7 @@ public final class BasicMachine implements Machine {
@Override
public <C, E> Iterator<Traverser<C, E>> submit(final Bytecode<C> bytecode) {
- return Compilation.<C, Object, E>compile(bytecode).getProcessor();
+ return Compilation.<C, Object, E>compile(bytecode).getProcessor().iterator(Collections.emptyIterator());
}
public static Machine open() {
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/species/LocalMachine.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/species/LocalMachine.java
index cf3e221700..e1b9126532 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/species/LocalMachine.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/species/LocalMachine.java
@@ -26,6 +26,7 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.bytecode.compiler.SourceCompilation;
import org.apache.tinkerpop.machine.traverser.Traverser;
+import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import java.util.Optional;
@@ -76,8 +77,8 @@ public final class LocalMachine implements Machine {
final UUID sourceId = LocalMachine.getSourceId(bytecode).orElse(null);
final SourceCompilation<C> source = (SourceCompilation<C>) this.sources.get(sourceId);
return null == source ?
- Compilation.<C, Object, E>compile(bytecode).getProcessor() :
- Compilation.<C, Object, E>compile(source, bytecode).getProcessor();
+ Compilation.<C, Object, E>compile(bytecode).getProcessor().iterator(Collections.emptyIterator()) :
+ Compilation.<C, Object, E>compile(source, bytecode).getProcessor().iterator(Collections.emptyIterator());
}
@Override
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/util/IteratorUtils.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/util/IteratorUtils.java
index 439f635e02..d1bf2dfad6 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/util/IteratorUtils.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/util/IteratorUtils.java
@@ -75,7 +75,40 @@ public final class IteratorUtils {
return ix;
}
- public static final long count(final Iterable iterable) {
+ public static <S> Iterator<S> onLast(final Iterator<S> iterator, final Runnable onLast) {
+ return new Iterator<>() {
+ boolean lastExecuted = false;
+
+ @Override
+ public boolean hasNext() {
+ final boolean hasNext = iterator.hasNext();
+ if (!hasNext && !this.lastExecuted) {
+ this.lastExecuted = true;
+ onLast.run();
+ }
+ return hasNext;
+ }
+
+ @Override
+ public void remove() {
+ iterator.remove();
+ }
+
+ @Override
+ public S next() {
+ try {
+ return iterator.next();
+ } finally {
+ if (!iterator.hasNext() && !this.lastExecuted) {
+ this.lastExecuted = true;
+ onLast.run();
+ }
+ }
+ }
+ };
+ }
+
+ public static long count(final Iterable iterable) {
return IteratorUtils.count(iterable.iterator());
}
diff --git a/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/Beam.java b/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/Beam.java
index ee235a705a..20007c4219 100644
--- a/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/Beam.java
+++ b/java/machine/processor/beam/src/main/java/org/apache/tinkerpop/machine/processor/beam/Beam.java
@@ -50,12 +50,14 @@ import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.TraverserFactory;
import org.apache.tinkerpop.machine.traverser.species.EmptyTraverser;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.function.Consumer;
import java.util.stream.Collectors;
/**
@@ -85,25 +87,46 @@ public class Beam<C, S, E> implements Processor<C, S, E> {
}
@Override
- public void addStart(final Traverser<C, S> traverser) {
- // TODO: use side-inputs
+ public void stop() {
+ try {
+ if (null != this.pipelineResult)
+ this.pipelineResult.cancel();
+ } catch (final IOException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ this.pipelineResult = null;
+ this.iterator = null;
}
@Override
- public Traverser<C, E> next() {
- this.setupPipeline();
- return this.iterator.next();
+ public boolean isRunning() {
+ return null != this.pipelineResult && !this.pipelineResult.getState().isTerminal();
}
@Override
- public boolean hasNext() {
- this.setupPipeline();
- return this.iterator.hasNext();
+ public Iterator<Traverser<C, E>> iterator(final Iterator<Traverser<C, S>> starts) { // TODO: use side-inputs for starts
+ if (this.isRunning())
+ throw Processor.Exceptions.processorIsCurrentlyRunning(this);
+ return new Iterator<>() {
+ @Override
+ public boolean hasNext() {
+ setupPipeline();
+ return iterator.hasNext();
+ }
+
+ @Override
+ public Traverser<C, E> next() {
+ setupPipeline();
+ return iterator.next();
+ }
+ };
}
@Override
- public void reset() {
- this.iterator = null;
+ public void subscribe(final Iterator<Traverser<C, S>> starts, final Consumer<Traverser<C, E>> consumer) { // TODO: use side-inputs for starts
+ if (this.isRunning())
+ throw Processor.Exceptions.processorIsCurrentlyRunning(this);
+ // TODO: create an IteratorOutputFn and a ConsumerOutputFn and connect in setupPipeline()
}
@Override
diff --git a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/BranchStep.java b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/BranchStep.java
index 667af99d4f..75d66a6f11 100644
--- a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/BranchStep.java
+++ b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/BranchStep.java
@@ -66,13 +66,13 @@ final class BranchStep<C, S, E, M> extends AbstractStep<C, S, E> {
if (entry.getKey().filterTraverser(traverser)) {
found = true;
for (final Compilation<C, S, E> branch : entry.getValue()) {
- ((MultiIterator<Traverser<C, E>>) this.nextTraversers).addIterator(branch.addTraverser(traverser.clone()));
+ ((MultiIterator<Traverser<C, E>>) this.nextTraversers).addIterator(branch.getProcessor().iterator(traverser.clone()));
}
}
}
if (!found) {
for (final Compilation<C, S, E> defaultBranch : this.defaultBranches) {
- ((MultiIterator<Traverser<C, E>>) this.nextTraversers).addIterator(defaultBranch.addTraverser(traverser.clone()));
+ ((MultiIterator<Traverser<C, E>>) this.nextTraversers).addIterator(defaultBranch.getProcessor().iterator(traverser.clone()));
}
}
}
diff --git a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/Pipes.java
index e370c58c74..9f3c7c88c7 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
@@ -31,9 +31,13 @@ import org.apache.tinkerpop.machine.function.branch.RepeatBranch;
import org.apache.tinkerpop.machine.processor.Processor;
import org.apache.tinkerpop.machine.processor.pipes.util.InMemoryReducer;
import org.apache.tinkerpop.machine.traverser.Traverser;
+import org.apache.tinkerpop.machine.util.IteratorUtils;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -43,6 +47,7 @@ public final class Pipes<C, S, E> implements Processor<C, S, E> {
private final List<Step<?, ?, ?>> steps = new ArrayList<>();
private Step<C, ?, E> endStep;
private SourceStep<C, S> startStep;
+ private AtomicBoolean alive = new AtomicBoolean(Boolean.FALSE);
public Pipes(final Compilation<C, S, E> compilation) {
Step<C, ?, S> previousStep = EmptyStep.instance();
@@ -81,25 +86,45 @@ public final class Pipes<C, S, E> implements Processor<C, S, E> {
}
@Override
- public void addStart(final Traverser<C, S> traverser) {
- this.startStep.addStart(traverser);
+ public void stop() {
+ this.alive.set(Boolean.FALSE);
+ for (final Step<?, ?, ?> step : this.steps) {
+ step.reset();
+ }
}
@Override
- public Traverser<C, E> next() {
- return this.endStep.next();
+ public boolean isRunning() {
+ return this.alive.get();
}
@Override
- public boolean hasNext() {
- return this.endStep.hasNext();
+ public Iterator<Traverser<C, E>> iterator(final Iterator<Traverser<C, S>> starts) {
+
+ if (this.isRunning())
+ throw Processor.Exceptions.processorIsCurrentlyRunning(this);
+
+ this.alive.set(Boolean.TRUE);
+ if (null != this.startStep)
+ starts.forEachRemaining(this.startStep::addStart);
+ return IteratorUtils.onLast(this.endStep, () -> this.alive.set(Boolean.FALSE));
}
+
@Override
- public void reset() {
- for (final Step<?, ?, ?> step : this.steps) {
- step.reset();
- }
+ public void subscribe(final Iterator<Traverser<C, S>> starts, final Consumer<Traverser<C, E>> consumer) {
+ if (this.isRunning())
+ throw Processor.Exceptions.processorIsCurrentlyRunning(this);
+
+ this.alive.set(Boolean.TRUE);
+ new Thread(() -> {
+ final Iterator<Traverser<C, E>> iterator = this.iterator(starts);
+ while (iterator.hasNext()) {
+ if (!this.alive.get())
+ break;
+ consumer.accept(iterator.next());
+ }
+ }).start();
}
@Override
diff --git a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/RepeatStep.java b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/RepeatStep.java
index 8dc25f3958..4c5fa5d057 100644
--- a/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/RepeatStep.java
+++ b/java/machine/processor/pipes/src/main/java/org/apache/tinkerpop/machine/processor/pipes/RepeatStep.java
@@ -22,6 +22,10 @@ import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
import org.apache.tinkerpop.machine.function.branch.RepeatBranch;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.TraverserSet;
+import org.apache.tinkerpop.machine.util.IteratorUtils;
+
+import java.util.Collections;
+import java.util.Iterator;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -34,6 +38,8 @@ final class RepeatStep<C, S> extends AbstractStep<C, S, S> {
private final Compilation<C, S, ?> untilCompilation;
private final Compilation<C, S, ?> emitCompilation;
private final Compilation<C, S, S> repeat;
+ private Iterator<Traverser<C, S>> repeatIterator = Collections.emptyIterator();
+ private TraverserSet<C, S> repeatStarts = new TraverserSet<>();
private TraverserSet<C, S> outputTraversers = new TraverserSet<>();
private TraverserSet<C, S> inputTraversers = new TraverserSet<>();
private final boolean hasStartPredicates;
@@ -72,19 +78,19 @@ final class RepeatStep<C, S> extends AbstractStep<C, S, S> {
this.outputTraversers.add(traverser);
} else if (2 == this.emitLocation && this.emitCompilation.filterTraverser(traverser)) {
this.outputTraversers.add(traverser.repeatDone(this.repeatBranch));
- this.repeat.addTraverser(traverser);
+ this.repeatStarts.add(traverser);
} else
- this.repeat.addTraverser(traverser);
+ this.repeatStarts.add(traverser);
} else if (1 == this.emitLocation) {
if (this.emitCompilation.filterTraverser(traverser))
this.outputTraversers.add(traverser.repeatDone(this.repeatBranch));
if (2 == this.untilLocation && this.untilCompilation.filterTraverser(traverser))
this.outputTraversers.add(traverser.repeatDone(this.repeatBranch));
else
- this.repeat.addTraverser(traverser);
+ this.repeatStarts.add(traverser);
}
} else {
- this.repeat.addTraverser(traverser);
+ this.repeatStarts.add(traverser);
}
return true;
}
@@ -92,9 +98,9 @@ final class RepeatStep<C, S> extends AbstractStep<C, S, S> {
}
private void stageOutput() {
- while (this.outputTraversers.isEmpty() && (this.repeat.getProcessor().hasNext() || this.stageInput())) {
- if (this.repeat.getProcessor().hasNext()) {
- final Traverser<C, S> traverser = this.repeat.getProcessor().next().repeatLoop(this.repeatBranch);
+ while (this.outputTraversers.isEmpty() && (this.repeatIterator.hasNext() || this.stageInput())) {
+ if (this.repeatIterator.hasNext()) {
+ final Traverser<C, S> traverser = this.repeatIterator.next().repeatLoop(this.repeatBranch);
if (this.hasEndPredicates) {
if (3 == this.untilLocation) {
if (this.untilCompilation.filterTraverser(traverser)) {
@@ -115,6 +121,8 @@ final class RepeatStep<C, S> extends AbstractStep<C, S, S> {
} else {
this.inputTraversers.add(traverser);
}
+ } else {
+ this.repeatIterator = this.repeat.getProcessor().iterator(IteratorUtils.removeOnNext(this.repeatStarts.iterator()));
}
}
}
diff --git a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/AbstractRxJava.java b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/AbstractRxJava.java
index 6c478f4554..d16a4e14c4 100644
--- a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/AbstractRxJava.java
+++ b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/AbstractRxJava.java
@@ -24,6 +24,10 @@ import org.apache.tinkerpop.machine.processor.Processor;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.TraverserSet;
+import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -31,10 +35,10 @@ public abstract class AbstractRxJava<C, S, E> implements Processor<C, S, E> {
static final int MAX_REPETITIONS = 8; // TODO: this needs to be a dynamic configuration
- boolean executed = false;
Disposable disposable;
+ final AtomicBoolean running = new AtomicBoolean(Boolean.FALSE);
final TraverserSet<C, S> starts = new TraverserSet<>();
- final TraverserSet<C, E> ends = new TraverserSet<>();
+ private final TraverserSet<C, E> ends = new TraverserSet<>();
final Compilation<C, S, E> compilation;
AbstractRxJava(final Compilation<C, S, E> compilation) {
@@ -42,35 +46,62 @@ public abstract class AbstractRxJava<C, S, E> implements Processor<C, S, E> {
}
@Override
- public void addStart(final Traverser<C, S> traverser) {
- this.starts.add(traverser);
+ public void stop() {
+ if (null != this.disposable) {
+ this.disposable.dispose();
+ this.disposable = null;
+ }
+ this.starts.clear();
+ this.ends.clear();
+ this.running.set(Boolean.FALSE);
}
@Override
- public Traverser<C, E> next() {
- this.prepareFlow();
- return this.ends.remove();
+ public boolean isRunning() {
+ return this.running.get();
}
@Override
- public boolean hasNext() {
- this.prepareFlow();
- return !this.ends.isEmpty();
+ public Iterator<Traverser<C, E>> iterator(final Iterator<Traverser<C, S>> starts) {
+ if (this.isRunning())
+ throw Processor.Exceptions.processorIsCurrentlyRunning(this);
+
+ this.running.set(Boolean.TRUE);
+ this.starts.clear();
+ this.ends.clear();
+ starts.forEachRemaining(this.starts::add);
+ this.prepareFlow(this.ends::add);
+ return new Iterator<>() {
+ @Override
+ public boolean hasNext() {
+ waitForCompletionOrResult();
+ return !ends.isEmpty();
+ }
+
+ @Override
+ public Traverser<C, E> next() {
+ waitForCompletionOrResult();
+ return ends.remove();
+ }
+ };
}
@Override
- public void reset() {
- if (null != this.disposable)
- this.disposable.dispose();
+ public void subscribe(final Iterator<Traverser<C, S>> starts, final Consumer<Traverser<C, E>> consumer) {
+ if (this.isRunning())
+ throw Processor.Exceptions.processorIsCurrentlyRunning(this);
+
+ this.running.set(Boolean.TRUE);
this.starts.clear();
this.ends.clear();
- this.executed = false;
+ starts.forEachRemaining(this.starts::add);
+ this.prepareFlow(consumer::accept);
}
- protected abstract void prepareFlow();
+ protected abstract void prepareFlow(final io.reactivex.functions.Consumer<? super Traverser<C, E>> consumer);
- void waitForCompletionOrResult() {
- while (!this.disposable.isDisposed() && this.ends.isEmpty()) {
+ private void waitForCompletionOrResult() {
+ while (this.ends.isEmpty() && this.isRunning()) {
// wait until either the flow is complete or there is a traverser result
}
}
diff --git a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/ParallelRxJava.java b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/ParallelRxJava.java
index 085168abb8..b0d92b120e 100644
--- a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/ParallelRxJava.java
+++ b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/ParallelRxJava.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.machine.processor.rxjava;
import io.reactivex.Flowable;
+import io.reactivex.functions.Consumer;
import io.reactivex.parallel.ParallelFlowable;
import io.reactivex.processors.PublishProcessor;
import io.reactivex.schedulers.Schedulers;
@@ -33,6 +34,7 @@ import org.apache.tinkerpop.machine.function.InitialFunction;
import org.apache.tinkerpop.machine.function.MapFunction;
import org.apache.tinkerpop.machine.function.ReduceFunction;
import org.apache.tinkerpop.machine.function.branch.RepeatBranch;
+import org.apache.tinkerpop.machine.processor.Processor;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.TraverserFactory;
import org.apache.tinkerpop.machine.util.IteratorUtils;
@@ -63,22 +65,19 @@ public final class ParallelRxJava<C, S, E> extends AbstractRxJava<C, S, E> {
}
@Override
- protected void prepareFlow() {
- if (!this.executed) {
- this.executed = true;
- this.disposable = this.flowable.
- doOnNext(this.ends::add).
- sequential().
- doFinally(() -> {
- if (null != this.bytecodeId) { // only the parent compilation should close the thread pool
- this.threadPool.shutdown();
- RxJavaProcessor.THREAD_POOLS.remove(this.bytecodeId);
- }
- }).
- subscribeOn(Schedulers.newThread()).subscribe(); // don't block the execution so results can be streamed back in real-time
-
- }
- this.waitForCompletionOrResult();
+ protected void prepareFlow(final Consumer<? super Traverser<C, E>> consumer) {
+ this.disposable = this.flowable
+ .doOnNext(consumer)
+ .sequential()
+ .subscribeOn(Schedulers.newThread()) // don't block the execution so results can be streamed back in real-time
+ .doFinally(() -> {
+ if (null != this.bytecodeId) { // only the parent compilation should close the thread pool
+ RxJavaProcessor.THREAD_POOLS.remove(this.bytecodeId);
+ this.threadPool.shutdown();
+ }
+ this.running.set(Boolean.FALSE);
+ })
+ .subscribe();
}
// EXECUTION PLAN COMPILER
diff --git a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java
index ee04fb3489..0d4cbce60b 100644
--- a/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java
+++ b/java/machine/processor/rxjava/src/main/java/org/apache/tinkerpop/machine/processor/rxjava/SerialRxJava.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.machine.processor.rxjava;
import io.reactivex.Flowable;
+import io.reactivex.functions.Consumer;
import io.reactivex.processors.PublishProcessor;
import io.reactivex.schedulers.Schedulers;
import org.apache.tinkerpop.machine.bytecode.compiler.Compilation;
@@ -31,6 +32,7 @@ import org.apache.tinkerpop.machine.function.InitialFunction;
import org.apache.tinkerpop.machine.function.MapFunction;
import org.apache.tinkerpop.machine.function.ReduceFunction;
import org.apache.tinkerpop.machine.function.branch.RepeatBranch;
+import org.apache.tinkerpop.machine.processor.Processor;
import org.apache.tinkerpop.machine.traverser.Traverser;
import org.apache.tinkerpop.machine.traverser.TraverserFactory;
import org.apache.tinkerpop.machine.util.IteratorUtils;
@@ -54,14 +56,11 @@ public final class SerialRxJava<C, S, E> extends AbstractRxJava<C, S, E> {
}
@Override
- protected void prepareFlow() {
- if (!this.executed) {
- this.executed = true;
- this.disposable = this.flowable.
- doOnNext(this.ends::add).
- subscribeOn(Schedulers.newThread()).subscribe(); // don't block the execution so results can be streamed back in real-time
- }
- this.waitForCompletionOrResult();
+ protected void prepareFlow(final Consumer<? super Traverser<C, E>> consumer) {
+ this.disposable = this.flowable
+ .subscribeOn(Schedulers.newThread()) // don't block the execution so results can be streamed back in real-time
+ .doFinally(() -> this.running.set(Boolean.FALSE))
+ .subscribe(consumer);
}
// EXECUTION PLAN COMPILER
(tinkerpop) 10/13: added rdf/. Super easy. FlatMapInitial is used to wrap FlatMap functions that can serve as initials so we don't have to duplicate code.
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch old-4.0-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 4ac1cb896126f54eeb334667d4bfbd0ff3d25b62
Author: Marko A. Rodriguez <ok...@gmail.com>
AuthorDate: Mon Apr 29 16:31:43 2019 -0600
added rdf/. Super easy. FlatMapInitial is used to wrap FlatMap functions that can serve as initials so we don't have to duplicate code.
---
.../bytecode/compiler/BytecodeCompiler.java | 6 ++---
.../machine/function/initial/FlatMapInitial.java | 9 +++----
.../tinkerpop/machine/structure/rdf/TQuad.java | 27 ++++++++++++++++++++
.../machine/structure/rdf/TStatement.java | 28 +++++++++++++++++++++
.../tinkerpop/machine/structure/rdf/TStore.java | 28 +++++++++++++++++++++
.../tinkerpop/machine/structure/rdf/TTriple.java | 29 ++++++++++++++++++++++
6 files changed, 118 insertions(+), 9 deletions(-)
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
index 07b49edd92..eca364f7cc 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/bytecode/compiler/BytecodeCompiler.java
@@ -19,7 +19,6 @@
package org.apache.tinkerpop.machine.bytecode.compiler;
import org.apache.tinkerpop.machine.bytecode.Bytecode;
-import org.apache.tinkerpop.machine.bytecode.BytecodeUtil;
import org.apache.tinkerpop.machine.bytecode.Instruction;
import org.apache.tinkerpop.machine.function.CFunction;
import org.apache.tinkerpop.machine.function.initial.FlatMapInitial;
@@ -37,8 +36,9 @@ public interface BytecodeCompiler {
final List<CFunction<C>> functions = new ArrayList<>();
for (final Instruction<C> instruction : bytecode.getInstructions()) {
final CFunction function = this.compile(instruction);
- functions.add(functions.isEmpty() && bytecode.getParent().isEmpty() && function instanceof Initializing ?
- new FlatMapInitial<>(function.coefficient(), function.label(), (Initializing) function, BytecodeUtil.getTraverserFactory(bytecode).get()) : function);
+ functions.add(functions.isEmpty() && bytecode.getParent().isEmpty() && function instanceof Initializing ? // if this is the first function, then wrap it in an InitialFunction
+ new FlatMapInitial<>(function.coefficient(), function.label(), (Initializing) function) :
+ function);
}
return functions;
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
index 8b065678db..2a2ca21ee3 100644
--- a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/function/initial/FlatMapInitial.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.machine.function.initial;
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.traverser.TraverserFactory;
+import org.apache.tinkerpop.machine.traverser.species.EmptyTraverser;
import java.util.Iterator;
@@ -31,17 +31,14 @@ import java.util.Iterator;
public final class FlatMapInitial<C, S> extends AbstractFunction<C> implements InitialFunction<C, S> {
private final Initializing<C, ?, S> function;
- private final TraverserFactory<C> traverserFactory;
-
- public FlatMapInitial(final Coefficient<C> coefficient, final String label, final Initializing<C, ?, S> function, final TraverserFactory<C> traverserFactory) {
+ public FlatMapInitial(final Coefficient<C> coefficient, final String label, final Initializing<C, ?, S> function) {
super(coefficient, label);
this.function = function;
- this.traverserFactory = traverserFactory;
}
@Override
public Iterator<S> get() {
- return this.function.apply(traverserFactory.create(this, null));
+ return this.function.apply(EmptyTraverser.instance());
}
}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TQuad.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TQuad.java
new file mode 100644
index 0000000000..a860491784
--- /dev/null
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TQuad.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.structure.rdf;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TQuad extends TTriple {
+
+ public String graph();
+}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TStatement.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TStatement.java
new file mode 100644
index 0000000000..f530eff2a0
--- /dev/null
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TStatement.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.structure.rdf;
+
+import org.apache.tinkerpop.machine.structure.TTuple;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TStatement extends TTuple<String,String> {
+
+}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TStore.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TStore.java
new file mode 100644
index 0000000000..98726f6af8
--- /dev/null
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TStore.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.structure.rdf;
+
+import org.apache.tinkerpop.machine.structure.Structure;
+import org.apache.tinkerpop.machine.structure.TSequence;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TStore extends TSequence<TStatement>, Structure {
+}
diff --git a/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TTriple.java b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TTriple.java
new file mode 100644
index 0000000000..e15e4d16b5
--- /dev/null
+++ b/java/machine/machine-core/src/main/java/org/apache/tinkerpop/machine/structure/rdf/TTriple.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.machine.structure.rdf;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TTriple extends TStatement {
+
+ public String subject();
+ public String predicate();
+ public String object();
+}