public override IEnumerable <TerminalGremlinStep> Resolve(IGraphModel model) { return(TypeProperties.GetOrAdd( this.Element.GetType(), type => type .GetProperties() .Where(property => IsNativeType(property.PropertyType)) .ToArray()) .SelectMany(property => { var value = property.GetValue(this.Element); var propertyName = model.GetIdentifier(property.Name); if (value != null) { if (property.PropertyType.IsArray) //TODO: Other types? { return ((IEnumerable)value) .Cast <object>() .Select(item => new MethodGremlinStep("property", propertyName, item)); } return new[] { new MethodGremlinStep("property", propertyName, value) }; } return Array.Empty <MethodGremlinStep>(); })); }
public override IEnumerable <TerminalGremlinStep> Resolve(IGraphModel model) { var key = model.GetIdentifier(this._key); yield return(this._value.Match( value => new MethodGremlinStep(Name, key, value), () => new MethodGremlinStep(Name, key))); }
public override IEnumerable <TerminalGremlinStep> Resolve(IGraphModel model) { var keys = this._projections .Select(projection => { if (projection.Body.StripConvert() is MemberExpression memberExpression) { return(model.GetIdentifier(memberExpression.Member.Name)); } throw new NotSupportedException(); }) .ToArray(); var numberOfIdSteps = keys .OfType <T>() .Count(x => x == T.Id); var propertyKeys = keys .OfType <string>() .Cast <object>() .ToArray(); if (numberOfIdSteps > 1 || numberOfIdSteps > 0 && propertyKeys.Length > 0) { yield return(new MethodGremlinStep("union", GremlinQuery.Anonymous.AddStep(new MethodGremlinStep( "values", propertyKeys .ToImmutableList())), GremlinQuery.Anonymous.Id())); } else if (numberOfIdSteps > 0) { yield return(new MethodGremlinStep("id")); } else { yield return(new MethodGremlinStep( "values", propertyKeys .ToImmutableList())); } }
public override object GetIdentifier(Expression expression) { return _model.GetIdentifier(expression); }