in src/Core/Resolvers/CosmosQueryStructure.cs [117:234]
private void Init(IDictionary<string, object?> queryParams)
{
IFieldSelection selection = _context.Selection;
ObjectType underlyingType = GraphQLUtils.UnderlyingGraphQLEntityType(selection.Field.Type);
IsPaginated = QueryBuilder.IsPaginationType(underlyingType);
OrderByColumns = new();
if (IsPaginated)
{
FieldNode? fieldNode = ExtractQueryField(selection.SyntaxNode);
if (fieldNode is not null)
{
Columns.AddRange(GenerateQueryColumns(fieldNode.SelectionSet!, _context.Document, SourceAlias));
}
ObjectType realType = GraphQLUtils.UnderlyingGraphQLEntityType(underlyingType.Fields[QueryBuilder.PAGINATION_FIELD_NAME].Type);
string entityName = MetadataProvider.GetEntityName(realType.Name);
EntityName = entityName;
Database = MetadataProvider.GetSchemaName(entityName);
Container = MetadataProvider.GetDatabaseObjectName(entityName);
}
else
{
Columns.AddRange(GenerateQueryColumns(selection.SyntaxNode.SelectionSet!, _context.Document, SourceAlias));
string typeName = GraphQLUtils.TryExtractGraphQLFieldModelName(underlyingType.Directives, out string? modelName) ?
modelName :
underlyingType.Name;
string entityName = MetadataProvider.GetEntityName(typeName);
EntityName = entityName;
Database = MetadataProvider.GetSchemaName(entityName);
Container = MetadataProvider.GetDatabaseObjectName(entityName);
}
HttpContext httpContext = GraphQLFilterParser.GetHttpContextFromMiddlewareContext(_context);
if (httpContext is not null)
{
AuthorizationPolicyHelpers.ProcessAuthorizationPolicies(
EntityActionOperation.Read,
this,
httpContext,
AuthorizationResolver,
(CosmosSqlMetadataProvider)MetadataProvider);
}
RuntimeConfigProvider.TryGetConfig(out RuntimeConfig? runtimeConfig);
// first and after will not be part of query parameters. They will be going into headers instead.
// TODO: Revisit 'first' while adding support for TOP queries
if (queryParams.ContainsKey(QueryBuilder.PAGE_START_ARGUMENT_NAME))
{
object? firstArgument = queryParams[QueryBuilder.PAGE_START_ARGUMENT_NAME];
MaxItemCount = runtimeConfig?.GetPaginationLimit((int?)firstArgument);
queryParams.Remove(QueryBuilder.PAGE_START_ARGUMENT_NAME);
}
else
{
// set max item count to default value.
MaxItemCount = runtimeConfig?.DefaultPageSize();
}
if (queryParams.ContainsKey(QueryBuilder.PAGINATION_TOKEN_ARGUMENT_NAME))
{
Continuation = (string?)queryParams[QueryBuilder.PAGINATION_TOKEN_ARGUMENT_NAME];
queryParams.Remove(QueryBuilder.PAGINATION_TOKEN_ARGUMENT_NAME);
}
if (queryParams.ContainsKey(QueryBuilder.PARTITION_KEY_FIELD_NAME))
{
PartitionKeyValue = (string?)queryParams[QueryBuilder.PARTITION_KEY_FIELD_NAME];
queryParams.Remove(QueryBuilder.PARTITION_KEY_FIELD_NAME);
}
if (queryParams.ContainsKey("orderBy"))
{
object? orderByObject = queryParams["orderBy"];
if (orderByObject is not null)
{
OrderByColumns = ProcessGraphQLOrderByArg((List<ObjectFieldNode>)orderByObject);
}
queryParams.Remove("orderBy");
}
if (queryParams.ContainsKey(QueryBuilder.FILTER_FIELD_NAME))
{
object? filterObject = queryParams[QueryBuilder.FILTER_FIELD_NAME];
if (filterObject is not null)
{
List<ObjectFieldNode> filterFields = (List<ObjectFieldNode>)filterObject;
Predicates.Add(
GraphQLFilterParser.Parse(
_context,
filterArgumentSchema: selection.Field.Arguments[QueryBuilder.FILTER_FIELD_NAME],
fields: filterFields,
queryStructure: this));
// after parsing all the GraphQL filters,
// reset the source alias and object name to the generic container alias
// since these may potentially be updated due to the presence of nested filters.
SourceAlias = _containerAlias;
DatabaseObject.Name = _containerAlias;
}
}
else
{
foreach (KeyValuePair<string, object?> parameter in queryParams)
{
Predicates.Add(new Predicate(
new PredicateOperand(new Column(tableSchema: string.Empty, _containerAlias, parameter.Key)),
PredicateOperation.Equal,
new PredicateOperand($"{MakeDbConnectionParam(parameter.Value)}")
));
}
}
}