Пример #1
0
 public static IGremlinQuerySerializer ToGroovy(this IGremlinQuerySerializer serializer, GroovyFormatting formatting = GroovyFormatting.BindingsOnly)
 {
     return(serializer
            .Select(serialized => serialized switch
     {
         GroovyGremlinQuery serializedQuery => formatting == GroovyFormatting.AllowInlining
                 ? serializedQuery.Inline()
                 : serializedQuery,
         Bytecode byteCode => byteCode.ToGroovy(formatting),
         _ => throw new NotSupportedException($"Can't convert serialized query of type {serialized.GetType()} to {nameof(GroovyGremlinQuery)}.")
     }));
Пример #2
0
 public static IGremlinQuerySerializer ToGroovy(this IGremlinQuerySerializer serializer)
 {
     return(serializer
            .Select(serialized =>
     {
         return serialized switch
         {
             GroovyGremlinQuery serializedQuery => serializedQuery,
             Bytecode bytecode => bytecode.ToGroovy(),
             _ => throw new NotSupportedException($"Can't convert serialized query of type {serialized.GetType()} to {nameof(GroovyGremlinQuery)}.")
         };
     }));
 }
            public IAsyncEnumerable <object> Execute(ISerializedGremlinQuery serializedQuery, IGremlinQueryEnvironment environment)
            {
                return(AsyncEnumerable.Create(Core));

                async IAsyncEnumerator <object> Core(CancellationToken ct)
                {
                    var maybeResults = default(ResultSet <JToken>?);
                    var clientTask   = _lazyGremlinClient.GetValue(environment.Logger);

                    if (!Guid.TryParse(serializedQuery.Id, out var requestId))
                    {
                        requestId = Guid.NewGuid();
                        environment.Logger.LogInformation($"Mapping query id {serializedQuery.Id} to request id {requestId}.");
                    }

                    var requestMessage = serializedQuery switch
                    {
                        GroovyGremlinQuery groovyScript => RequestMessage
                        .Build(Tokens.OpsEval)
                        .AddArgument(Tokens.ArgsGremlin, groovyScript.Script)
                        .AddArgument(Tokens.ArgsAliases, _aliasArgs)
                        .AddArgument(Tokens.ArgsBindings, groovyScript.Bindings)
                        .OverrideRequestId(requestId)
                        .Create(),
                        BytecodeGremlinQuery bytecodeQuery => RequestMessage
                        .Build(Tokens.OpsBytecode)
                        .Processor(Tokens.ProcessorTraversal)
                        .AddArgument(Tokens.ArgsGremlin, bytecodeQuery.Bytecode)
                        .AddArgument(Tokens.ArgsAliases, _aliasArgs)
                        .OverrideRequestId(requestId)
                        .Create(),
                        _ => throw new ArgumentException($"Cannot handle serialized query of type {serializedQuery.GetType()}.")
                    };

                    maybeResults = await(await clientTask)
                                   .SubmitAsync <JToken>(requestMessage)
                                   .ConfigureAwait(false);

                    if (maybeResults is { } results)
                    {
                        foreach (var obj in results)
                        {
                            yield return(obj);
                        }
                    }
                }
            }
        }
Пример #4
0
        public static GroovyGremlinQuery ToGroovy(this Bytecode bytecode, GroovyFormatting formatting = GroovyFormatting.BindingsOnly)
        {
            var builder   = new StringBuilder();
            var bindings  = new Dictionary <object, string>();
            var variables = new Dictionary <string, object>();

            void Append(object obj, bool allowEnumerableExpansion = false)
            {
                switch (obj)
                {
                case Bytecode bytecode:
                {
                    if (builder.Length > 0)
                    {
                        builder.Append("__");
                    }

                    foreach (var instruction in bytecode.SourceInstructions.Concat(bytecode.StepInstructions))
                    {
                        builder.Append(builder.Length != 0
                                ? $".{instruction.OperatorName}("
                                : $"{instruction.OperatorName}(");

                        Append(instruction.Arguments, true);

                        builder.Append(")");
                    }

                    break;
                }

                case P {
                        Value: P p1
                } p:
                    {
                        Append(p1);
                        builder.Append($".{p.OperatorName}(");
                        Append(p.Other);

                        builder.Append(")");

                        break;
                    }

                case P p:
                {
                    builder.Append($"{p.OperatorName}(");

                    Append(p.Value, true);

                    builder.Append(")");

                    break;
                }

                case EnumWrapper t:
                {
                    builder.Append($"{t.EnumValue}");

                    break;
                }

                case ILambda lambda:
                {
                    builder.Append($"{{{lambda.LambdaExpression}}}");

                    break;
                }

                case string str when allowEnumerableExpansion:
                {
                    // ReSharper disable once TailRecursiveCall
                    Append(str);

                    break;
                }

                case Type type:
                {
                    builder.Append(type.Name);

                    break;
                }

                case IEnumerable enumerable when allowEnumerableExpansion:
                {
                    var comma = false;
                    foreach (var argument in enumerable)
                    {
                        if (comma)
                        {
                            builder.Append(", ");
                        }
                        else
                        {
                            comma = true;
                        }

                        Append(argument);
                    }

                    break;
                }

                default:
                {
                    if (!bindings.TryGetValue(obj, out var bindingKey))
                    {
                        var next = bindings.Count;

                        do
                        {
                            bindingKey = (char)('a' + next % 26) + bindingKey;
                            next      /= 26;
                        } while (next > 0);

                        bindingKey = "_" + bindingKey;
                        bindings.Add(obj, bindingKey);

                        variables[bindingKey] = obj;
                    }

                    builder.Append(bindingKey);

                    break;
                }
                }
            }

            Append(bytecode);

            var ret = new GroovyGremlinQuery(
                builder.ToString(),
                variables,
                true,
                false);

            return(formatting == GroovyFormatting.AllowInlining
                ? ret.Inline()
                : ret);
        }