gremlin-go/build/generate.groovy (92 lines of code) (raw):
/*
* 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.
*/
import org.apache.tinkerpop.gremlin.language.translator.GremlinTranslator
import org.apache.tinkerpop.gremlin.language.translator.Translator
import org.apache.tinkerpop.gremlin.language.corpus.FeatureReader
import java.nio.file.Paths
// file is overwritten on each generation
radishGremlinFile = new File("${projectBaseDir}/gremlin-go/driver/cucumber/gremlin.go")
// assumes globally unique scenario names for keys with list of Gremlin traversals as they appear
gremlins = FeatureReader.parseGrouped(Paths.get("${projectBaseDir}", "gremlin-test", "src", "main", "resources", "org", "apache", "tinkerpop", "gremlin", "test", "features").toString())
radishGremlinFile.withWriter('UTF-8') { Writer writer ->
writer.writeLine('/*\n' +
'Licensed to the Apache Software Foundation (ASF) under one\n' +
'or more contributor license agreements. See the NOTICE file\n' +
'distributed with this work for additional information\n' +
'regarding copyright ownership. The ASF licenses this file\n' +
'to you under the Apache License, Version 2.0 (the\n' +
'"License"); you may not use this file except in compliance\n' +
'with the License. You may obtain a copy of the License at\n' +
'\n' +
'http://www.apache.org/licenses/LICENSE-2.0\n' +
'\n' +
'Unless required by applicable law or agreed to in writing,\n' +
'software distributed under the License is distributed on an\n' +
'"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n' +
'KIND, either express or implied. See the License for the\n' +
'specific language governing permissions and limitations\n' +
'under the License.\n' +
'*/\n')
writer.writeLine("\n//********************************************************************************")
writer.writeLine("//* Do NOT edit this file directly - generated by build/generate.groovy")
writer.writeLine("//********************************************************************************\n")
writer.writeLine(
'package gremlingo\n' +
'\n' +
'import (\n' +
'\t \"errors\"\n' +
'\t \"time\"\n' +
'\t \"math\"\n' +
'\t \"github.com/apache/tinkerpop/gremlin-go/v3/driver\"\n' +
'\t \"github.com/google/uuid\"\n' +
')\n'
)
// We might need a function to copy all the translations
writer.writeLine(
'var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal{'
)
def staticTranslate = [:]
gremlins.each { k,v ->
if (staticTranslate.containsKey(k)) {
writer.writeLine(staticTranslate[k])
} else {
writer.write(" ")
writer.write("\"")
writer.write(k)
writer.write("\": {")
def collected = v.collect { GremlinTranslator.translate(it, Translator.GO) }
def uniqueBindings = collected.collect { it.getParameters() }.flatten().unique()
def gremlinItty = collected.iterator()
while (gremlinItty.hasNext()) {
def t = gremlinItty.next()
writer.write("func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return ")
try {
writer.write(t.getTranslated().
replaceAll("xx([0-9]+)", "p[\"xx\$1\"]").
replaceAll("v([0-9]+)", "p[\"v\$1\"]").
replaceAll("vid([0-9]+)", "p[\"vid\$1\"]").
replaceAll("e([0-9]+)", "p[\"e\$1\"]").
replaceAll("eid([0-9]+)", "p[\"eid\$1\"]").
replace("l1", "p[\"l1\"]").
replace("l2", "p[\"l2\"]").
replace("pred1", "p[\"pred1\"]").
replace("c1", "p[\"c1\"]").
replace("c2", "p[\"c2\"]"))
} catch (ignored) {
// Putting these in place of not implemented functions
// TODO make sure all is supported
writer.write("nil")
}
writer.write("}")
if (gremlinItty.hasNext())
writer.write(', ')
}
writer.writeLine('}, ')
}
}
writer.writeLine('}\n')
writer.writeLine(
' func GetTraversal(scenarioName string, g *gremlingo.GraphTraversalSource, parameters map[string]interface{}) (*gremlingo.GraphTraversal, error) {\n' +
' if traversalFns, ok := translationMap[scenarioName]; ok {\n' +
' traversal := traversalFns[0]\n' +
' translationMap[scenarioName] = traversalFns[1:]\n' +
' return traversal(g, parameters), nil\n' +
' } else {\n' +
' return nil, errors.New("scenario for traversal not recognized")\n' +
' }\n' +
' }\n'
)
}