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; }