Nest ve Elastic client için query specification oluşturma
Spec :
public class UserIdEqualsSpecification<T>(Guid user_id) : ElasticSpecification<T> where T : class
{
public override Query ToQuery()
{
return new TermQuery(Infer.Field("user_id"))
{
Value = user_id.ToString()
};
}
}Kullanım :
var spec = SpecificationBuilderFactory.GetClientBuilder<ComplaintDocument>()
.And<UserIdEqualsSpecification<ComplaintDocument>>(userId)
.And<ComplaintReasonEqualsSpecification<ComplaintDocument>>(reasonType)
.And<ComplaintReasonTypeIdEqualsSpecification<ComplaintDocument>>(reasonTypeId)
.Build();
var response = await elasticClient.SearchAsync<ComplaintDocument>(s => s
.Index(TableNameConstants.Complaint)
.Query(spec.ToQuery())
);Spec :
public class CreatedAtLessThanSpecification<T>(DateTime lessThanDate) : ElasticSpecification<T> where T : class
{
public override QueryContainer ToQuery(QueryContainerDescriptor<T> descriptor)
{
return descriptor.DateRange(dr => dr
.Field("created_at")
.LessThan(lessThanDate)
);
}
}Kullanım :
var spec = SpecificationBuilderFactory.GetNestBuilder<GetPostReactionsQueryResult>()
.And<PostIdEqualsSpecification<GetPostReactionsQueryResult>>(request.PostId)
.And<CreatedAtLessThanSpecification<GetPostReactionsQueryResult>>(request.LastCreatedDate)
.Build();
var query = await nestClient.SearchAsync<GetPostReactionsQueryResult>(s => s
.Index(TableNameConstants.PostReaction)
.Query(q => spec.ToQuery(q))
);