Beispiel #1
0
        public async Task <IEnumerable <object> > QueryAsync(string queryName, QueryStep queryStep, IGraphRequestContext graphRequestContext)
        {
            var list = queryStep.QueryParameters.ToList();

            // ReSharper disable once AssignNullToNotNullAttribute
            var repo = _repositories[list.First().MemberModel.SourceType.FullName];

            MethodInfo method = repo.GetType().GetMethod("QueryAsync");

            // ReSharper disable once PossibleNullReferenceException
            var sourceType = list.First().MemberModel.SourceType;

            // TODO: This technique is not maintainable in the long round. Let's find a better way.
            if (sourceType == typeof(SearchModel))
            {
                sourceType = typeof(SearchResultModel);
            }
            MethodInfo generic = method.MakeGenericMethod(sourceType);

            var task = (Task)generic.Invoke(repo, new object[] { queryName, list, queryStep.Items, graphRequestContext });

            await task.ConfigureAwait(false);

            var resultProperty = task.GetType().GetProperty("Result");

            // ReSharper disable once PossibleNullReferenceException
            return((IEnumerable <object>)resultProperty.GetValue(task));
        }
Beispiel #2
0
        private QueryStep PrepQuery(SelectValue selectValue)
        {
            var qs = new QueryStep();

            qs.QueryParameters.Add(new QueryParameter
            {
                ContextValue = new ContextValue
                {
                    SelectValues = new List <SelectValue>
                    {
                        new SelectValue {
                            FieldName = "Id"
                        },
                        new SelectValue {
                            FieldName = "Field1"
                        }
                    },
                    Comparison = Comparisons.Equal
                }
            });

            qs.QueryParameters.First().ContextValue.SelectValues.Add(selectValue);

            return(qs);
        }
        public async Task <IEnumerable <object> > QueryAsync(string queryName, QueryStep queryStep, IGraphRequestContext graphRequestContext)
        {
            var list = queryStep.QueryParameters.ToList();

            // ReSharper disable once AssignNullToNotNullAttribute
            var repo = _repositories[list.First().MemberModel.SourceType.FullName];

            MethodInfo method = repo.GetType().GetMethod("QueryAsync");

            // ReSharper disable once PossibleNullReferenceException
            var sourceType = list.First().MemberModel.SourceType;

            if (queryStep.OverrideRepositoryWithType != null)
            {
                sourceType = queryStep.OverrideRepositoryWithType;
            }

            MethodInfo generic = method.MakeGenericMethod(sourceType);

            var task = (Task)generic.Invoke(repo, new object[] { queryName, list, queryStep.Items, graphRequestContext });

            await task.ConfigureAwait(false);

            var resultProperty = task.GetType().GetProperty("Result");

            // ReSharper disable once PossibleNullReferenceException
            return((IEnumerable <object>)resultProperty.GetValue(task));
        }
        public async Task QueryAsync(List <object> results, QueryStep queryStep, IGraphRequestContext graphRequestContext)
        {
            var selections = GetFirstComplexSelectValues(queryStep);

            if (selections != null && selections.Count > 0)
            {
                await QueryAndPopulateEdgeConnections(selections, results, graphRequestContext);
            }
        }
        public async Task QueryAsync(List <object> results, QueryStep queryStep, IGraphRequestContext graphRequestContext,
                                     QueryExecutionContext queryExecutionContext,
                                     List <ConnectionEdgeDestinationFilter> connectionEdgeDestinationFilters)
        {
            var selections = GetFirstComplexSelectValues(queryStep);

            if (selections != null && selections.Count > 0)
            {
                await QueryAndPopulateEdgeConnections(selections, results, graphRequestContext, connectionEdgeDestinationFilters, queryExecutionContext);
            }
        }
        private List <SelectValue> GetFirstComplexSelectValues(QueryStep queryStep)
        {
            var qp = queryStep.QueryParameters.FirstOrDefault();

            if (qp != null)
            {
                var selectedValues = qp.ContextValue.SelectValues;

                if (selectedValues != null)
                {
                    return(selectedValues.Where(x => x.SelectValues != null && x.SelectValues.Count > 0).ToList());
                }
            }

            return(null);
        }
        private async Task <object> GetValue(
            TypeAccessor edgeObjectTypeAccessor,
            ConnectionEdge connectionEdge,
            IGraphRequestContext graphRequestContext,
            List <ConnectionEdgeDestinationFilter> connectionEdgeDestinationFilters,
            QueryExecutionContext queryExecutionContext)
        {
            var member           = edgeObjectTypeAccessor.GetMembers().Single(x => x.Name == connectionEdge.MetaFieldName);
            var destTypeAccessor = TypeAccessor.Create(member.Type);
            var destQueryMember  = destTypeAccessor.GetMembers().Single(m => m.GetAttribute(typeof(KeyAttribute), true) != null);
            var qp = new QueryStep();

            qp.QueryParameters.Add(new QueryParameter
            {
                ContextValue = new ContextValue {
                    Comparison = Comparisons.Equal, Values = new List <object> {
                        connectionEdge.DestinationId
                    }
                },
                MemberModel = new ModelMember(member.Type, destTypeAccessor, destQueryMember, false)
            });

            if (connectionEdgeDestinationFilters != null)
            {
                connectionEdgeDestinationFilters.Where(x => x.Type == member.Type.AssemblyQualifiedName)
                .ToList().ForEach(connectionEdgeDestinationFilter =>
                {
                    qp.QueryParameters.Add(new QueryParameter
                    {
                        ContextValue = new ContextValue {
                            Comparison = Comparisons.Equal, Values = connectionEdgeDestinationFilter.Mapper(queryExecutionContext)
                        },
                        MemberModel = connectionEdgeDestinationFilter.ModelMember
                    });
                });
            }

            var entities = (await _graphQlRepositoryProvider.QueryAsync(EntityQueryName, qp, graphRequestContext)).ToList();

            if (entities.Count > 1)
            {
                throw new InvalidOperationException(MultipleEntitiesDetectedError);
            }

            return(entities.SingleOrDefault());
        }
        private QueryStep CreateQueryStep(ConnectionEdge connectionEdge)
        {
            var qp               = new QueryStep();
            var destType         = Type.GetType(connectionEdge.SourceType);
            var destTypeAccessor = TypeAccessor.Create(destType);
            var destQueryMember  = destTypeAccessor.GetMembers().Single(m => m.Name.ToLower() == connectionEdge.DestinationFieldName.ToLower());

            qp.QueryParameters.Add(new QueryParameter
            {
                ContextValue = new ContextValue {
                    Comparison = Comparisons.Equal, Values = new List <object> {
                        connectionEdge.DestinationId
                    }
                },
                MemberModel = new ModelMember(destType, destTypeAccessor, destQueryMember, false)
            });
            return(qp);
        }
        public void CanCloneQueryStep()
        {
            var  queryStep       = new QueryStep();
            bool isContextCalled = false;

            queryStep.ContextAction = (a) => { isContextCalled = true; };
            queryStep.StepMapper    = (m) =>
            {
                return(new List <object> {
                    "a", "b"
                });
            };

            queryStep.Items = new Dictionary <string, object>();
            queryStep.Items.Add("foo", "bar");

            var type         = typeof(QueryStepTest);
            var typeAccessor = TypeAccessor.Create(type);

            queryStep.QueryParameters.Add(new QueryParameter
            {
                Mapper = (m) => new List <object> {
                    "a", "b"
                },
                ContextValue = new ContextValue
                {
                    Comparison = Comparisons.Equal,
                    Values     = new List <object>
                    {
                        "value1", "value2", "value3"
                    }
                },
                MemberModel = new ModelMember(type, typeAccessor, typeAccessor.GetMembers().Single(), false),
                Rule        = new ContextValueSetRule
                {
                    DisableSetSelectValues = false
                }
            });

            var clone = queryStep.CloneQueryStep();

            clone.ContextAction(null);

            isContextCalled.ShouldBe(true);

            var cem = clone.StepMapper(null);

            cem.Count.ShouldBe(2);
            cem[0].ShouldBe("a");
            cem[1].ShouldBe("b");

            clone.Items.Count.ShouldBe(1);
            clone.Items["foo"].ShouldBe("bar");

            clone.QueryParameters.Count.ShouldBe(1);

            var mapped = clone.QueryParameters[0].Mapper(null);

            mapped.Count.ShouldBe(2);
            mapped[0].ShouldBe("a");
            mapped[1].ShouldBe("b");

            clone.QueryParameters[0].Rule.ShouldNotBeNull();
            clone.QueryParameters[0].Rule.DisableSetSelectValues.ShouldBe(false);

            clone.QueryParameters[0].ContextValue.Comparison.ShouldBe(Comparisons.Equal);
            clone.QueryParameters[0].ContextValue.Values.Count.ShouldBe(3);
            clone.QueryParameters[0].ContextValue.Values[0].ShouldBe("value1");
            clone.QueryParameters[0].ContextValue.Values[1].ShouldBe("value2");
            clone.QueryParameters[0].ContextValue.Values[2].ShouldBe("value3");

            clone.QueryParameters[0].MemberModel.Name.ShouldBe("id");
            clone.QueryParameters[0].MemberModel.Description.ShouldBe("test");
        }
        private QueryStep QueryConnectionEdge()
        {
            var queryStep = new QueryStep
            {
                ContextAction = ctx => ctx.SetResults(ctx.GetQueryResults <ConnectionEdge>())
            };

            if (_mapper != null)
            {
                queryStep.StepMapper = ctx => _mapper(ctx.Context);
            }

            var type         = typeof(ConnectionEdge);
            var typeAccessor = TypeAccessor.Create(type);
            var members      = typeAccessor.GetMembers().ToList();

            queryStep.QueryParameters.Add(new QueryParameter
            {
                MemberModel = new ModelMember(type, typeAccessor,
                                              members.Single(x => x.Name == "MetaType"), false),
                ContextValue = new ContextValue
                {
                    Comparison = Comparisons.Equal,
                    Values     = new List <object> {
                        typeof(TConnectionType).AssemblyQualifiedName
                    }
                }
            });

            queryStep.QueryParameters.Add(new QueryParameter
            {
                MemberModel = new ModelMember(type, typeAccessor,
                                              members.Single(x => x.Name == "SourceType"), false),
                ContextValue = new ContextValue
                {
                    Comparison = Comparisons.Equal,
                    Values     = new List <object> {
                        _withSourceIdFromSourceSourceType != null ? _withSourceIdFromSourceSourceType.AssemblyQualifiedName : typeof(TSource).AssemblyQualifiedName
                    }
                }
            });

            if (_withDestinationIdFromSource || _withDestinationId)
            {
                var destinationIdMember = new ModelMember(type, typeAccessor,
                                                          members.Single(x => x.Name == "DestinationId"), false);

                queryStep.QueryParameters.Add(new QueryParameter
                {
                    MemberModel = destinationIdMember,
                    Rule        = new ContextValueSetRule
                    {
                        DisableSetSelectValues  = _withDestinationId,
                        PopulateWithQueryValues = _withDestinationIdFromSource
                    }
                });

                if (_withDestinationId)
                {
                    _modelMemberList.Add(destinationIdMember);
                }
            }

            if (_withSourceIdFromSource)
            {
                var srcIdMember = new ModelMember(type, typeAccessor,
                                                  members.Single(x => x.Name == "SourceId"), false);

                queryStep.QueryParameters.Add(new QueryParameter
                {
                    MemberModel = srcIdMember,
                    Rule        = new ContextValueSetRule
                    {
                        DisableSetSelectValues  = true,
                        PopulateWithQueryValues = true
                    }
                });
            }
            return(queryStep);
        }
Beispiel #11
0
 public MapperQueryExecutionContext(QueryExecutionContext context, QueryStep queryStep)
 {
     Context   = context;
     QueryStep = queryStep;
 }