in ec/ecdatasource/deploymentsdatasource/expanders.go [33:141]
func expandFilters(ctx context.Context, state modelV0) (*models.SearchRequest, diag.Diagnostics) {
var diags diag.Diagnostics
var queries []*models.QueryContainer
namePrefix := state.NamePrefix.ValueString()
if namePrefix != "" {
queries = append(queries, &models.QueryContainer{
Prefix: map[string]models.PrefixQuery{
// The "keyword" addition denotes that the query will be using a keyword
// field rather than a text field in order to ensure the query is not analyzed
"name.keyword": {Value: &namePrefix},
},
})
}
name := state.Name.ValueString()
if name != "" {
queries = append(queries, &models.QueryContainer{
Term: map[string]models.TermQuery{
"name.keyword": {Value: &name},
},
})
}
depTemplateID := state.DeploymentTemplateID.ValueString()
if depTemplateID != "" {
esPath := "resources.elasticsearch"
tplTermPath := esPath + ".info.plan_info.current.plan.deployment_template.id"
queries = append(queries, newNestedTermQuery(esPath, tplTermPath, depTemplateID))
}
healthy := state.Healthy.ValueString()
if healthy != "" {
if healthy != "true" && healthy != "false" {
diags.AddError("invalid value for healthy",
fmt.Sprintf("expected either [true] or [false] but got [%s]", healthy))
return nil, diags
}
queries = append(queries, &models.QueryContainer{
Term: map[string]models.TermQuery{
"healthy": {Value: &healthy},
},
})
}
var tags = make(map[string]string)
diags.Append(state.Tags.ElementsAs(ctx, &tags, false)...)
if diags.HasError() {
return nil, diags
}
var tagQueries []*models.QueryContainer
for key, value := range tags {
tagQueries = append(tagQueries,
newNestedTagQuery(key, value),
)
}
if len(tagQueries) > 0 {
queries = append(queries, &models.QueryContainer{
Bool: &models.BoolQuery{
MinimumShouldMatch: int32(len(tags)),
Should: tagQueries,
},
})
}
type resourceFilter struct {
resourceKind string
settings *types.List
}
resourceFilters := []resourceFilter{
{resourceKind: util.Elasticsearch, settings: &state.Elasticsearch},
{resourceKind: util.Kibana, settings: &state.Kibana},
{resourceKind: util.Apm, settings: &state.Apm},
{resourceKind: util.EnterpriseSearch, settings: &state.EnterpriseSearch},
{resourceKind: util.IntegrationsServer, settings: &state.IntegrationsServer},
}
for _, filter := range resourceFilters {
req, diags := expandResourceFilters(ctx, filter.settings, filter.resourceKind)
if diags.HasError() {
return nil, diags
}
queries = append(queries, req...)
}
searchReq := models.SearchRequest{
Size: int32(state.Size.ValueInt64()),
Sort: []interface{}{"id"},
}
if len(queries) > 0 {
searchReq.Query = &models.QueryContainer{
Bool: &models.BoolQuery{
Filter: []*models.QueryContainer{
{
Bool: &models.BoolQuery{
Must: queries,
},
},
},
},
}
}
return &searchReq, nil
}