public static IModelGremlinQueryProvider <TNative> RewriteSteps <TStep, TNative>(this IModelGremlinQueryProvider <TNative> provider, Func <TStep, Option <IEnumerable <GremlinStep> > > replacementStepFactory) where TStep : NonTerminalGremlinStep
 {
     return(new RewriteStepsQueryProvider <TStep, TNative>(provider, replacementStepFactory));
 }
        public static IModelGremlinQueryProvider <TNative> DecorateElementProperty <TSource, TProperty, TNative>(this IModelGremlinQueryProvider <TNative> provider, Func <TSource, bool> overrideCriterion, Func <AddElementPropertiesStep, DecorateAddElementPropertiesStep <TSource, TProperty> > replacementStepFactory)
        {
            return(provider
                   .RewriteSteps <AddElementPropertiesStep, TNative>(step =>
            {
                if (step.Element is TSource source)
                {
                    if (overrideCriterion(source))
                    {
                        return new[] { replacementStepFactory(step) }
                    }
                    ;
                }

                return Option <IEnumerable <GremlinStep> > .None;
            }));
        }
 public static IModelGremlinQueryProvider <TNative> SetDefautElementProperty <TSource, TProperty, TNative>(this IModelGremlinQueryProvider <TNative> provider, Func <TSource, bool> overrideCriterion, Expression <Func <TSource, TProperty> > memberExpression, TProperty value)
 {
     return(provider
            .DecorateElementProperty(overrideCriterion, step => new SetDefaultElementPropertyStep <TSource, TProperty>(step, memberExpression, value)));
 }
 public static ITypedGremlinQueryProvider WithJsonSupport(this IModelGremlinQueryProvider <JToken> provider)
 {
     return(new JsonSupportTypedGremlinQueryProvider(provider));
 }
            public JsonSupportTypedGremlinQueryProvider(IModelGremlinQueryProvider <JToken> baseProvider)
            {
                this._baseProvider = baseProvider;

                this._transformRule = JsonTransformRules
                                      .Empty
                                      .Lazy((token, recurse) => token is JObject jObject && (jObject["@type"]?.ToString().Equals("g:Property", StringComparison.OrdinalIgnoreCase)).GetValueOrDefault()
                        ? jObject.TryGetValue("@value")
                                            .Map(value => value as JObject)
                                            .Bind(valueObject => valueObject.TryGetValue("value"))
                        : Option <JToken> .None)
                                      .Lazy((token, recurse) =>
                {
                    if (token is JObject jObject && (jObject["@type"]?.ToString().Equals("g:Map", StringComparison.OrdinalIgnoreCase)).GetValueOrDefault())
                    {
                        return(jObject.TryGetValue("@value")
                               .Map(value => value as JArray)
                               .Bind(array =>
                        {
                            var mapObject = new JObject();

                            for (var i = 0; i < array.Count - 1; i += 2)
                            {
                                if (array[i] is JValue value && value.Value is string key)
                                {
                                    mapObject[key] = array[i + 1];
                                }
                            }

                            return recurse(mapObject);
                        }));
                    }

                    return(Option <JToken> .None);
                })
                                      .Lazy((token, recurse) => token is JObject jObject && jObject.ContainsKey("@type") && jObject["@value"] is JToken valueToken
                        ? recurse(valueToken)
                        : Option <JToken> .None)
                                      .Lazy((token, recurse) =>
                {
                    if (token is JObject jObject && (jObject.Parent?.Parent is JObject typedVertexProperty && typedVertexProperty["@type"]?.ToString() == "g:VertexProperty" || jObject.Parent?.Parent?.Parent?.Parent is JProperty parentProperty && parentProperty.Name.Equals("properties", StringComparison.OrdinalIgnoreCase)))
                    {
                        return(jObject
                               .TryGetValue("value")
                               .Bind(recurse));
                    }

                    return(Option <JToken> .None);
                })
                                      .Lazy((token, recurse) =>
                {
                    if (token is JObject jObject && !jObject.ContainsKey("$type"))
                    {
                        return(jObject
                               .TryGetValue("label")
                               .Bind(labelToken => baseProvider.Model
                                     .TryGetElementTypeOfLabel(labelToken.ToString()))
                               .Bind(type =>
                        {
                            jObject.AddFirst(new JProperty("$type", type.AssemblyQualifiedName));

                            return recurse(jObject);
                        }));
                    }

                    return(Option <JToken> .None);
                })
                                      .Lazy((token, recurse) =>
                {
                    if (token is JObject jObject && jObject["properties"] is JObject propertiesObject)
                    {
                        foreach (var item in propertiesObject)
                        {
                            jObject[item.Key] = recurse(item.Value).IfNone(jObject[item.Key]);
                        }

                        propertiesObject.Parent.Remove();

                        return(recurse(jObject));
                    }

                    return(Option <JToken> .None);
                })
                                      .Lazy(JsonTransformRules.Identity);
            }
 public RewriteStepsQueryProvider(IModelGremlinQueryProvider <TNative> baseTypedGremlinQueryProvider, Func <TStep, Option <IEnumerable <GremlinStep> > > replacementStepFactory)
 {
     this._replacementStepFactory        = replacementStepFactory;
     this._baseTypedGremlinQueryProvider = baseTypedGremlinQueryProvider;
 }