How to get total hits in Lucene Query in GraphQL #13921
Unanswered
aminmohammadi05
asked this question in
Q&A
Replies: 1 comment
-
In this version (2.1.6), you have to write some code in core. In File I add this if (query.ReturnContentItems &&
type.StartsWith("ContentItem/", StringComparison.OrdinalIgnoreCase))
{
var hasTotal = querySchema["hasTotal"].GetValue<bool>();
var contentType = type.Remove(0, 12);
if (hasTotal)
{
fieldType = BuildTotalContentTypeFieldType(schema, contentType, query, fieldTypeName);
}
else
{
fieldType = BuildContentTypeFieldType(schema, contentType, query, fieldTypeName);
}
}
else
{
fieldType = BuildSchemaBasedFieldType(query, querySchema, fieldTypeName);
} Change schema {
"type": "ContentItem/Product",
"hasTotal": true
} Add this function private FieldType BuildTotalContentTypeFieldType(ISchema schema, string contentType, Query query, string fieldTypeName)
{
var typeType = schema.Query.Fields.OfType<ContentItemsFieldType>().FirstOrDefault(x => x.Name == contentType);
if (typeType == null)
return null;
var totalType = new ObjectGraphType<LuceneQueryResults>
{
Name = fieldTypeName,
};
var items = new FieldType
{
Name = "items",
Type = typeType.Type,
ResolvedType = typeType.ResolvedType,
Resolver = new LockedAsyncFieldResolver<LuceneQueryResults, object>(async (context) =>
{
return context.Source?.Items ?? Array.Empty<object>();
}),
};
totalType.AddField(items);
var count = totalType.Field("count", typeof(IntGraphType));
count.Resolve(new LockedAsyncFieldResolver<LuceneQueryResults, object>(async (context) =>
{
return context.Source?.Count ?? 0;
}));
var fieldType = new FieldType
{
Arguments = new QueryArguments(
new QueryArgument<StringGraphType> { Name = "parameters" }
),
Name = fieldTypeName,
Description = S["Represents the {0} Query : {1}", query.Source, query.Name],
ResolvedType = totalType,
Resolver = new LockedAsyncFieldResolver<object, object>(ResolveAsync),
Type = totalType.GetType()
};
async ValueTask<object> ResolveAsync(IResolveFieldContext<object> context)
{
var queryManager = context.RequestServices.GetRequiredService<IQueryManager>();
var iQuery = await queryManager.GetQueryAsync(query.Name);
var parameters = context.GetArgument<string>("parameters");
var queryParameters = parameters != null
? JConvert.DeserializeObject<Dictionary<string, object>>(parameters)
: [];
var result = await queryManager.ExecuteQueryAsync(iQuery, queryParameters);
return result;
}
return fieldType;
} |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
I have this Schema
And this query to fetch Product content items
How can I get total hits of this query?
Beta Was this translation helpful? Give feedback.
All reactions