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)); }
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); }
public MapperQueryExecutionContext(QueryExecutionContext context, QueryStep queryStep) { Context = context; QueryStep = queryStep; }