diff --git a/.gitignore b/.gitignore
index cca6a663..48d87eb9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,4 @@
.gremlin_history
target/
.idea/
-gremlin.iml
\ No newline at end of file
+*.iml
\ No newline at end of file
diff --git a/gremlin-core/pom.xml b/gremlin-core/pom.xml
new file mode 100644
index 00000000..15e864a2
--- /dev/null
+++ b/gremlin-core/pom.xml
@@ -0,0 +1,183 @@
+
+
+ 4.0.0
+
+ com.tinkerpop.gremlin
+ gremlin
+ 1.4-SNAPSHOT
+ ../pom.xml
+
+ gremlin-core
+ 1.4-SNAPSHOT
+ jar
+ Gremlin-Core: The Core of the Gremlin Language
+
+
+ Marko A. Rodriguez
+ marko@markorodriguez.com
+ http://markorodriguez.com
+
+
+
+
+ Gremlin Users
+ http://groups.google.com/group/gremlin-users
+ http://groups.google.com/group/gremlin-users
+ http://groups.google.com/group/gremlin-users/topics
+
+
+ 2009
+
+ UTF-8
+
+
+
+ com.tinkerpop.blueprints
+ blueprints-core
+ 1.1-SNAPSHOT
+
+
+
+ com.tinkerpop.blueprints
+ blueprints-graph-jung
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-graph-sail
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-neo4j-graph
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-orient-graph
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-dex-graph
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-sail-graph
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-rexster-graph
+ 1.1-SNAPSHOT
+ provided
+
+
+
+ com.tinkerpop
+ pipes
+ 0.9-SNAPSHOT
+
+
+
+ org.fusesource.jansi
+ jansi
+ 1.5
+
+
+ jline
+ jline
+ 0.9.94
+
+
+
+ junit
+ junit
+ 4.5
+ test
+
+
+
+
+ tinkerpop-repository
+ TinkerPop Maven2 Repository
+ http://tinkerpop.com/maven2
+
+ true
+ always
+
+
+
+
+ ${basedir}/target
+ ${project.artifactId}-${project.version}
+
+
+ ${basedir}/src/main/resources
+
+
+
+
+
+ maven-compiler-plugin
+ 2.3.2
+
+
+ 1.6
+
+
+
+ maven-assembly-plugin
+ 2.2-beta-4
+
+
+ package
+
+ assembly
+
+
+
+
+
+ src/assembly/distribution.xml
+
+ ${project.artifactId}-${project.version}
+ target
+ target/assembly/work
+ warn
+
+
+ com.tinkerpop.gremlin.console.Console
+
+
+
+
+
+ maven-deploy-plugin
+ 2.5
+
+
+ org.apache.maven.wagon
+ wagon-ftp
+ 1.0-alpha-6
+
+
+
+
+
+
+
+ tinkerpop-repository
+ TinkerPop Maven2 Repository
+ ftp://ftp.tinkerpop.com:21/public/maven2/
+
+
+
\ No newline at end of file
diff --git a/src/assembly/distribution.xml b/gremlin-core/src/assembly/distribution.xml
similarity index 90%
rename from src/assembly/distribution.xml
rename to gremlin-core/src/assembly/distribution.xml
index ade7a64b..1bf91dc0 100644
--- a/src/assembly/distribution.xml
+++ b/gremlin-core/src/assembly/distribution.xml
@@ -28,7 +28,7 @@
target/site
- target/gremlin-${project.version}-standalone
+ target/gremlin-core-${project.version}-standalone
diff --git a/gremlin-groovy/pom.xml b/gremlin-groovy/pom.xml
new file mode 100644
index 00000000..1f8f8bb6
--- /dev/null
+++ b/gremlin-groovy/pom.xml
@@ -0,0 +1,231 @@
+
+
+ 4.0.0
+
+ com.tinkerpop.gremlin
+ gremlin
+ 1.4-SNAPSHOT
+ ../pom.xml
+
+ gremlin-groovy
+ 1.4-SNAPSHOT
+ jar
+ Gremlin-Groovy: Gremlin for the Groovy Language
+
+
+ Marko A. Rodriguez
+ marko@markorodriguez.com
+ http://markorodriguez.com
+
+
+
+
+ Pavel Yaskevich
+ povel.y@gmail.com
+ http://github.com/xedin
+
+
+ Darrick Wiebe
+ darrick@innatesoftware.com
+ http://github.com/pangloss
+
+
+ Peter Neubauer
+ peter.neubauer@neotechnology.com
+ http://www.linkedin.com/in/neubauer
+
+
+
+
+ Gremlin Users
+ http://groups.google.com/group/gremlin-users
+ http://groups.google.com/group/gremlin-users
+ http://groups.google.com/group/gremlin-users/topics
+
+
+ 2009
+
+ UTF-8
+
+
+
+ com.tinkerpop.gremlin
+ gremlin-core
+ 1.4-SNAPSHOT
+
+
+
+ com.tinkerpop.blueprints
+ blueprints-graph-jung
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-graph-sail
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-neo4j-graph
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-orient-graph
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-dex-graph
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-sail-graph
+ 1.1-SNAPSHOT
+ provided
+
+
+ com.tinkerpop.blueprints
+ blueprints-rexster-graph
+ 1.1-SNAPSHOT
+ provided
+
+
+
+ com.tinkerpop
+ pipes
+ 0.9-SNAPSHOT
+
+
+ org.codehaus.groovy
+ groovy
+ 1.8.2
+
+
+
+ org.fusesource.jansi
+ jansi
+ 1.5
+
+
+ jline
+ jline
+ 0.9.94
+
+
+
+ org.codehaus.gmaven
+ gmaven-plugin
+ 1.3
+ provided
+
+
+
+ junit
+ junit
+ 4.5
+ test
+
+
+
+
+ tinkerpop-repository
+ TinkerPop Maven2 Repository
+ http://tinkerpop.com/maven2
+
+ true
+ always
+
+
+
+
+ ${basedir}/target
+ ${project.artifactId}-${project.version}
+
+
+ ${basedir}/src/main/resources
+
+
+
+
+
+ maven-compiler-plugin
+ 2.3.2
+
+
+ 1.6
+
+
+
+ maven-assembly-plugin
+ 2.2-beta-4
+
+
+ package
+
+ assembly
+
+
+
+
+
+ src/assembly/standalone.xml
+ src/assembly/distribution.xml
+
+ ${project.artifactId}-${project.version}
+ target
+ target/assembly/work
+ warn
+
+
+ com.tinkerpop.gremlin.console.Console
+
+
+
+
+
+ org.codehaus.gmaven
+ gmaven-plugin
+ 1.3
+
+
+
+ generateStubs
+ compile
+ generateTestStubs
+ testCompile
+
+
+ 1.7
+
+
+
+
+
+ maven-deploy-plugin
+ 2.5
+
+
+ org.apache.maven.wagon
+ wagon-ftp
+ 1.0-alpha-6
+
+
+
+
+
+
+
+ tinkerpop-repository
+ TinkerPop Maven2 Repository
+ ftp://ftp.tinkerpop.com:21/public/maven2/
+
+
+
\ No newline at end of file
diff --git a/gremlin-groovy/src/assembly/distribution.xml b/gremlin-groovy/src/assembly/distribution.xml
new file mode 100644
index 00000000..81d60958
--- /dev/null
+++ b/gremlin-groovy/src/assembly/distribution.xml
@@ -0,0 +1,34 @@
+
+
+ zip
+
+
+
+
+ pom.xml
+
+
+
+ 0775
+
+ gremlin.sh
+ gremlin.bat
+
+
+
+ src
+
+
+ data
+
+
+ target/apidocs
+
+
+ target/site
+
+
+ target/gremlin-groovy-${project.version}-standalone
+
+
+
diff --git a/src/assembly/standalone.xml b/gremlin-groovy/src/assembly/standalone.xml
similarity index 100%
rename from src/assembly/standalone.xml
rename to gremlin-groovy/src/assembly/standalone.xml
diff --git a/src/main/bin/gremlin.bat b/gremlin-groovy/src/main/bin/gremlin.bat
similarity index 100%
rename from src/main/bin/gremlin.bat
rename to gremlin-groovy/src/main/bin/gremlin.bat
diff --git a/src/main/bin/gremlin.sh b/gremlin-groovy/src/main/bin/gremlin.sh
similarity index 100%
rename from src/main/bin/gremlin.sh
rename to gremlin-groovy/src/main/bin/gremlin.sh
diff --git a/src/main/groovy/com/tinkerpop/gremlin/Gremlin.groovy b/gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/Gremlin.groovy
similarity index 100%
rename from src/main/groovy/com/tinkerpop/gremlin/Gremlin.groovy
rename to gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/Gremlin.groovy
diff --git a/src/main/groovy/com/tinkerpop/gremlin/loaders/ElementLoader.groovy b/gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/ElementLoader.groovy
similarity index 100%
rename from src/main/groovy/com/tinkerpop/gremlin/loaders/ElementLoader.groovy
rename to gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/ElementLoader.groovy
diff --git a/src/main/groovy/com/tinkerpop/gremlin/loaders/FilterPipeLoader.groovy b/gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/FilterPipeLoader.groovy
similarity index 100%
rename from src/main/groovy/com/tinkerpop/gremlin/loaders/FilterPipeLoader.groovy
rename to gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/FilterPipeLoader.groovy
diff --git a/src/main/groovy/com/tinkerpop/gremlin/loaders/GraphLoader.groovy b/gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/GraphLoader.groovy
similarity index 100%
rename from src/main/groovy/com/tinkerpop/gremlin/loaders/GraphLoader.groovy
rename to gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/GraphLoader.groovy
diff --git a/src/main/groovy/com/tinkerpop/gremlin/loaders/IndexLoader.groovy b/gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/IndexLoader.groovy
similarity index 100%
rename from src/main/groovy/com/tinkerpop/gremlin/loaders/IndexLoader.groovy
rename to gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/IndexLoader.groovy
diff --git a/src/main/groovy/com/tinkerpop/gremlin/loaders/ObjectLoader.groovy b/gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/ObjectLoader.groovy
similarity index 100%
rename from src/main/groovy/com/tinkerpop/gremlin/loaders/ObjectLoader.groovy
rename to gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/ObjectLoader.groovy
diff --git a/src/main/groovy/com/tinkerpop/gremlin/loaders/PipeLoader.groovy b/gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/PipeLoader.groovy
similarity index 100%
rename from src/main/groovy/com/tinkerpop/gremlin/loaders/PipeLoader.groovy
rename to gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/PipeLoader.groovy
diff --git a/src/main/groovy/com/tinkerpop/gremlin/loaders/SailGraphLoader.groovy b/gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/SailGraphLoader.groovy
similarity index 100%
rename from src/main/groovy/com/tinkerpop/gremlin/loaders/SailGraphLoader.groovy
rename to gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/SailGraphLoader.groovy
diff --git a/src/main/groovy/com/tinkerpop/gremlin/loaders/SideEffectPipeLoader.groovy b/gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/SideEffectPipeLoader.groovy
similarity index 100%
rename from src/main/groovy/com/tinkerpop/gremlin/loaders/SideEffectPipeLoader.groovy
rename to gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/SideEffectPipeLoader.groovy
diff --git a/src/main/groovy/com/tinkerpop/gremlin/loaders/TransformPipeLoader.groovy b/gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/TransformPipeLoader.groovy
similarity index 100%
rename from src/main/groovy/com/tinkerpop/gremlin/loaders/TransformPipeLoader.groovy
rename to gremlin-groovy/src/main/groovy/com/tinkerpop/gremlin/loaders/TransformPipeLoader.groovy
diff --git a/src/main/java/com/tinkerpop/gremlin/GremlinTokens.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/GremlinTokens.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/GremlinTokens.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/GremlinTokens.java
diff --git a/src/main/java/com/tinkerpop/gremlin/GroovyPipeFunction.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/GroovyPipeFunction.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/GroovyPipeFunction.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/GroovyPipeFunction.java
diff --git a/src/main/java/com/tinkerpop/gremlin/Imports.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/Imports.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/Imports.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/Imports.java
diff --git a/src/main/java/com/tinkerpop/gremlin/Version.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/Version.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/Version.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/Version.java
diff --git a/src/main/java/com/tinkerpop/gremlin/console/ArrayIterator.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/ArrayIterator.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/console/ArrayIterator.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/ArrayIterator.java
diff --git a/src/main/java/com/tinkerpop/gremlin/console/Console.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/Console.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/console/Console.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/Console.java
diff --git a/src/main/java/com/tinkerpop/gremlin/console/ErrorHookClosure.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/ErrorHookClosure.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/console/ErrorHookClosure.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/ErrorHookClosure.java
diff --git a/src/main/java/com/tinkerpop/gremlin/console/NullResultHookClosure.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/NullResultHookClosure.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/console/NullResultHookClosure.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/NullResultHookClosure.java
diff --git a/src/main/java/com/tinkerpop/gremlin/console/PromptClosure.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/PromptClosure.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/console/PromptClosure.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/PromptClosure.java
diff --git a/src/main/java/com/tinkerpop/gremlin/console/ResultHookClosure.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/ResultHookClosure.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/console/ResultHookClosure.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/console/ResultHookClosure.java
diff --git a/src/main/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngine.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngine.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngine.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngine.java
diff --git a/src/main/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngineFactory.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngineFactory.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngineFactory.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngineFactory.java
diff --git a/src/main/java/com/tinkerpop/gremlin/jsr223/ScriptExecutor.java b/gremlin-groovy/src/main/java/com/tinkerpop/gremlin/jsr223/ScriptExecutor.java
similarity index 100%
rename from src/main/java/com/tinkerpop/gremlin/jsr223/ScriptExecutor.java
rename to gremlin-groovy/src/main/java/com/tinkerpop/gremlin/jsr223/ScriptExecutor.java
diff --git a/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory b/gremlin-groovy/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory
similarity index 100%
rename from src/main/resources/META-INF/services/javax.script.ScriptEngineFactory
rename to gremlin-groovy/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory
diff --git a/src/test/groovy/com/tinkerpop/gremlin/GremlinTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/GremlinTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/GremlinTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/GremlinTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/loaders/ElementLoaderTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/ElementLoaderTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/loaders/ElementLoaderTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/ElementLoaderTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/loaders/GraphLoaderTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/GraphLoaderTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/loaders/GraphLoaderTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/GraphLoaderTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/loaders/IndexLoaderTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/IndexLoaderTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/loaders/IndexLoaderTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/IndexLoaderTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/loaders/ObjectLoaderTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/ObjectLoaderTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/loaders/ObjectLoaderTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/ObjectLoaderTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/loaders/PipeLoaderTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/PipeLoaderTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/loaders/PipeLoaderTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/PipeLoaderTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/loaders/SailGraphLoaderTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/SailGraphLoaderTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/loaders/SailGraphLoaderTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/loaders/SailGraphLoaderTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/pipes/TablePipeTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/pipes/TablePipeTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/pipes/TablePipeTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/pipes/TablePipeTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/AggregateStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/AggregateStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/AggregateStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/AggregateStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/AsStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/AsStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/AsStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/AsStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/BackFilterStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/BackFilterStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/BackFilterStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/BackFilterStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/ClosureStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/ClosureStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/ClosureStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/ClosureStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/CopySplitStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/CopySplitStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/CopySplitStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/CopySplitStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/ExceptStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/ExceptStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/ExceptStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/ExceptStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/FilterClosureStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/FilterClosureStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/FilterClosureStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/FilterClosureStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/GatherStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/GatherStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/GatherStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/GatherStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/GroupCountClosureStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/GroupCountClosureStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/GroupCountClosureStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/GroupCountClosureStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/IfThenElseStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/IfThenElseStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/IfThenElseStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/IfThenElseStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/LoopStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/LoopStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/LoopStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/LoopStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/MapStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/MapStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/MapStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/MapStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/MemoizeStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/MemoizeStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/MemoizeStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/MemoizeStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/PathClosureStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/PathClosureStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/PathClosureStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/PathClosureStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/RangeFilterStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/RangeFilterStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/RangeFilterStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/RangeFilterStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/RetainStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/RetainStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/RetainStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/RetainStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/SideEffectClosureStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/SideEffectClosureStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/SideEffectClosureStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/SideEffectClosureStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/TransformClosureStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/TransformClosureStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/TransformClosureStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/TransformClosureStepTest.groovy
diff --git a/src/test/groovy/com/tinkerpop/gremlin/steps/UniqueObjectStepTest.groovy b/gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/UniqueObjectStepTest.groovy
similarity index 100%
rename from src/test/groovy/com/tinkerpop/gremlin/steps/UniqueObjectStepTest.groovy
rename to gremlin-groovy/src/test/groovy/com/tinkerpop/gremlin/steps/UniqueObjectStepTest.groovy
diff --git a/src/test/java/com/tinkerpop/gremlin/BaseTest.java b/gremlin-groovy/src/test/java/com/tinkerpop/gremlin/BaseTest.java
similarity index 100%
rename from src/test/java/com/tinkerpop/gremlin/BaseTest.java
rename to gremlin-groovy/src/test/java/com/tinkerpop/gremlin/BaseTest.java
diff --git a/src/test/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngineTest.java b/gremlin-groovy/src/test/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngineTest.java
similarity index 100%
rename from src/test/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngineTest.java
rename to gremlin-groovy/src/test/java/com/tinkerpop/gremlin/jsr223/GremlinScriptEngineTest.java
diff --git a/src/test/java/com/tinkerpop/gremlin/jsr223/ScriptExecutorTest.java b/gremlin-groovy/src/test/java/com/tinkerpop/gremlin/jsr223/ScriptExecutorTest.java
similarity index 100%
rename from src/test/java/com/tinkerpop/gremlin/jsr223/ScriptExecutorTest.java
rename to gremlin-groovy/src/test/java/com/tinkerpop/gremlin/jsr223/ScriptExecutorTest.java
diff --git a/src/test/resources/com/tinkerpop/gremlin/jsr223/gremlin-script.grm b/gremlin-groovy/src/test/resources/com/tinkerpop/gremlin/jsr223/gremlin-script.grm
similarity index 100%
rename from src/test/resources/com/tinkerpop/gremlin/jsr223/gremlin-script.grm
rename to gremlin-groovy/src/test/resources/com/tinkerpop/gremlin/jsr223/gremlin-script.grm
diff --git a/gremlin-scala/pom.xml b/gremlin-scala/pom.xml
new file mode 100644
index 00000000..9a6f0f03
--- /dev/null
+++ b/gremlin-scala/pom.xml
@@ -0,0 +1,168 @@
+
+
+ 4.0.0
+
+ com.tinkerpop.gremlin
+ gremlin
+ 1.4-SNAPSHOT
+ ../pom.xml
+
+ gremlin-scala
+ 1.4-SNAPSHOT
+ jar
+ Gremlin-Scala: Gremlin for the Scala Language
+
+
+ Zach Cox
+
+
+
+
+ Gremlin Users
+ http://groups.google.com/group/gremlin-users
+ http://groups.google.com/group/gremlin-users
+ http://groups.google.com/group/gremlin-users/topics
+
+
+ 2011
+
+ UTF-8
+
+
+
+ com.tinkerpop.gremlin
+ gremlin-core
+ 1.4-SNAPSHOT
+
+
+ com.tinkerpop
+ pipes
+ 0.9-SNAPSHOT
+
+
+ org.scala-lang
+ scala-library
+ 2.9.1
+
+
+
+ org.fusesource.jansi
+ jansi
+ 1.5
+
+
+ jline
+ jline
+ 0.9.94
+
+
+
+ junit
+ junit
+ 4.5
+ test
+
+
+ org.specs2
+ specs2_2.9.1
+ 1.6.1
+ test
+
+
+ org.specs2
+ specs2-scalaz-core_2.9.1
+ 6.0.1
+ test
+
+
+
+
+ tinkerpop-repository
+ TinkerPop Maven2 Repository
+ http://tinkerpop.com/maven2
+
+ true
+ always
+
+
+
+
+ ${basedir}/target
+ ${project.artifactId}-${project.version}
+
+
+ ${basedir}/src/main/resources
+
+
+
+
+
+ maven-compiler-plugin
+ 2.3.2
+
+
+ 1.6
+
+
+
+ maven-assembly-plugin
+ 2.2-beta-4
+
+
+ package
+
+ assembly
+
+
+
+
+
+ src/assembly/standalone.xml
+ src/assembly/distribution.xml
+
+ ${project.artifactId}-${project.version}
+ target
+ target/assembly/work
+ warn
+
+
+ com.tinkerpop.gremlin.console.Console
+
+
+
+
+
+ org.scala-tools
+ maven-scala-plugin
+ 2.9.1
+
+
+
+ compile
+ testCompile
+
+
+
+
+
+ maven-deploy-plugin
+ 2.5
+
+
+ org.apache.maven.wagon
+ wagon-ftp
+ 1.0-alpha-6
+
+
+
+
+
+
+
+ tinkerpop-repository
+ TinkerPop Maven2 Repository
+ ftp://ftp.tinkerpop.com:21/public/maven2/
+
+
+
\ No newline at end of file
diff --git a/gremlin-scala/src/assembly/distribution.xml b/gremlin-scala/src/assembly/distribution.xml
new file mode 100644
index 00000000..350c6635
--- /dev/null
+++ b/gremlin-scala/src/assembly/distribution.xml
@@ -0,0 +1,34 @@
+
+
+ zip
+
+
+
+
+ pom.xml
+
+
+
+ 0775
+
+ gremlin.sh
+ gremlin.bat
+
+
+
+ src
+
+
+ data
+
+
+ target/apidocs
+
+
+ target/site
+
+
+ target/gremlin-scala-${project.version}-standalone
+
+
+
diff --git a/gremlin-scala/src/assembly/standalone.xml b/gremlin-scala/src/assembly/standalone.xml
new file mode 100644
index 00000000..2054e4f8
--- /dev/null
+++ b/gremlin-scala/src/assembly/standalone.xml
@@ -0,0 +1,32 @@
+
+ standalone
+
+ dir
+
+ false
+
+
+
+ src/main/bin
+ /bin
+ 0755
+
+
+ target/*.jar
+ /lib
+
+
+
+
+
+ /lib
+ false
+ compile
+
+
+ /lib
+ false
+ provided
+
+
+
diff --git a/gremlin-scala/src/main/java/com/tinkerpop/gremlin/GremlinTokens.java b/gremlin-scala/src/main/java/com/tinkerpop/gremlin/GremlinTokens.java
new file mode 100644
index 00000000..b11970c8
--- /dev/null
+++ b/gremlin-scala/src/main/java/com/tinkerpop/gremlin/GremlinTokens.java
@@ -0,0 +1,61 @@
+package com.tinkerpop.gremlin;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class GremlinTokens {
+
+ public static final String VERSION = "1.3-SNAPSHOT";
+ public static final String LABEL = "label";
+ public static final String ID = "id";
+
+ public enum T {
+ eq, neq, lt, lte, gt, gte, v, e
+ }
+
+ public static final String OUT = "out";
+ public static final String OUTV = "outV";
+ public static final String IN = "in";
+ public static final String INV = "inV";
+ public static final String BOTH = "both";
+ public static final String BOTHV = "bothV";
+ public static final String OUTE = "outE";
+ public static final String INE = "inE";
+ public static final String BOTHE = "bothE";
+ public static final String V = "V";
+ public static final String E = "E";
+
+
+ public static final String _ = "_";
+ public static final String AGGREGATE = "aggregate";
+ public static final String ANDFILTER = "andFilter";
+ public static final String AS = "as";
+ public static final String BACK = "back";
+ public static final String CAP = "cap";
+ public static final String COPYSPLIT = "copySplit";
+ public static final String EXCEPT = "except";
+ public static final String EXHAUSTMERGE = "exhaustMerge";
+ public static final String FAIRMERGE = "fairMerge";
+ public static final String SIDEEFFECT = "sideEffect";
+ public static final String TRANSFORM = "transform";
+ public static final String FILTER = "filter";
+ public static final String GATHER = "gather";
+ public static final String GROUPCOUNT = "groupCount";
+ public static final String IFTHENELSE = "ifThenElse";
+ public static final String LOOP = "loop";
+ public static final String MAP = "map";
+ public static final String MEMOIZE = "memoize";
+ public static final String OPTIONAL = "optional";
+ public static final String ORFILTER = "orFilter";
+ public static final String PATHS = "paths";
+ public static final String PROPERTYFILTER = "propertyFilter";
+ public static final String RANDOM = "random";
+ public static final String RETAIN = "retain";
+ public static final String SCATTER = "scatter";
+ public static final String STEP = "step";
+ public static final String TABLE = "table";
+ public static final String UNIQUEOBJECT = "uniqueObject";
+ public static final String UNIQUEPATH = "uniquePath";
+
+
+}
diff --git a/gremlin-scala/src/main/java/com/tinkerpop/gremlin/Imports.java b/gremlin-scala/src/main/java/com/tinkerpop/gremlin/Imports.java
new file mode 100644
index 00000000..b520af58
--- /dev/null
+++ b/gremlin-scala/src/main/java/com/tinkerpop/gremlin/Imports.java
@@ -0,0 +1,48 @@
+package com.tinkerpop.gremlin;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class Imports {
+
+ private static final List imports = new ArrayList();
+
+ static {
+ // gremlin
+ imports.add("com.tinkerpop.gremlin.*");
+ imports.add("com.tinkerpop.gremlin.GremlinTokens.T");
+
+ // blueprints
+ imports.add("com.tinkerpop.blueprints.pgm.*");
+ imports.add("com.tinkerpop.blueprints.pgm.impls.*");
+ imports.add("com.tinkerpop.blueprints.pgm.impls.tg.*");
+ imports.add("com.tinkerpop.blueprints.pgm.impls.neo4j.*");
+ imports.add("com.tinkerpop.blueprints.pgm.impls.orientdb.*");
+ imports.add("com.tinkerpop.blueprints.pgm.impls.dex.*");
+ imports.add("com.tinkerpop.blueprints.pgm.impls.rexster.*");
+ imports.add("com.tinkerpop.blueprints.pgm.impls.event.*");
+ imports.add("com.tinkerpop.blueprints.pgm.impls.readonly.*");
+ imports.add("com.tinkerpop.blueprints.pgm.impls.sail.*");
+ imports.add("com.tinkerpop.blueprints.pgm.impls.sail.impls.*");
+ imports.add("com.tinkerpop.blueprints.pgm.util.*");
+ imports.add("com.tinkerpop.blueprints.pgm.util.graphml.*");
+ imports.add("com.tinkerpop.blueprints.pgm.oupls.sail.*");
+ imports.add("com.tinkerpop.blueprints.pgm.oupls.jung.*");
+ imports.add("com.tinkerpop.blueprints.pgm.oupls.jung.util.*");
+
+ // pipes
+ imports.add("com.tinkerpop.pipes.*");
+ imports.add("com.tinkerpop.pipes.branch.*");
+ imports.add("com.tinkerpop.pipes.filter.*");
+ imports.add("com.tinkerpop.pipes.sideeffect.*");
+ imports.add("com.tinkerpop.pipes.transform.*");
+ imports.add("com.tinkerpop.pipes.util.*");
+ }
+
+ public static List getImports() {
+ return Imports.imports;
+ }
+}
diff --git a/gremlin-scala/src/main/java/com/tinkerpop/gremlin/Version.java b/gremlin-scala/src/main/java/com/tinkerpop/gremlin/Version.java
new file mode 100644
index 00000000..71715654
--- /dev/null
+++ b/gremlin-scala/src/main/java/com/tinkerpop/gremlin/Version.java
@@ -0,0 +1,15 @@
+package com.tinkerpop.gremlin;
+
+import java.io.IOException;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class Version {
+
+ public static void main(final String[] arguments) throws IOException {
+ System.out.println("gremlin " + GremlinTokens.VERSION);
+ }
+}
+
+
diff --git a/gremlin-scala/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory b/gremlin-scala/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory
new file mode 100644
index 00000000..0036d7b3
--- /dev/null
+++ b/gremlin-scala/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory
@@ -0,0 +1 @@
+com.tinkerpop.gremlin.jsr223.GremlinScriptEngineFactory
\ No newline at end of file
diff --git a/gremlin-scala/src/main/scala/package.scala b/gremlin-scala/src/main/scala/package.scala
new file mode 100644
index 00000000..3e0b0f81
--- /dev/null
+++ b/gremlin-scala/src/main/scala/package.scala
@@ -0,0 +1,27 @@
+package com.tinkerpop.gremlin
+
+import com.tinkerpop.pipes.PipeFunction
+import com.tinkerpop.pipes.util.FluentPipeline
+import java.lang.{Boolean => JBoolean}
+
+/** Implicit conversions that make PipeFunction easier to use in Scala. Users can just `import com.tinkerpop.gremlin.scala._` */
+package object scala {
+ /** Most generic conversion: A => B to PipeFunction[A, B]. */
+ implicit def functionToPipeFunction[A, B](f: Function1[A, B]) =
+ new PipeFunction[A, B] {
+ def compute(a: A): B = f(a)
+ }
+
+ /** Mainly for FluentPipeline.filter, to convert A => scala.Boolean to PipeFunction[A, java.lang.Boolean]. */
+ implicit def booleanFunctionToPipeFunction[A](f: Function1[A, Boolean]) =
+ new PipeFunction[A, JBoolean] {
+ def compute(a: A): JBoolean = Boolean box f(a)
+ }
+
+ /** Bring the wrap implicits into scope. The compiler will check the unwrap implicits on its own. */
+ implicit val wrapScalaVertex = ScalaVertex.wrap _
+ implicit val wrapScalaEdge = ScalaEdge.wrap _
+ implicit val wrapScalaGraph = ScalaGraph.wrap _
+ implicit def wrapScalaFluentPipeline[A, B] = ScalaFluentPipeline.wrap[A, B] _ //this implicit has type parameters so it must be a def instead of a val
+}
+
diff --git a/gremlin-scala/src/main/scala/wrappers.scala b/gremlin-scala/src/main/scala/wrappers.scala
new file mode 100644
index 00000000..b4135c8a
--- /dev/null
+++ b/gremlin-scala/src/main/scala/wrappers.scala
@@ -0,0 +1,97 @@
+package com.tinkerpop.gremlin.scala
+
+import com.tinkerpop.blueprints.pgm.{Vertex, Edge, Graph}
+import com.tinkerpop.pipes.util.FluentPipeline
+
+/** Adds convenience methods to [[com.tinkerpop.blueprints.pgm.Vertex]]. */
+class ScalaVertex(val vertex: Vertex) {
+ def out = new FluentPipeline(vertex).out()
+ def out(labels: String*) = new FluentPipeline(vertex).out(labels: _*)
+
+ def outE = new FluentPipeline(vertex).outE()
+ def outE(labels: String*) = new FluentPipeline(vertex).outE(labels: _*)
+
+ def in = new FluentPipeline(vertex).in()
+ def in(labels: String*) = new FluentPipeline(vertex).in(labels: _*)
+
+ def inE = new FluentPipeline(vertex).inE()
+ def inE(labels: String*) = new FluentPipeline(vertex).inE(labels: _*)
+
+ def both = new FluentPipeline(vertex).both()
+ def both(labels: String*) = new FluentPipeline(vertex).both(labels: _*)
+
+ def bothE = new FluentPipeline(vertex).bothE()
+ def bothE(labels: String*) = new FluentPipeline(vertex).bothE(labels: _*)
+}
+
+/** Implicit conversions between [[com.tinkerpop.blueprints.pgm.Vertex]] and [[com.tinkerpop.gremlin.scala.ScalaVertex]]. */
+object ScalaVertex {
+ implicit def wrap(vertex: Vertex) = new ScalaVertex(vertex)
+ implicit def unwrap(wrapper: ScalaVertex) = wrapper.vertex
+}
+
+/** Adds convenience methods to [[com.tinkerpop.blueprints.pgm.Edge]]. */
+class ScalaEdge(val edge: Edge) {
+ def inV = new FluentPipeline(edge).inV()
+ def outV = new FluentPipeline(edge).outV()
+ def bothV = new FluentPipeline(edge).bothV()
+}
+
+/** Implicit conversions between [[com.tinkerpop.blueprints.pgm.Edge]] and [[com.tinkerpop.gremlin.scala.ScalaEdge]]. */
+object ScalaEdge {
+ implicit def wrap(edge: Edge) = new ScalaEdge(edge)
+ implicit def unwrap(wrapper: ScalaEdge) = wrapper.edge
+}
+
+/** Adds convenience methods to [[com.tinkerpop.blueprints.pgm.Graph]]. */
+class ScalaGraph(val graph: Graph) {
+ def V = new FluentPipeline(graph).V()
+ def E = new FluentPipeline(graph).E()
+
+ //in Groovy, Graph.v appears to return a vertex if called with one ID, or a list of vertices if called with multiple IDs...
+ /*def v(id: Object): Vertex = graph getVertex id
+ def v(id: Object, ids: Object*): Iterable[Vertex] = {
+ val v1 = graph getVertex id
+ val vs = ids.map(graph.getVertex(_))
+ Iterable(v1, vs: _*)
+ }*/
+ def v(ids: Object*): Iterable[Vertex] = ids.map(graph.getVertex(_))
+
+ //def += for addVertex and addEdge?
+}
+
+/** Implicit conversions between [[com.tinkerpop.blueprints.pgm.Graph]] and [[com.tinkerpop.gremlin.scala.ScalaGraph]]. */
+object ScalaGraph {
+ implicit def wrap(graph: Graph) = new ScalaGraph(graph)
+ implicit def unwrap(wrapper: ScalaGraph) = wrapper.graph
+}
+
+/** Adds convenience methods to [[com.tinkerpop.pipes.util.FluentPipeline]]. */
+class ScalaFluentPipeline[A, B](val pipeline: FluentPipeline[A, B]) extends Iterator[B] {
+ //Pipe is both:
+ // - Iterator = iterate over elements in collection, defines hasNext(), next() and remove() methods
+ // - Iterable = can be target of foreach statement, defines iterator() method
+ // => so you can use Pipe as a raw Iterator or in for(E e : pipe), the key point is that you iterate over the Es
+
+ //Scala's Iterator[A] trait provides much more than just hasNext, next & foreach; like map/flatMap/filter/fold/toX/etc
+ // - thus an Iterator can be used in for-comprehensions
+ // - scala.collection.JavaConversions.JIteratorWrapper is a Scala Iterator that wraps a Java Iterator
+
+ //Scala's Iterable[A] trait provides a lot of what Iterator provides, but also the ability to create new collections of the same type
+ // - Iterable is really meant to be implemented by actual collection data structures
+ // - Iterator is probably better for things that just provide a way to iterate over some contained elements
+ // => If ScalaFluentPipeline[S,E] extends Iterator[E], then it should act like Pipe in all the right Scala ways,
+ // and the hasNext & next methods can delegate to hasNext() & next() in FluentPipeline
+
+ def hasNext: Boolean = pipeline.hasNext
+ def next(): B = pipeline.next()
+
+ def loop[T](numberedStep: Int)(whileFunction: Function1[T, Boolean]) = pipeline.loop(numberedStep, whileFunction)
+}
+
+/** Implicit conversions between [[com.tinkerpop.pipes.util.FluentPipeline]] and [[com.tinkerpop.gremlin.scala.ScalaFluentPipeline]]. */
+object ScalaFluentPipeline {
+ implicit def wrap[A, B](fp: FluentPipeline[A, B]) = new ScalaFluentPipeline(fp)
+ implicit def unwrap[A, B](wrapper: ScalaFluentPipeline[A, B]) = wrapper.pipeline
+}
+
diff --git a/gremlin-scala/src/test/scala/GremlinScalaTest.scala b/gremlin-scala/src/test/scala/GremlinScalaTest.scala
new file mode 100644
index 00000000..54af5499
--- /dev/null
+++ b/gremlin-scala/src/test/scala/GremlinScalaTest.scala
@@ -0,0 +1,15 @@
+package com.tinkerpop.gremlin
+
+import com.tinkerpop.blueprints.pgm.Vertex
+import com.tinkerpop.blueprints.pgm.impls.tg.TinkerGraphFactory
+import com.tinkerpop.pipes.util.FluentPipeline
+import _root_.scala.collection.JavaConversions
+import junit.framework.TestCase
+
+class GremlinScalaTest extends TestCase {
+ def testGremlin() {
+ val g = TinkerGraphFactory.createTinkerGraph();
+ val pipe = new FluentPipeline[Vertex, Vertex];
+ JavaConversions.asScalaIterator[Vertex](pipe.start(g.getVertex(1)).out("knows").asInstanceOf[java.util.Iterator[Vertex]]);
+ }
+}
diff --git a/gremlin-scala/src/test/scala/ScalaPipeFunctionTest.scala b/gremlin-scala/src/test/scala/ScalaPipeFunctionTest.scala
new file mode 100644
index 00000000..6d430701
--- /dev/null
+++ b/gremlin-scala/src/test/scala/ScalaPipeFunctionTest.scala
@@ -0,0 +1,28 @@
+package com.tinkerpop.gremlin
+
+import org.specs2.mutable._
+import com.tinkerpop.blueprints.pgm.Vertex
+import com.tinkerpop.blueprints.pgm.impls.tg.TinkerGraphFactory
+import com.tinkerpop.pipes.PipeFunction
+import com.tinkerpop.pipes.util.FluentPipeline
+import com.tinkerpop.gremlin.scala._
+
+class ScalaPipeFunctionTest extends SpecificationWithJUnit {
+ "The scala PipeFunction implicits" should {
+ "properly wrap any function literal" in {
+ val f: String => Int = s => s.length
+ val pf: PipeFunction[String, Int] = f
+
+ pf.compute("abcd") must_== f("abcd")
+ }
+
+ "properly wrap a String => Boolean function literal" in {
+ val graph = TinkerGraphFactory.createTinkerGraph()
+ val fp = new FluentPipeline(graph getVertex 1) out "knows" property "name" filter { s: String => s startsWith "j" }
+
+ fp.hasNext() must_== true
+ fp.next() must_== "josh"
+ fp.hasNext() must_== false
+ }
+ }
+}
diff --git a/gremlin-scala/src/test/scala/ScalaWrapperTest.scala b/gremlin-scala/src/test/scala/ScalaWrapperTest.scala
new file mode 100644
index 00000000..3de7fabf
--- /dev/null
+++ b/gremlin-scala/src/test/scala/ScalaWrapperTest.scala
@@ -0,0 +1,117 @@
+package com.tinkerpop.gremlin
+
+import org.specs2.mutable._
+import com.tinkerpop.blueprints.pgm.{Graph, Vertex}
+import com.tinkerpop.blueprints.pgm.impls.tg.TinkerGraphFactory
+import com.tinkerpop.pipes.PipeFunction
+import com.tinkerpop.pipes.util.FluentPipeline
+import com.tinkerpop.gremlin.scala._
+
+class ScalaWrapperTest extends SpecificationWithJUnit {
+ "The ScalaFluentPipeline wrapper" should {
+ "be a Scala Iterator" in {
+ val g = TinkerGraphFactory.createTinkerGraph()
+ val i: Iterator[Any] = new ScalaFluentPipeline(new FluentPipeline(g).V())
+
+ //TODO assert that the proper values come out of the next() calls
+ i.hasNext must beTrue
+ i.next() must_!= null
+ i.hasNext must beTrue
+ i.next() must_!= null
+ i.hasNext must beTrue
+ i.next() must_!= null
+ i.hasNext must beTrue
+ i.next() must_!= null
+ i.hasNext must beTrue
+ i.next() must_!= null
+ i.hasNext must beTrue
+ i.next() must_!= null
+ i.hasNext must beFalse
+ }
+
+ "implicitly wrap a FluentPipeline" in {
+ val g = TinkerGraphFactory.createTinkerGraph()
+ val sfp: ScalaFluentPipeline[_,_] = new FluentPipeline(g).V()
+
+ //sfp must_!= null // <===== weird compiler errors on this line...
+ sfp.isInstanceOf[ScalaFluentPipeline[_,_]] must beTrue
+ }
+
+ "implicitly wrap a FluentPipeline when calling an Iterable method" in {
+ val g = TinkerGraphFactory.createTinkerGraph()
+ val i: Iterable[Any] = new FluentPipeline(g).V().toIterable
+
+ i must_!= null
+ }
+
+ "unwrap ScalaFluentPipeline => FluentPipeline" in {
+ val g = TinkerGraphFactory.createTinkerGraph()
+ val fp: FluentPipeline[_,_] = new FluentPipeline(g)
+ val sfp: ScalaFluentPipeline[_,_] = fp
+ def toString(p: FluentPipeline[_,_]) = p.toString
+
+ toString(fp) must_== toString(sfp) //sfp must be unwrapped when passed to print
+ }
+ }
+
+ "The ScalaGraph wrapper" should {
+ "return all vertices using V" in {
+ val g = TinkerGraphFactory.createTinkerGraph()
+ val vs = g.V.toIterable
+
+ vs must have size(6)
+ vs must contain(g getVertex 1)
+ vs must contain(g getVertex 2)
+ vs must contain(g getVertex 3)
+ vs must contain(g getVertex 4)
+ vs must contain(g getVertex 5)
+ vs must contain(g getVertex 6)
+ }
+
+ //TODO graph.E
+ //TODO graph.v(id)
+ //TODO unwrap ScalaGraph => Graph
+ }
+
+ "The ScalaVertex wrapper" should {
+ "return all out vertices using out" in {
+ val g = TinkerGraphFactory.createTinkerGraph()
+ val vs = g.getVertex(1).out.toIterable
+
+ vs must have size(3)
+ vs must contain(g getVertex 2)
+ vs must contain(g getVertex 3)
+ vs must contain(g getVertex 4)
+ }
+
+ "return proper out vertices using out with label" in {
+ val g = TinkerGraphFactory.createTinkerGraph()
+ val vs = g.getVertex(1).out("knows").toIterable
+
+ vs must have size(2)
+ vs must contain(g getVertex 2)
+ vs must contain(g getVertex 4)
+ }
+
+ //TODO vertex.outE and vertex.outE()
+ //TODO vertex.in and vertex.in(label)
+ //TODO vertex.inE and vertex.inE(label)
+ //TODO vertex.both and vertex.bothE(label)
+
+ "get unwrapped by the implicit" in {
+ val g = TinkerGraphFactory.createTinkerGraph()
+ val v1: Vertex = g getVertex 1
+ val v2: ScalaVertex = v1
+ def toString(v: Vertex) = v.toString
+
+ toString(v1) must_== toString(v2) //v2 must be unwrapped when passed to toString
+ }
+ }
+
+ /*"The ScalaEdge wrapper" should {
+ //TODO edge.inV
+ //TODO edge.outV
+ //TODO edge.bothV
+ //TODO unwrap ScalaEdge => Edge
+ }*/
+}
diff --git a/gremlin.sh b/gremlin.sh
index 23e02eea..4fe8eea4 100755
--- a/gremlin.sh
+++ b/gremlin.sh
@@ -1,3 +1,3 @@
#!/bin/bash
-`dirname $0`/target/gremlin-*-standalone/bin/gremlin.sh $@
+`dirname $0`/gremlin-groovy/target/gremlin-*-standalone/bin/gremlin.sh $@
diff --git a/pom.xml b/pom.xml
index ea70cdc0..e12b0964 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,232 +1,79 @@
-
-
- 4.0.0
- com.tinkerpop
- gremlin
- 1.4-SNAPSHOT
-
- jar
- http://gremlin.tinkerpop.com
- Gremlin: A Graph Traversal Language
- Gremlin is a domain specific language for traversing property graphs.
- Gremlin makes use of a path-based syntax written in Groovy to support complex graph traversals.
- This language has application in the areas of graph query, analysis, and manipulation.
-
-
-
- Marko A. Rodriguez
- marko@markorodriguez.com
- http://markorodriguez.com
-
-
-
-
- Pavel Yaskevich
- povel.y@gmail.com
- http://github.com/xedin
-
-
- Darrick Wiebe
- darrick@innatesoftware.com
- http://github.com/pangloss
-
-
- Peter Neubauer
- peter.neubauer@neotechnology.com
- http://www.linkedin.com/in/neubauer
-
-
-
-
- Gremlin Users
- http://groups.google.com/group/gremlin-users
- http://groups.google.com/group/gremlin-users
- http://groups.google.com/group/gremlin-users/topics
-
-
- 2009
-
- UTF-8
-
-
-
- com.tinkerpop.blueprints
- blueprints-core
- 1.1-SNAPSHOT
-
-
-
- com.tinkerpop.blueprints
- blueprints-graph-jung
- 1.1-SNAPSHOT
- provided
-
-
- com.tinkerpop.blueprints
- blueprints-graph-sail
- 1.1-SNAPSHOT
- provided
-
-
- com.tinkerpop.blueprints
- blueprints-neo4j-graph
- 1.1-SNAPSHOT
- provided
-
-
- com.tinkerpop.blueprints
- blueprints-orient-graph
- 1.1-SNAPSHOT
- provided
-
-
- com.tinkerpop.blueprints
- blueprints-dex-graph
- 1.1-SNAPSHOT
- provided
-
-
- com.tinkerpop.blueprints
- blueprints-sail-graph
- 1.1-SNAPSHOT
- provided
-
-
- com.tinkerpop.blueprints
- blueprints-rexster-graph
- 1.1-SNAPSHOT
- provided
-
-
-
- com.tinkerpop
- pipes
- 0.9-SNAPSHOT
-
-
- org.codehaus.groovy
- groovy
- 1.8.2
-
-
-
- org.fusesource.jansi
- jansi
- 1.5
-
-
- jline
- jline
- 0.9.94
-
-
-
- org.codehaus.gmaven
- gmaven-plugin
- 1.3
- provided
-
-
-
- junit
- junit
- 4.5
- test
-
-
-
-
- tinkerpop-repository
- TinkerPop Maven2 Repository
- http://tinkerpop.com/maven2
-
- true
- always
-
-
-
-
- ${basedir}/target
- ${project.artifactId}-${project.version}
-
-
- ${basedir}/src/main/resources
-
-
-
-
-
- maven-compiler-plugin
- 2.3.2
-
-
- 1.6
-
-
-
- maven-assembly-plugin
- 2.2-beta-4
-
-
- package
-
- assembly
-
-
-
-
-
- src/assembly/standalone.xml
- src/assembly/distribution.xml
-
- ${project.artifactId}-${project.version}
- target
- target/assembly/work
- warn
-
-
- com.tinkerpop.gremlin.console.Console
-
-
-
-
-
- org.codehaus.gmaven
- gmaven-plugin
- 1.3
-
-
-
- generateStubs
- compile
- generateTestStubs
- testCompile
-
-
- 1.7
-
-
-
-
-
- maven-deploy-plugin
- 2.5
-
-
- org.apache.maven.wagon
- wagon-ftp
- 1.0-alpha-6
-
-
-
-
-
-
-
- tinkerpop-repository
- TinkerPop Maven2 Repository
- ftp://ftp.tinkerpop.com:21/public/maven2/
-
-
-
\ No newline at end of file
+
+
+ 4.0.0
+ com.tinkerpop.gremlin
+ gremlin
+ 1.4-SNAPSHOT
+ pom
+ http://gremlin.tinkerpop.com
+ Gremlin: A Graph Traversal Language
+ Gremlin is a domain specific language for traversing property graphs.
+ Gremlin makes use of a path-based syntax to support complex graph traversals.
+ This language has application in the areas of graph query, analysis, and manipulation.
+
+ 2011
+
+
+ Marko A. Rodriguez
+ marko@markorodriguez.com
+ http://markorodriguez.com
+
+
+
+
+ gremlin-core
+ gremlin-groovy
+ gremlin-scala
+
+
+
+
+ tinkerpop-repository
+ TinkerPop Maven2 Repository
+ http://tinkerpop.com/maven2
+
+ true
+ always
+
+
+
+
+
+ ${basedir}/target
+
+
+ maven-deploy-plugin
+ 2.5
+
+
+ org.apache.maven.wagon
+ wagon-ftp
+ 1.0-alpha-6
+
+
+
+
+
+
+
+
+ tinkerpop-repository
+ TinkerPop Maven2 Repository
+ ftp://ftp.tinkerpop.com:21/public/maven2/
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 2.8
+
+ true
+
+
+
+
+