blob: 72409f39d9b7d88e907bf44ce165d1e2251492bf [file] [log] [blame]
/*
* 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-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs")
// 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('#region License\n' +
'\n' +
'/*\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' +
'\n' +
'#endregion\n')
writer.writeLine("\n\n//********************************************************************************")
writer.writeLine("//* Do NOT edit this file directly - generated by build/generate.groovy")
writer.writeLine("//********************************************************************************\n")
writer.writeLine("#nullable disable\n")
writer.writeLine('using System;\n' +
'using System.Numerics;\n' +
'using System.Collections.Generic;\n' +
'using Gremlin.Net.Structure;\n' +
'using Gremlin.Net.Process.Traversal;\n' +
'using Gremlin.Net.Process.Traversal.Strategy.Optimization;\n' +
'using Gremlin.Net.Process.Traversal.Strategy.Verification;\n' +
'using Gremlin.Net.Process.Traversal.Strategy.Decoration;\n')
writer.writeLine('namespace Gremlin.Net.IntegrationTest.Gherkin\n' +
'{\n' +
' public class Gremlin\n' +
' {\n' +
' public static void InstantiateTranslationsForTestRun()\n' +
' {\n' +
' // We need to copy the fixed translations as we remove translations from the list after using them\n' +
' // so we can enumerate through the translations while evaluating a scenario.\n' +
' _translationsForTestRun =\n' +
' new Dictionary<string, List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>>>(\n' +
' FixedTranslations.Count);\n' +
' foreach (var (traversal, translations) in FixedTranslations)\n' +
' {\n' +
' _translationsForTestRun.Add(traversal,\n' +
' new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>>(translations));\n' +
' }\n' +
' }\n')
writer.writeLine(
' private static IDictionary<string, List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>>>\n' +
' _translationsForTestRun;\n')
writer.writeLine(
' private static readonly IDictionary<string, List<Func<GraphTraversalSource, IDictionary<string, object>,ITraversal>>> FixedTranslations = \n' +
' new Dictionary<string, List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>>>\n' +
' {')
// some traversals may require a static translation if the translator can't handle them for some reason
def staticTranslate = [
"g_withSackX_128bX_injectX1bX_sackXminusX_sack" : " {\"g_withSackX_128bX_injectX1bX_sackXminusX_sack\", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithSack((short) -128).Inject<object>((short) 1).Sack(Operator.Minus).Sack<object>()}}, ",
"g_V_injectX_128b__1bX_sumXX" : " {\"g_V_injectX_128b__1bX_sumXX\", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>((short) -128, (short) -1).Sum<object>()}}, ",
"g_withSackX_128bX_injectX_1bX_sackXdivX_sack" : " {\"g_withSackX_128bX_injectX_1bX_sackXdivX_sack\", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithSack((short) -128).Inject<object>((short) -1).Sack(Operator.Div).Sack<object>()}}, "
]
// SAMPLE: g_injectXnull_nullX: " {\"g_injectXnull_nullX\", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(null,null)}}, ",1\"]).Values<object>(\"age\").Inject(null,null)}}, "
gremlins.each { k,v ->
if (staticTranslate.containsKey(k)) {
writer.writeLine(staticTranslate[k])
} else {
writer.write(" {\"")
writer.write(k)
writer.write("\", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {")
def collected = v.collect { GremlinTranslator.translate(it, Translator.DOTNET) }
def gremlinItty = collected.iterator()
while (gremlinItty.hasNext()) {
def t = gremlinItty.next()
writer.write("(g,p) =>")
writer.write(t.getTranslated().
replaceAll("xx([0-9]+)", "p[\"xx\$1\"]").
replaceAll("v([0-9]+)", "(Vertex) p[\"v\$1\"]").
replaceAll("vid([0-9]+)", "p[\"vid\$1\"]").
replaceAll("e([0-9]+)", "p[\"e\$1\"]").
replaceAll("eid([0-9]+)", "p[\"eid\$1\"]").
replaceAll("l([0-9]+)", "(IFunction) p[\"l\$1\"]").
replaceAll("pred([0-9]+)", "(IPredicate) p[\"pred\$1\"]").
replaceAll("c([0-9]+)", "(IComparator) p[\"c\$1\"]"))
if (gremlinItty.hasNext())
writer.write(', ')
else
writer.write("}")
}
writer.writeLine('}, ')
}
}
writer.writeLine(' };\n')
writer.writeLine(
' public static ITraversal UseTraversal(string scenarioName, GraphTraversalSource g, IDictionary<string, object> parameters, IDictionary<string, object> sideEffects)\n' +
' {\n' +
' List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> list = _translationsForTestRun[scenarioName];\n' +
' Func<GraphTraversalSource, IDictionary<string, object>, ITraversal> f = list[0];\n' +
' list.RemoveAt(0);\n' +
' ITraversal traversal = f.Invoke(g, parameters);\n' +
' foreach (var sideEffect in sideEffects)\n' +
' {\n' +
' traversal.Bytecode.AddSource("withSideEffect", sideEffect.Key, sideEffect.Value);\n' +
' }\n' +
' return traversal;\n' +
' }\n' +
' }\n' +
'}\n')
writer.writeLine("#nullable restore\n")
}