This is an automated email from the ASF dual-hosted git repository. okram pushed a commit to branch tp4 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit c6033cbb9aee0f91f7de0878c0ef40d72c98eb4e Author: Marko A. Rodriguez <okramma...@gmail.com> AuthorDate: Sun Mar 3 10:56:06 2019 -0700 starting to spec out the gremlin-machines submodule which includes gremlin-pipes which is what we currently think of Traversal as. gremlin-pipes will be a local traversal engine. --- gremlin-core/pom.xml | 2 +- .../tinkerpop/gremlin/machine/Instruction.java | 2 +- .../tinkerpop/gremlin/machine/Traverser.java | 5 + .../{Traverser.java => functions/GFunction.java} | 29 +--- .../gremlin/machine/functions/MapFunction.java | 2 +- .../gremlin/machine/traversers/TraverserSet.java | 160 +++++++++++++++++++++ .../FastNoSuchElementException.java} | 32 ++--- .../gremlin-pipes}/pom.xml | 15 +- .../org/apache/tinkerpop/machines/pipes/Pipe.java | 29 ++-- .../org/apache/tinkerpop/machines/pipes/Step.java | 35 +++-- .../apache/tinkerpop/machines/pipes/PipeTest.java | 24 +--- {gremlin-core => gremlin-machines}/pom.xml | 30 +--- pom.xml | 3 +- 13 files changed, 247 insertions(+), 121 deletions(-) diff --git a/gremlin-core/pom.xml b/gremlin-core/pom.xml index b92f8fd..c921791 100644 --- a/gremlin-core/pom.xml +++ b/gremlin-core/pom.xml @@ -19,7 +19,7 @@ limitations under the License. <parent> <artifactId>tinkerpop</artifactId> <groupId>org.apache.tinkerpop</groupId> - <version>4.0-SNAPSHOT</version> + <version>4.0.0-SNAPSHOT</version> </parent> <name>Apache TinkerPop :: Gremlin Core</name> <artifactId>gremlin-core</artifactId> diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Instruction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Instruction.java index dfc9d0a..b46462e 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Instruction.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Instruction.java @@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.machine; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class Instruction<C> { +public final class Instruction<C> { private final C coefficient; private final String op; diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java index 6c0712c..d0c321f 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java @@ -42,4 +42,9 @@ public class Traverser<C, A> { public <B> Traverser<C, B> split(final C coefficient, final B object) { return new Traverser<>(coefficient, object); } + + @Override + public boolean equals(final Object other) { + return other instanceof Traverser && ((Traverser<C, A>) other).object.equals(this.object); + } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/functions/GFunction.java similarity index 61% copy from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java copy to gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/functions/GFunction.java index 6c0712c..48a3b7c 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/functions/GFunction.java @@ -16,30 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.gremlin.machine; +package org.apache.tinkerpop.gremlin.machine.functions; + +import org.apache.tinkerpop.gremlin.machine.Traverser; + +import java.util.Iterator; +import java.util.function.Function; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class Traverser<C, A> { - - private final C coefficient; - private final A object; - - public Traverser(final C coefficient, final A object) { - this.coefficient = coefficient; - this.object = object; - } - - public C getCoefficient() { - return this.coefficient; - } - - public A getObject() { - return this.object; - } - - public <B> Traverser<C, B> split(final C coefficient, final B object) { - return new Traverser<>(coefficient, object); - } +public interface GFunction<C, S, E> extends Function<Traverser<C, S>, Traverser<C, E>> { } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/functions/MapFunction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/functions/MapFunction.java index 35d5b12..4491414 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/functions/MapFunction.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/functions/MapFunction.java @@ -26,7 +26,7 @@ import java.util.function.Function; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class MapFunction<C, A, B> implements Function<Traverser<C, A>, Traverser<C, B>> { +public class MapFunction<C, A, B> implements GFunction<C, A,B> { private final C coefficient; private final Coefficients<C> coefficients; diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/traversers/TraverserSet.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/traversers/TraverserSet.java new file mode 100644 index 0000000..fdf4b28 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/traversers/TraverserSet.java @@ -0,0 +1,160 @@ +/* + * 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.gremlin.machine.traversers; + +import org.apache.tinkerpop.gremlin.machine.Traverser; +import org.apache.tinkerpop.gremlin.machine.util.FastNoSuchElementException; + +import java.util.AbstractSet; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Queue; +import java.util.Set; +import java.util.Spliterator; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public class TraverserSet<C, S> extends AbstractSet<Traverser<C, S>> implements Set<Traverser<C, S>>, Queue<Traverser<C, S>> { + + private final Map<Traverser<C, S>, Traverser<C, S>> map = Collections.synchronizedMap(new LinkedHashMap<>()); + + public TraverserSet() { + + } + + public TraverserSet(final Traverser<C, S> traverser) { + if (traverser != null) + this.map.put(traverser, traverser); + } + + @Override + public Iterator<Traverser<C, S>> iterator() { + return this.map.values().iterator(); + } + + public Traverser<C, S> get(final Traverser<C, S> traverser) { + return this.map.get(traverser); + } + + @Override + public int size() { + return this.map.size(); + } + + public long bulkSize() { + /*long bulk = 0L; + for (final Traverser<C,S> traverser : this.map.values()) { + bulk = bulk + traverser.bulk(); + } + return bulk;*/ + return 1L; + } + + @Override + public boolean isEmpty() { + return this.map.isEmpty(); + } + + @Override + public boolean contains(final Object traverser) { + return this.map.containsKey(traverser); + } + + @Override + public boolean add(final Traverser<C, S> traverser) { + final Traverser<C, S> existing = this.map.get(traverser); + if (null == existing) { + this.map.put(traverser, traverser); + return true; + } else { + //existing. + return false; + } + } + + @Override + public boolean offer(final Traverser<C, S> traverser) { + return this.add(traverser); + } + + @Override + public Traverser<C, S> remove() { // pop, exception if empty + final Iterator<Traverser<C, S>> iterator = this.map.values().iterator(); + if (!iterator.hasNext()) + throw FastNoSuchElementException.instance(); + final Traverser<C, S> next = iterator.next(); + iterator.remove(); + return next; + } + + @Override + public Traverser<C, S> poll() { // pop, null if empty + return this.map.isEmpty() ? null : this.remove(); + } + + @Override + public Traverser<C, S> element() { // peek, exception if empty + return this.iterator().next(); + } + + @Override + public Traverser<C, S> peek() { // peek, null if empty + return this.map.isEmpty() ? null : this.iterator().next(); + } + + @Override + public boolean remove(final Object traverser) { + return this.map.remove(traverser) != null; + } + + @Override + public void clear() { + this.map.clear(); + } + + @Override + public Spliterator<Traverser<C, S>> spliterator() { + return this.map.values().spliterator(); + } + + @Override + public String toString() { + return this.map.values().toString(); + } + + /*public void sort(final Comparator<Traverser<S>> comparator) { + final List<Traverser<C, S>> list = new ArrayList<>(this.map.size()); + IteratorUtils.removeOnNext(this.map.values().iterator()).forEachRemaining(list::add); + Collections.sort(list, comparator); + this.map.clear(); + list.forEach(traverser -> this.map.put(traverser, traverser)); + } + + public void shuffle() { + final List<Traverser<C, S>> list = new ArrayList<>(this.map.size()); + IteratorUtils.removeOnNext(this.map.values().iterator()).forEachRemaining(list::add); + Collections.shuffle(list); + this.map.clear(); + list.forEach(traverser -> this.map.put(traverser, traverser)); + }*/ + +} \ No newline at end of file diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Instruction.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/util/FastNoSuchElementException.java similarity index 58% copy from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Instruction.java copy to gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/util/FastNoSuchElementException.java index dfc9d0a..003c990 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Instruction.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/util/FastNoSuchElementException.java @@ -16,32 +16,30 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.gremlin.machine; +package org.apache.tinkerpop.gremlin.machine.util; + +import java.util.NoSuchElementException; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class Instruction<C> { - - private final C coefficient; - private final String op; - private final Object[] args; +public class FastNoSuchElementException extends NoSuchElementException { - public Instruction(final C coefficient, final String op, final Object... args) { - this.coefficient = coefficient; - this.op = op; - this.args = args; - } + private static final long serialVersionUID = 2303108654138257697L; + private static final FastNoSuchElementException INSTANCE = new FastNoSuchElementException(); - public C getCoefficient() { - return this.coefficient; + private FastNoSuchElementException() { } - public String getOp() { - return this.op; + /** + * Retrieve a singleton, fast {@link NoSuchElementException} without a stack trace. + */ + public static NoSuchElementException instance() { + return INSTANCE; } - public Object[] getArgs() { - return this.args; + @Override + public synchronized Throwable fillInStackTrace() { + return this; } } diff --git a/gremlin-core/pom.xml b/gremlin-machines/gremlin-pipes/pom.xml similarity index 80% copy from gremlin-core/pom.xml copy to gremlin-machines/gremlin-pipes/pom.xml index b92f8fd..783bada 100644 --- a/gremlin-core/pom.xml +++ b/gremlin-machines/gremlin-pipes/pom.xml @@ -17,12 +17,19 @@ limitations under the License. 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>tinkerpop</artifactId> + <artifactId>gremlin-machines</artifactId> <groupId>org.apache.tinkerpop</groupId> - <version>4.0-SNAPSHOT</version> + <version>4.0.0-SNAPSHOT</version> </parent> - <name>Apache TinkerPop :: Gremlin Core</name> - <artifactId>gremlin-core</artifactId> + <name>Apache TinkerPop :: Gremlin Pipes</name> + <artifactId>gremlin-pipes</artifactId> + <dependencies> + <dependency> + <groupId>org.apache.tinkerpop</groupId> + <artifactId>gremlin-core</artifactId> + <version>4.0.0-SNAPSHOT</version> + </dependency> + </dependencies> <build> <directory>${basedir}/target</directory> <finalName>${project.artifactId}-${project.version}</finalName> diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java b/gremlin-machines/gremlin-pipes/src/main/java/org/apache/tinkerpop/machines/pipes/Pipe.java similarity index 63% copy from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java copy to gremlin-machines/gremlin-pipes/src/main/java/org/apache/tinkerpop/machines/pipes/Pipe.java index 6c0712c..0bbc106 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java +++ b/gremlin-machines/gremlin-pipes/src/main/java/org/apache/tinkerpop/machines/pipes/Pipe.java @@ -16,30 +16,31 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.gremlin.machine; +package org.apache.tinkerpop.machines.pipes; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class Traverser<C, A> { +public class Pipe<S, E> implements Iterator<E>, AutoCloseable { - private final C coefficient; - private final A object; + private final List<Step<?, ?>> steps = new ArrayList<>(); - public Traverser(final C coefficient, final A object) { - this.coefficient = coefficient; - this.object = object; - } + @Override + public void close() throws Exception { - public C getCoefficient() { - return this.coefficient; } - public A getObject() { - return this.object; + @Override + public boolean hasNext() { + return false; } - public <B> Traverser<C, B> split(final C coefficient, final B object) { - return new Traverser<>(coefficient, object); + @Override + public E next() { + return null; } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Instruction.java b/gremlin-machines/gremlin-pipes/src/main/java/org/apache/tinkerpop/machines/pipes/Step.java similarity index 54% copy from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Instruction.java copy to gremlin-machines/gremlin-pipes/src/main/java/org/apache/tinkerpop/machines/pipes/Step.java index dfc9d0a..92e1b5d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Instruction.java +++ b/gremlin-machines/gremlin-pipes/src/main/java/org/apache/tinkerpop/machines/pipes/Step.java @@ -16,32 +16,37 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.gremlin.machine; +package org.apache.tinkerpop.machines.pipes; + +import org.apache.tinkerpop.gremlin.machine.Traverser; +import org.apache.tinkerpop.gremlin.machine.functions.GFunction; +import org.apache.tinkerpop.gremlin.machine.traversers.TraverserSet; + +import java.util.Iterator; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class Instruction<C> { +public class Step<S, E> implements Iterator<Traverser<?, E>> { - private final C coefficient; - private final String op; - private final Object[] args; + private final GFunction<?, S, E> function; + private TraverserSet<?, S> set = new TraverserSet<>(); - public Instruction(final C coefficient, final String op, final Object... args) { - this.coefficient = coefficient; - this.op = op; - this.args = args; + public Step(final GFunction<?, S, E> function) { + this.function = function; } - public C getCoefficient() { - return this.coefficient; + public void addStart(final Traverser<?, S> start) { + this.set.add((Traverser) start); } - public String getOp() { - return this.op; + @Override + public boolean hasNext() { + return false; } - public Object[] getArgs() { - return this.args; + @Override + public Traverser<?, E> next() { + return null; } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java b/gremlin-machines/gremlin-pipes/src/test/java/org/apache/tinkerpop/machines/pipes/PipeTest.java similarity index 61% copy from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java copy to gremlin-machines/gremlin-pipes/src/test/java/org/apache/tinkerpop/machines/pipes/PipeTest.java index 6c0712c..243e301 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/machine/Traverser.java +++ b/gremlin-machines/gremlin-pipes/src/test/java/org/apache/tinkerpop/machines/pipes/PipeTest.java @@ -16,30 +16,10 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.tinkerpop.gremlin.machine; +package org.apache.tinkerpop.machines.pipes; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public class Traverser<C, A> { - - private final C coefficient; - private final A object; - - public Traverser(final C coefficient, final A object) { - this.coefficient = coefficient; - this.object = object; - } - - public C getCoefficient() { - return this.coefficient; - } - - public A getObject() { - return this.object; - } - - public <B> Traverser<C, B> split(final C coefficient, final B object) { - return new Traverser<>(coefficient, object); - } +public class PipeTest { } diff --git a/gremlin-core/pom.xml b/gremlin-machines/pom.xml similarity index 57% copy from gremlin-core/pom.xml copy to gremlin-machines/pom.xml index b92f8fd..e5ebc68 100644 --- a/gremlin-core/pom.xml +++ b/gremlin-machines/pom.xml @@ -16,31 +16,15 @@ limitations under the License. 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> + <packaging>pom</packaging> <parent> <artifactId>tinkerpop</artifactId> <groupId>org.apache.tinkerpop</groupId> - <version>4.0-SNAPSHOT</version> + <version>4.0.0-SNAPSHOT</version> </parent> - <name>Apache TinkerPop :: Gremlin Core</name> - <artifactId>gremlin-core</artifactId> - <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> + <name>Apache TinkerPop :: Gremlin Machines</name> + <artifactId>gremlin-machines</artifactId> + <modules> + <module>gremlin-pipes</module> + </modules> </project> \ No newline at end of file diff --git a/pom.xml b/pom.xml index dee708e..09d0c9a 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ limitations under the License. </parent> <groupId>org.apache.tinkerpop</groupId> <artifactId>tinkerpop</artifactId> - <version>4.0-SNAPSHOT</version> + <version>4.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Apache TinkerPop</name> <description>A Distributed Virtual Machine and Language</description> @@ -65,6 +65,7 @@ limitations under the License. </prerequisites> <modules> <module>gremlin-core</module> + <module>gremlin-machines</module> </modules> <scm> <connection>scm:git:g...@github.com:apache/tinkerpop.git</connection>