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>();
            }));
        }
Esempio n. 2
0
        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()));
            }
        }
Esempio n. 4
0
 public override object GetIdentifier(Expression expression)
 {
     return _model.GetIdentifier(expression);
 }