diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/analytics/resolver/GetChartsResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/analytics/resolver/GetChartsResolver.java index 4847aea224ccd..0fe6e5de0cac6 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/analytics/resolver/GetChartsResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/analytics/resolver/GetChartsResolver.java @@ -2,6 +2,7 @@ import static com.linkedin.metadata.Constants.CORP_USER_ENTITY_NAME; import static com.linkedin.metadata.Constants.CORP_USER_STATUS_LAST_MODIFIED_FIELD_NAME; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -30,7 +31,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.query.filter.SortCriterion; @@ -153,12 +153,11 @@ private SearchResult searchForNewUsers(@Nonnull final OperationContext opContext .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField(CORP_USER_STATUS_LAST_MODIFIED_FIELD_NAME) - .setCondition(Condition.GREATER_THAN) - .setValue( - String.valueOf( - trailingMonthDateRange.getStart())))))))), + buildCriterion( + CORP_USER_STATUS_LAST_MODIFIED_FIELD_NAME, + Condition.GREATER_THAN, + String.valueOf( + trailingMonthDateRange.getStart())))))))), Collections.singletonList( new SortCriterion() .setField(CORP_USER_STATUS_LAST_MODIFIED_FIELD_NAME) diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/ResolverUtils.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/ResolverUtils.java index 5f873b4bebab3..b1cd0e9165129 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/ResolverUtils.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/ResolverUtils.java @@ -2,12 +2,12 @@ import static com.linkedin.datahub.graphql.resolvers.search.SearchUtils.*; import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.datahub.authentication.Authentication; import com.fasterxml.jackson.core.StreamReadConstraints; import com.fasterxml.jackson.databind.ObjectMapper; import com.linkedin.common.urn.UrnUtils; -import com.linkedin.data.template.StringArray; import com.linkedin.datahub.graphql.QueryContext; import com.linkedin.datahub.graphql.exception.ValidationException; import com.linkedin.datahub.graphql.generated.AndFilterInput; @@ -154,38 +154,22 @@ public static Filter buildFilter( // Translates a FacetFilterInput (graphql input class) into Criterion (our internal model) public static Criterion criterionFromFilter(final FacetFilterInput filter) { - Criterion result = new Criterion(); - result.setField(filter.getField()); - - // `value` is deprecated in place of `values`- this is to support old query patterns. If values - // is provided, - // this statement will be skipped - if (filter.getValues() == null && filter.getValue() != null) { - result.setValues(new StringArray(filter.getValue())); - result.setValue(filter.getValue()); - } else if (filter.getValues() != null) { - result.setValues(new StringArray(filter.getValues())); - if (!filter.getValues().isEmpty()) { - result.setValue(filter.getValues().get(0)); - } else { - result.setValue(""); - } - } else { - result.setValues(new StringArray()); - result.setValue(""); - } + final Condition condition; if (filter.getCondition() != null) { - result.setCondition(Condition.valueOf(filter.getCondition().toString())); + condition = Condition.valueOf(filter.getCondition().toString()); } else { - result.setCondition(Condition.EQUAL); + condition = Condition.EQUAL; } - if (filter.getNegated() != null) { - result.setNegated(filter.getNegated()); + final List values; + if (filter.getValues() == null && filter.getValue() != null) { + values = Collections.singletonList(filter.getValue()); + } else { + values = filter.getValues(); } - return result; + return buildCriterion(filter.getField(), condition, filter.getNegated(), values); } public static Filter viewFilter( diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/auth/DebugAccessResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/auth/DebugAccessResolver.java index 8372b6b5126a3..4331fe1193fb4 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/auth/DebugAccessResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/auth/DebugAccessResolver.java @@ -1,12 +1,12 @@ package com.linkedin.datahub.graphql.resolvers.auth; import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.google.common.collect.ImmutableSet; import com.linkedin.common.EntityRelationship; import com.linkedin.common.EntityRelationships; import com.linkedin.common.urn.Urn; -import com.linkedin.data.template.StringArray; import com.linkedin.datahub.graphql.QueryContext; import com.linkedin.datahub.graphql.authorization.AuthorizationUtils; import com.linkedin.datahub.graphql.concurrency.GraphQLConcurrencyUtils; @@ -19,7 +19,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.query.filter.RelationshipDirection; @@ -199,41 +198,28 @@ private Filter buildFilterToGetPolicies( ConjunctiveCriterionArray conjunctiveCriteria = new ConjunctiveCriterionArray(); final CriterionArray allUsersAndArray = new CriterionArray(); - allUsersAndArray.add( - new Criterion().setField("allUsers").setValue("true").setCondition(Condition.EQUAL)); + allUsersAndArray.add(buildCriterion("allUsers", Condition.EQUAL, "true")); conjunctiveCriteria.add(new ConjunctiveCriterion().setAnd(allUsersAndArray)); final CriterionArray allGroupsAndArray = new CriterionArray(); - allGroupsAndArray.add( - new Criterion().setField("allGroups").setValue("true").setCondition(Condition.EQUAL)); + allGroupsAndArray.add(buildCriterion("allGroups", Condition.EQUAL, "true")); conjunctiveCriteria.add(new ConjunctiveCriterion().setAnd(allGroupsAndArray)); if (user != null && !user.isEmpty()) { final CriterionArray userAndArray = new CriterionArray(); - userAndArray.add( - new Criterion().setField("users").setValue(user).setCondition(Condition.EQUAL)); + userAndArray.add(buildCriterion("users", Condition.EQUAL, user)); conjunctiveCriteria.add(new ConjunctiveCriterion().setAnd(userAndArray)); } if (groups != null && !groups.isEmpty()) { final CriterionArray groupsAndArray = new CriterionArray(); - groupsAndArray.add( - new Criterion() - .setField("groups") - .setValue("") - .setValues(new StringArray(groups)) - .setCondition(Condition.EQUAL)); + groupsAndArray.add(buildCriterion("groups", Condition.EQUAL, groups)); conjunctiveCriteria.add(new ConjunctiveCriterion().setAnd(groupsAndArray)); } if (roles != null && !roles.isEmpty()) { final CriterionArray rolesAndArray = new CriterionArray(); - rolesAndArray.add( - new Criterion() - .setField("roles") - .setValue("") - .setValues(new StringArray(roles)) - .setCondition(Condition.EQUAL)); + rolesAndArray.add(buildCriterion("roles", Condition.EQUAL, roles)); conjunctiveCriteria.add(new ConjunctiveCriterion().setAnd(rolesAndArray)); } return new Filter().setOr(conjunctiveCriteria); diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/container/ContainerEntitiesResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/container/ContainerEntitiesResolver.java index 5a3207633c07c..82a476ec56ddc 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/container/ContainerEntitiesResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/container/ContainerEntitiesResolver.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.container; import static com.linkedin.datahub.graphql.resolvers.ResolverUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.google.common.collect.ImmutableList; import com.linkedin.datahub.graphql.QueryContext; @@ -74,10 +75,7 @@ public CompletableFuture get(final DataFetchingEnvironment enviro try { final Criterion filterCriterion = - new Criterion() - .setField(CONTAINER_FIELD_NAME + ".keyword") - .setCondition(Condition.EQUAL) - .setValue(urn); + buildCriterion(CONTAINER_FIELD_NAME + ".keyword", Condition.EQUAL, urn); return UrnSearchResultsMapper.map( context, diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dashboard/DashboardUsageStatsResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dashboard/DashboardUsageStatsResolver.java index 7e4a9c8a80388..70e62de20b567 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dashboard/DashboardUsageStatsResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dashboard/DashboardUsageStatsResolver.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.dashboard; import static com.linkedin.datahub.graphql.resolvers.dashboard.DashboardUsageStatsUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildIsNullCriterion; import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; @@ -14,7 +15,6 @@ import com.linkedin.datahub.graphql.types.dashboard.mappers.DashboardUsageMetricMapper; import com.linkedin.metadata.Constants; import com.linkedin.metadata.aspect.EnvelopedAspect; -import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; import com.linkedin.metadata.query.filter.Criterion; @@ -102,11 +102,7 @@ private List getDashboardUsageMetrics( final ArrayList criteria = new ArrayList<>(); // Add filter for absence of eventGranularity - only consider absolute stats - Criterion excludeTimeBucketsCriterion = - new Criterion() - .setField(ES_FIELD_EVENT_GRANULARITY) - .setCondition(Condition.IS_NULL) - .setValue(""); + Criterion excludeTimeBucketsCriterion = buildIsNullCriterion(ES_FIELD_EVENT_GRANULARITY); criteria.add(excludeTimeBucketsCriterion); filter.setOr( new ConjunctiveCriterionArray( diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dashboard/DashboardUsageStatsUtils.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dashboard/DashboardUsageStatsUtils.java index 93c08d37c2e36..9c0b1f450b831 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dashboard/DashboardUsageStatsUtils.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dashboard/DashboardUsageStatsUtils.java @@ -1,5 +1,8 @@ package com.linkedin.datahub.graphql.resolvers.dashboard; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; +import static com.linkedin.metadata.utils.CriterionUtils.buildIsNullCriterion; + import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; import com.linkedin.data.template.StringArray; @@ -319,27 +322,22 @@ public static Filter createUsageFilter( final ArrayList criteria = new ArrayList<>(); // Add filter for urn == dashboardUrn - Criterion dashboardUrnCriterion = - new Criterion().setField(ES_FIELD_URN).setCondition(Condition.EQUAL).setValue(dashboardUrn); + Criterion dashboardUrnCriterion = buildCriterion(ES_FIELD_URN, Condition.EQUAL, dashboardUrn); criteria.add(dashboardUrnCriterion); if (startTime != null) { // Add filter for start time Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(Long.toString(startTime)); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, Long.toString(startTime)); criteria.add(startTimeCriterion); } if (endTime != null) { // Add filter for end time Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(Long.toString(endTime)); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.LESS_THAN_OR_EQUAL_TO, Long.toString(endTime)); criteria.add(endTimeCriterion); } @@ -348,18 +346,11 @@ public static Filter createUsageFilter( // stats // since unit is mandatory, we assume if eventGranularity contains unit, then it is not null Criterion onlyTimeBucketsCriterion = - new Criterion() - .setField(ES_FIELD_EVENT_GRANULARITY) - .setCondition(Condition.CONTAIN) - .setValue("unit"); + buildCriterion(ES_FIELD_EVENT_GRANULARITY, Condition.CONTAIN, "unit"); criteria.add(onlyTimeBucketsCriterion); } else { // Add filter for absence of eventGranularity - only consider absolute stats - Criterion excludeTimeBucketsCriterion = - new Criterion() - .setField(ES_FIELD_EVENT_GRANULARITY) - .setCondition(Condition.IS_NULL) - .setValue(""); + Criterion excludeTimeBucketsCriterion = buildIsNullCriterion(ES_FIELD_EVENT_GRANULARITY); criteria.add(excludeTimeBucketsCriterion); } diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dataset/DatasetHealthResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dataset/DatasetHealthResolver.java index f38cf80f36ceb..6db581504f93c 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dataset/DatasetHealthResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dataset/DatasetHealthResolver.java @@ -1,5 +1,8 @@ package com.linkedin.datahub.graphql.resolvers.dataset; +import static com.linkedin.metadata.Constants.ASSERTION_RUN_EVENT_STATUS_COMPLETE; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; + import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.ImmutableList; @@ -197,16 +200,12 @@ private Filter createAssertionsFilter(final String datasetUrn) { final ArrayList criteria = new ArrayList<>(); // Add filter for asserteeUrn == datasetUrn - Criterion datasetUrnCriterion = - new Criterion().setField("asserteeUrn").setCondition(Condition.EQUAL).setValue(datasetUrn); + Criterion datasetUrnCriterion = buildCriterion("asserteeUrn", Condition.EQUAL, datasetUrn); criteria.add(datasetUrnCriterion); // Add filter for result == result Criterion startTimeCriterion = - new Criterion() - .setField("status") - .setCondition(Condition.EQUAL) - .setValue(Constants.ASSERTION_RUN_EVENT_STATUS_COMPLETE); + buildCriterion("status", Condition.EQUAL, ASSERTION_RUN_EVENT_STATUS_COMPLETE); criteria.add(startTimeCriterion); filter.setOr( diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/domain/DomainEntitiesResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/domain/DomainEntitiesResolver.java index c6265380fb2fd..c27fa1d195a76 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/domain/DomainEntitiesResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/domain/DomainEntitiesResolver.java @@ -2,6 +2,7 @@ import static com.linkedin.datahub.graphql.resolvers.ResolverUtils.*; import static com.linkedin.datahub.graphql.resolvers.search.SearchUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.linkedin.datahub.graphql.QueryContext; import com.linkedin.datahub.graphql.concurrency.GraphQLConcurrencyUtils; @@ -69,10 +70,7 @@ public CompletableFuture get(final DataFetchingEnvironment enviro final CriterionArray criteria = new CriterionArray(); final Criterion filterCriterion = - new Criterion() - .setField(DOMAINS_FIELD_NAME + ".keyword") - .setCondition(Condition.EQUAL) - .setValue(urn); + buildCriterion(DOMAINS_FIELD_NAME + ".keyword", Condition.EQUAL, urn); criteria.add(filterCriterion); if (input.getFilters() != null) { input diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryNodesResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryNodesResolver.java index 451abfdaf1c06..8ec0ecae684a1 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryNodesResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryNodesResolver.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.glossary; import static com.linkedin.datahub.graphql.resolvers.ResolverUtils.bindArgument; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; @@ -15,7 +16,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.search.SearchEntity; @@ -84,11 +84,7 @@ public CompletableFuture get( private Filter buildGlossaryEntitiesFilter() { CriterionArray array = new CriterionArray( - ImmutableList.of( - new Criterion() - .setField("hasParentNode") - .setValue("false") - .setCondition(Condition.EQUAL))); + ImmutableList.of(buildCriterion("hasParentNode", Condition.EQUAL, "false"))); final Filter filter = new Filter(); filter.setOr( new ConjunctiveCriterionArray(ImmutableList.of(new ConjunctiveCriterion().setAnd(array)))); diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryTermsResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryTermsResolver.java index 7ca79b168819e..9f6808775fff9 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryTermsResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryTermsResolver.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.glossary; import static com.linkedin.datahub.graphql.resolvers.ResolverUtils.bindArgument; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; @@ -15,7 +16,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.search.SearchEntity; @@ -84,11 +84,7 @@ public CompletableFuture get( private Filter buildGlossaryEntitiesFilter() { CriterionArray array = new CriterionArray( - ImmutableList.of( - new Criterion() - .setField("hasParentNode") - .setValue("false") - .setCondition(Condition.EQUAL))); + ImmutableList.of(buildCriterion("hasParentNode", Condition.EQUAL, "false"))); final Filter filter = new Filter(); filter.setOr( new ConjunctiveCriterionArray(ImmutableList.of(new ConjunctiveCriterion().setAnd(array)))); diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/health/EntityHealthResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/health/EntityHealthResolver.java index 380b7c920ab2f..0a8e0e42a0914 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/health/EntityHealthResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/health/EntityHealthResolver.java @@ -1,5 +1,8 @@ package com.linkedin.datahub.graphql.resolvers.health; +import static com.linkedin.metadata.Constants.ASSERTION_RUN_EVENT_STATUS_COMPLETE; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; + import com.google.common.collect.ImmutableList; import com.linkedin.common.EntityRelationships; import com.linkedin.data.template.StringArray; @@ -251,16 +254,12 @@ private Filter createAssertionsFilter(final String datasetUrn) { final ArrayList criteria = new ArrayList<>(); // Add filter for asserteeUrn == datasetUrn - Criterion datasetUrnCriterion = - new Criterion().setField("asserteeUrn").setCondition(Condition.EQUAL).setValue(datasetUrn); + Criterion datasetUrnCriterion = buildCriterion("asserteeUrn", Condition.EQUAL, datasetUrn); criteria.add(datasetUrnCriterion); // Add filter for result == result Criterion startTimeCriterion = - new Criterion() - .setField("status") - .setCondition(Condition.EQUAL) - .setValue(Constants.ASSERTION_RUN_EVENT_STATUS_COMPLETE); + buildCriterion("status", Condition.EQUAL, ASSERTION_RUN_EVENT_STATUS_COMPLETE); criteria.add(startTimeCriterion); filter.setOr( diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/ingest/execution/IngestionSourceExecutionRequestsResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/ingest/execution/IngestionSourceExecutionRequestsResolver.java index a4c2ab42227d9..8110fe93f8ab7 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/ingest/execution/IngestionSourceExecutionRequestsResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/ingest/execution/IngestionSourceExecutionRequestsResolver.java @@ -1,5 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.ingest.execution; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; + import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.linkedin.common.urn.Urn; @@ -62,10 +64,7 @@ public CompletableFuture get( // 1. Fetch the related edges final Criterion filterCriterion = - new Criterion() - .setField(INGESTION_SOURCE_FIELD_NAME) - .setCondition(Condition.EQUAL) - .setValue(urn); + buildCriterion(INGESTION_SOURCE_FIELD_NAME, Condition.EQUAL, urn); final SearchResult executionsSearchResult = _entityClient.filter( diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/jobs/DataJobRunsResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/jobs/DataJobRunsResolver.java index d7c76c0235dcc..dd470e766378b 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/jobs/DataJobRunsResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/jobs/DataJobRunsResolver.java @@ -1,5 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.jobs; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; + import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; import com.linkedin.datahub.graphql.QueryContext; @@ -12,7 +14,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.query.filter.SortCriterion; @@ -116,14 +117,10 @@ private Filter buildTaskRunsEntityFilter(final String entityUrn) { CriterionArray array = new CriterionArray( ImmutableList.of( - new Criterion() - .setField(PARENT_TEMPLATE_URN_SEARCH_INDEX_FIELD_NAME) - .setCondition(Condition.EQUAL) - .setValue(entityUrn), - new Criterion() - .setField(HAS_RUN_EVENTS_FIELD_NAME) - .setCondition(Condition.EQUAL) - .setValue(Boolean.TRUE.toString()))); + buildCriterion( + PARENT_TEMPLATE_URN_SEARCH_INDEX_FIELD_NAME, Condition.EQUAL, entityUrn), + buildCriterion( + HAS_RUN_EVENTS_FIELD_NAME, Condition.EQUAL, Boolean.TRUE.toString()))); final Filter filter = new Filter(); filter.setOr( diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/jobs/EntityRunsResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/jobs/EntityRunsResolver.java index 82c5b73d87152..d71b6f5d01f4f 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/jobs/EntityRunsResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/jobs/EntityRunsResolver.java @@ -1,5 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.jobs; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; + import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; import com.linkedin.datahub.graphql.QueryContext; @@ -15,7 +17,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.query.filter.SortCriterion; @@ -121,13 +122,12 @@ private Filter buildTaskRunsEntityFilter( CriterionArray array = new CriterionArray( ImmutableList.of( - new Criterion() - .setField( - direction.equals(RelationshipDirection.INCOMING) - ? INPUT_FIELD_NAME - : OUTPUT_FIELD_NAME) - .setCondition(Condition.EQUAL) - .setValue(entityUrn))); + buildCriterion( + direction.equals(RelationshipDirection.INCOMING) + ? INPUT_FIELD_NAME + : OUTPUT_FIELD_NAME, + Condition.EQUAL, + entityUrn))); final Filter filter = new Filter(); filter.setOr( new ConjunctiveCriterionArray(ImmutableList.of(new ConjunctiveCriterion().setAnd(array)))); diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/BusinessAttributeUtils.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/BusinessAttributeUtils.java index 25dc36f74ef73..de5176ca440a6 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/BusinessAttributeUtils.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/BusinessAttributeUtils.java @@ -1,12 +1,13 @@ package com.linkedin.datahub.graphql.resolvers.mutate.util; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; + import com.linkedin.datahub.graphql.QueryContext; import com.linkedin.entity.client.EntityClient; import com.linkedin.metadata.Constants; import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.search.SearchResult; @@ -60,11 +61,7 @@ private static Filter buildNameFilter(String name) { } private static CriterionArray buildNameCriterion(@Nonnull final String name) { - return new CriterionArray( - new Criterion() - .setField(NAME_INDEX_FIELD_NAME) - .setValue(name) - .setCondition(Condition.EQUAL)); + return new CriterionArray(buildCriterion(NAME_INDEX_FIELD_NAME, Condition.EQUAL, name)); } public static SchemaFieldDataType mapSchemaFieldDataType( diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/DomainUtils.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/DomainUtils.java index 1dcdd988f5e7c..4224f75773200 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/DomainUtils.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/DomainUtils.java @@ -2,6 +2,8 @@ import static com.linkedin.datahub.graphql.resolvers.mutate.MutationUtils.*; import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; +import static com.linkedin.metadata.utils.CriterionUtils.buildIsNullCriterion; import com.datahub.authorization.ConjunctivePrivilegeGroup; import com.datahub.authorization.DisjunctivePrivilegeGroup; @@ -118,16 +120,9 @@ public static void validateDomain( private static List buildRootDomainCriteria() { final List criteria = new ArrayList<>(); - criteria.add( - new Criterion() - .setField(HAS_PARENT_DOMAIN_INDEX_FIELD_NAME) - .setValue("false") - .setCondition(Condition.EQUAL)); - criteria.add( - new Criterion() - .setField(HAS_PARENT_DOMAIN_INDEX_FIELD_NAME) - .setValue("") - .setCondition(Condition.IS_NULL)); + criteria.add(buildCriterion(HAS_PARENT_DOMAIN_INDEX_FIELD_NAME, Condition.EQUAL, "false")); + + criteria.add(buildIsNullCriterion(HAS_PARENT_DOMAIN_INDEX_FIELD_NAME)); return criteria; } @@ -135,25 +130,17 @@ private static List buildRootDomainCriteria() { private static List buildParentDomainCriteria(@Nonnull final Urn parentDomainUrn) { final List criteria = new ArrayList<>(); + criteria.add(buildCriterion(HAS_PARENT_DOMAIN_INDEX_FIELD_NAME, Condition.EQUAL, "true")); + criteria.add( - new Criterion() - .setField(HAS_PARENT_DOMAIN_INDEX_FIELD_NAME) - .setValue("true") - .setCondition(Condition.EQUAL)); - criteria.add( - new Criterion() - .setField(PARENT_DOMAIN_INDEX_FIELD_NAME) - .setValue(parentDomainUrn.toString()) - .setCondition(Condition.EQUAL)); + buildCriterion( + PARENT_DOMAIN_INDEX_FIELD_NAME, Condition.EQUAL, parentDomainUrn.toString())); return criteria; } private static Criterion buildNameCriterion(@Nonnull final String name) { - return new Criterion() - .setField(NAME_INDEX_FIELD_NAME) - .setValue(name) - .setCondition(Condition.EQUAL); + return buildCriterion(NAME_INDEX_FIELD_NAME, Condition.EQUAL, name); } /** diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/FormUtils.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/FormUtils.java index cac0cca2682e8..537562a3b7d98 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/FormUtils.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/FormUtils.java @@ -1,5 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.mutate.util; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; + import com.linkedin.common.UrnArray; import com.linkedin.common.urn.Urn; import com.linkedin.common.urn.UrnUtils; @@ -95,11 +97,7 @@ private static Criterion buildFormCriterion( private static Criterion buildFormCriterion( @Nonnull final String formUrn, @Nonnull final String field, final boolean negated) { - return new Criterion() - .setField(field) - .setValue(formUrn) - .setCondition(Condition.EQUAL) - .setNegated(negated); + return buildCriterion(field, Condition.EQUAL, negated, formUrn); } private static boolean isActorExplicitlyAssigned( diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/recommendation/ListRecommendationsResolver.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/recommendation/ListRecommendationsResolver.java index 28334b2c0af9a..77f6eb285ecc5 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/recommendation/ListRecommendationsResolver.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/recommendation/ListRecommendationsResolver.java @@ -2,7 +2,6 @@ import static com.linkedin.datahub.graphql.resolvers.ResolverUtils.*; -import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; import com.linkedin.datahub.graphql.QueryContext; import com.linkedin.datahub.graphql.concurrency.GraphQLConcurrencyUtils; @@ -179,7 +178,7 @@ private RecommendationParams mapRecommendationParams( criterion -> FacetFilter.builder() .setField(criterion.getField()) - .setValues(ImmutableList.of(criterion.getValue())) + .setValues(criterion.getValues()) .build()) .collect(Collectors.toList())); } diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/ResolverUtilsTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/ResolverUtilsTest.java index 2950b50bec8f1..4f7119969b538 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/ResolverUtilsTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/ResolverUtilsTest.java @@ -2,13 +2,13 @@ import static com.linkedin.datahub.graphql.resolvers.ResolverUtils.*; import static com.linkedin.metadata.search.utils.QueryUtils.buildFilterWithUrns; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.Mockito.mock; import static org.testng.AssertJUnit.assertEquals; import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; import com.linkedin.common.urn.UrnUtils; -import com.linkedin.data.template.StringArray; import com.linkedin.datahub.graphql.QueryContext; import com.linkedin.datahub.graphql.TestUtils; import com.linkedin.datahub.graphql.generated.FacetFilterInput; @@ -47,38 +47,21 @@ public void testCriterionFromFilter() throws Exception { FilterOperator.EQUAL)); assertEquals( valuesCriterion, - new Criterion() - .setValue("urn:li:tag:abc") - .setValues(new StringArray(ImmutableList.of("urn:li:tag:abc", "urn:li:tag:def"))) - .setNegated(false) - .setCondition(Condition.EQUAL) - .setField("tags")); + buildCriterion( + "tags", Condition.EQUAL, ImmutableList.of("urn:li:tag:abc", "urn:li:tag:def"))); // this is the legacy pathway Criterion valueCriterion = criterionFromFilter( new FacetFilterInput("tags", "urn:li:tag:abc", null, true, FilterOperator.EQUAL)); - assertEquals( - valueCriterion, - new Criterion() - .setValue("urn:li:tag:abc") - .setValues(new StringArray(ImmutableList.of("urn:li:tag:abc"))) - .setNegated(true) - .setCondition(Condition.EQUAL) - .setField("tags")); + assertEquals(valueCriterion, buildCriterion("tags", Condition.EQUAL, true, "urn:li:tag:abc")); // check that both being null doesn't cause a NPE. this should never happen except via API // interaction Criterion doubleNullCriterion = criterionFromFilter(new FacetFilterInput("tags", null, null, true, FilterOperator.EQUAL)); assertEquals( - doubleNullCriterion, - new Criterion() - .setValue("") - .setValues(new StringArray(ImmutableList.of())) - .setNegated(true) - .setCondition(Condition.EQUAL) - .setField("tags")); + doubleNullCriterion, buildCriterion("tags", Condition.EQUAL, true, ImmutableList.of())); } @Test @@ -89,11 +72,8 @@ public void testBuildFilterWithUrns() throws Exception { urns.add(urn1); urns.add(urn2); - Criterion ownersCriterion = - new Criterion() - .setField("owners") - .setValues(new StringArray("urn:li:corpuser:chris")) - .setCondition(Condition.EQUAL); + Criterion ownersCriterion = buildCriterion("owners", Condition.EQUAL, "urn:li:corpuser:chris"); + CriterionArray andCriterionArray = new CriterionArray(ImmutableList.of(ownersCriterion)); final Filter filter = new Filter(); filter.setOr( @@ -114,11 +94,10 @@ public void testBuildFilterWithUrns() throws Exception { Filter finalFilter = buildFilterWithUrns(appConfig, urns, filter); Criterion urnsCriterion = - new Criterion() - .setField("urn") - .setValue("") - .setValues( - new StringArray(urns.stream().map(Object::toString).collect(Collectors.toList()))); + buildCriterion( + "urn", + Condition.EQUAL, + urns.stream().map(Object::toString).collect(Collectors.toList())); for (ConjunctiveCriterion conjunctiveCriterion : finalFilter.getOr()) { assertEquals(conjunctiveCriterion.getAnd().contains(ownersCriterion), true); diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/browse/BrowseV2ResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/browse/BrowseV2ResolverTest.java index 4897d0819b59f..70c606dc63a90 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/browse/BrowseV2ResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/browse/BrowseV2ResolverTest.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.browse; import static com.linkedin.datahub.graphql.TestUtils.getMockAllowContext; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import com.google.common.collect.ImmutableList; @@ -21,9 +22,9 @@ import com.linkedin.metadata.browse.BrowseResultGroupV2Array; import com.linkedin.metadata.browse.BrowseResultMetadata; import com.linkedin.metadata.browse.BrowseResultV2; +import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.service.FormService; @@ -282,10 +283,7 @@ private static DataHubViewInfo createViewInfo(StringArray entityNames) { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setValue("test") - .setValues(new StringArray(ImmutableList.of("test")))))))); + buildCriterion("test", Condition.EQUAL, "test")))))); DataHubViewInfo info = new DataHubViewInfo(); info.setName("test"); diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/container/ContainerEntitiesResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/container/ContainerEntitiesResolverTest.java index 48732727762ee..5af236d7e81e5 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/container/ContainerEntitiesResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/container/ContainerEntitiesResolverTest.java @@ -1,5 +1,6 @@ package com.linkedin.datahub.graphql.resolvers.container; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.testng.Assert.*; @@ -43,10 +44,7 @@ public void testGetSuccess() throws Exception { final String containerUrn = "urn:li:container:test-container"; final Criterion filterCriterion = - new Criterion() - .setField("container.keyword") - .setCondition(Condition.EQUAL) - .setValue(containerUrn); + buildCriterion("container.keyword", Condition.EQUAL, containerUrn); Mockito.when( mockClient.searchAcrossEntities( diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/domain/DomainEntitiesResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/domain/DomainEntitiesResolverTest.java index ad5d7f1ef6b06..5be65703846a9 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/domain/DomainEntitiesResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/domain/DomainEntitiesResolverTest.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.domain; import static com.linkedin.datahub.graphql.resolvers.search.SearchUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.testng.Assert.*; @@ -45,11 +46,7 @@ public void testGetSuccess() throws Exception { final String childUrn = "urn:li:dataset:(test,test,test)"; final String domainUrn = "urn:li:domain:test-domain"; - final Criterion filterCriterion = - new Criterion() - .setField("domains.keyword") - .setCondition(Condition.EQUAL) - .setValue(domainUrn); + final Criterion filterCriterion = buildCriterion("domains.keyword", Condition.EQUAL, domainUrn); Mockito.when( mockClient.searchAcrossEntities( diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryNodesResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryNodesResolverTest.java index 60787fc47c88a..cb9df747572c4 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryNodesResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryNodesResolverTest.java @@ -1,5 +1,6 @@ package com.linkedin.datahub.graphql.resolvers.glossary; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.testng.Assert.*; @@ -16,7 +17,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.search.SearchEntity; @@ -76,11 +76,7 @@ public void testGetSuccess() throws Exception { private Filter buildGlossaryEntitiesFilter() { CriterionArray array = new CriterionArray( - ImmutableList.of( - new Criterion() - .setField("hasParentNode") - .setValue("false") - .setCondition(Condition.EQUAL))); + ImmutableList.of(buildCriterion("hasParentNode", Condition.EQUAL, "false"))); final Filter filter = new Filter(); filter.setOr( new ConjunctiveCriterionArray(ImmutableList.of(new ConjunctiveCriterion().setAnd(array)))); diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryTermsResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryTermsResolverTest.java index 51760ff9d37f2..29af303f7db2d 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryTermsResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/glossary/GetRootGlossaryTermsResolverTest.java @@ -1,5 +1,6 @@ package com.linkedin.datahub.graphql.resolvers.glossary; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.testng.Assert.*; @@ -16,7 +17,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.search.SearchEntity; @@ -76,11 +76,7 @@ public void testGetSuccess() throws Exception { private Filter buildGlossaryEntitiesFilter() { CriterionArray array = new CriterionArray( - ImmutableList.of( - new Criterion() - .setField("hasParentNode") - .setValue("false") - .setCondition(Condition.EQUAL))); + ImmutableList.of(buildCriterion("hasParentNode", Condition.EQUAL, "false"))); final Filter filter = new Filter(); filter.setOr( new ConjunctiveCriterionArray(ImmutableList.of(new ConjunctiveCriterion().setAnd(array)))); diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/AggregateAcrossEntitiesResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/AggregateAcrossEntitiesResolverTest.java index 129866bb0fa07..1b33118bd154a 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/AggregateAcrossEntitiesResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/AggregateAcrossEntitiesResolverTest.java @@ -2,6 +2,7 @@ import static com.linkedin.datahub.graphql.TestUtils.getMockAllowContext; import static com.linkedin.datahub.graphql.resolvers.search.SearchUtils.SEARCHABLE_ENTITY_TYPES; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import com.google.common.collect.ImmutableList; @@ -21,7 +22,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.search.SearchEntityArray; @@ -348,13 +348,7 @@ private static Filter createFilter(String field, String value) { new ConjunctiveCriterion() .setAnd( new CriterionArray( - ImmutableList.of( - new Criterion() - .setField(field) - .setValue(value) - .setCondition(Condition.EQUAL) - .setNegated(false) - .setValues(new StringArray(ImmutableList.of(value)))))))); + ImmutableList.of(buildCriterion(field, Condition.EQUAL, value)))))); } private static DataHubViewInfo getViewInfo(Filter viewFilter) { diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/AutoCompleteForMultipleResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/AutoCompleteForMultipleResolverTest.java index 45190bbfc93e5..17ed6ef5632a1 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/AutoCompleteForMultipleResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/AutoCompleteForMultipleResolverTest.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.search; import static com.linkedin.datahub.graphql.TestUtils.getMockAllowContext; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import com.google.common.collect.ImmutableList; @@ -20,9 +21,9 @@ import com.linkedin.metadata.Constants; import com.linkedin.metadata.query.AutoCompleteEntityArray; import com.linkedin.metadata.query.AutoCompleteResult; +import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.service.ViewService; @@ -264,10 +265,7 @@ private static DataHubViewInfo createViewInfo(StringArray entityNames) { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setValue("test") - .setValues(new StringArray(ImmutableList.of("test")))))))); + buildCriterion("field", Condition.EQUAL, "test")))))); DataHubViewInfo info = new DataHubViewInfo(); info.setName("test"); diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/SearchAcrossEntitiesResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/SearchAcrossEntitiesResolverTest.java index 86508f1fd2742..a601a815453b2 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/SearchAcrossEntitiesResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/SearchAcrossEntitiesResolverTest.java @@ -2,6 +2,7 @@ import static com.linkedin.datahub.graphql.TestUtils.*; import static com.linkedin.datahub.graphql.resolvers.search.SearchUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import com.google.common.collect.ImmutableList; @@ -21,7 +22,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.search.SearchEntityArray; @@ -57,10 +57,7 @@ public static void testApplyViewNullBaseFilter() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setValue("test") - .setValues(new StringArray(ImmutableList.of("test")))))))); + buildCriterion("field", Condition.EQUAL, "test")))))); DataHubViewInfo info = new DataHubViewInfo(); info.setName("test"); @@ -135,10 +132,7 @@ public static void testApplyViewBaseFilter() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setValue("test") - .setValues(new StringArray(ImmutableList.of("test")))))))); + buildCriterion("field", Condition.EQUAL, "test")))))); DataHubViewInfo info = new DataHubViewInfo(); info.setName("test"); @@ -163,13 +157,7 @@ public static void testApplyViewBaseFilter() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("baseField") - .setValue("baseTest") - .setCondition(Condition.EQUAL) - .setNegated(false) - .setValues( - new StringArray(ImmutableList.of("baseTest")))))))); + buildCriterion("baseField", Condition.EQUAL, "baseTest")))))); EntityClient mockClient = initMockEntityClient( @@ -236,10 +224,7 @@ public static void testApplyViewNullBaseEntityTypes() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setValue("test") - .setValues(new StringArray(ImmutableList.of("test")))))))); + buildCriterion("field", Condition.EQUAL, "test")))))); DataHubViewInfo info = new DataHubViewInfo(); info.setName("test"); @@ -306,10 +291,7 @@ public static void testApplyViewEmptyBaseEntityTypes() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setValue("test") - .setValues(new StringArray(ImmutableList.of("test")))))))); + buildCriterion("field", Condition.EQUAL, "test")))))); DataHubViewInfo info = new DataHubViewInfo(); info.setName("test"); diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/SearchUtilsTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/SearchUtilsTest.java index 8f23f0a624576..832aa97d9216a 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/SearchUtilsTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/SearchUtilsTest.java @@ -1,11 +1,12 @@ package com.linkedin.datahub.graphql.resolvers.search; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; + import com.google.common.collect.ImmutableList; -import com.linkedin.data.template.StringArray; import com.linkedin.metadata.Constants; +import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import java.util.List; @@ -25,10 +26,7 @@ public static void testApplyViewToFilterNullBaseFilter() { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setValue("test") - .setValues(new StringArray(ImmutableList.of("test")))))))); + buildCriterion("field", Condition.EQUAL, "test")))))); Filter result = SearchUtils.combineFilters(null, viewFilter); Assert.assertEquals(viewFilter, result); @@ -45,28 +43,14 @@ public static void testApplyViewToFilterComplexBaseFilter() { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field1") - .setValue("test1") - .setValues(new StringArray(ImmutableList.of("test1"))), - new Criterion() - .setField("field2") - .setValue("test2") - .setValues( - new StringArray(ImmutableList.of("test2")))))), + buildCriterion("field1", Condition.EQUAL, "test1"), + buildCriterion("field2", Condition.EQUAL, "test2")))), new ConjunctiveCriterion() .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field3") - .setValue("test3") - .setValues(new StringArray(ImmutableList.of("test3"))), - new Criterion() - .setField("field4") - .setValue("test4") - .setValues( - new StringArray(ImmutableList.of("test4"))))))))); + buildCriterion("field3", Condition.EQUAL, "test3"), + buildCriterion("field4", Condition.EQUAL, "test4"))))))); Filter viewFilter = new Filter() @@ -76,10 +60,7 @@ public static void testApplyViewToFilterComplexBaseFilter() { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setValue("test") - .setValues(new StringArray(ImmutableList.of("test")))))))); + buildCriterion("field", Condition.EQUAL, "test")))))); Filter result = SearchUtils.combineFilters(baseFilter, viewFilter); @@ -92,36 +73,16 @@ public static void testApplyViewToFilterComplexBaseFilter() { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field1") - .setValue("test1") - .setValues(new StringArray(ImmutableList.of("test1"))), - new Criterion() - .setField("field2") - .setValue("test2") - .setValues(new StringArray(ImmutableList.of("test2"))), - new Criterion() - .setField("field") - .setValue("test") - .setValues( - new StringArray(ImmutableList.of("test")))))), + buildCriterion("field1", Condition.EQUAL, "test1"), + buildCriterion("field2", Condition.EQUAL, "test2"), + buildCriterion("field", Condition.EQUAL, "test")))), new ConjunctiveCriterion() .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field3") - .setValue("test3") - .setValues(new StringArray(ImmutableList.of("test3"))), - new Criterion() - .setField("field4") - .setValue("test4") - .setValues(new StringArray(ImmutableList.of("test4"))), - new Criterion() - .setField("field") - .setValue("test") - .setValues( - new StringArray(ImmutableList.of("test"))))))))); + buildCriterion("field3", Condition.EQUAL, "test3"), + buildCriterion("field4", Condition.EQUAL, "test4"), + buildCriterion("field", Condition.EQUAL, "test"))))))); Assert.assertEquals(expectedResult, result); } @@ -137,28 +98,14 @@ public static void testApplyViewToFilterComplexViewFilter() { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field1") - .setValue("test1") - .setValues(new StringArray(ImmutableList.of("test1"))), - new Criterion() - .setField("field2") - .setValue("test2") - .setValues( - new StringArray(ImmutableList.of("test2")))))), + buildCriterion("field1", Condition.EQUAL, "test1"), + buildCriterion("field2", Condition.EQUAL, "test2")))), new ConjunctiveCriterion() .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field3") - .setValue("test3") - .setValues(new StringArray(ImmutableList.of("test3"))), - new Criterion() - .setField("field4") - .setValue("test4") - .setValues( - new StringArray(ImmutableList.of("test4"))))))))); + buildCriterion("field3", Condition.EQUAL, "test3"), + buildCriterion("field4", Condition.EQUAL, "test4"))))))); Filter viewFilter = new Filter() @@ -169,31 +116,16 @@ public static void testApplyViewToFilterComplexViewFilter() { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("viewField1") - .setValue("viewTest1") - .setValues( - new StringArray(ImmutableList.of("viewTest1"))), - new Criterion() - .setField("viewField2") - .setValue("viewTest2") - .setValues( - new StringArray(ImmutableList.of("viewTest2")))))), + buildCriterion("viewField1", Condition.EQUAL, "viewTest1"), + buildCriterion( + "viewField2", Condition.EQUAL, "viewTest2")))), new ConjunctiveCriterion() .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("viewField3") - .setValue("viewTest3") - .setValues( - new StringArray(ImmutableList.of("viewTest3"))), - new Criterion() - .setField("viewField4") - .setValue("viewTest4") - .setValues( - new StringArray( - ImmutableList.of("viewTest4"))))))))); + buildCriterion("viewField3", Condition.EQUAL, "viewTest3"), + buildCriterion( + "viewField4", Condition.EQUAL, "viewTest4"))))))); Filter result = SearchUtils.combineFilters(baseFilter, viewFilter); @@ -206,91 +138,38 @@ public static void testApplyViewToFilterComplexViewFilter() { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field1") - .setValue("test1") - .setValues(new StringArray(ImmutableList.of("test1"))), - new Criterion() - .setField("field2") - .setValue("test2") - .setValues(new StringArray(ImmutableList.of("test2"))), - new Criterion() - .setField("viewField1") - .setValue("viewTest1") - .setValues( - new StringArray(ImmutableList.of("viewTest1"))), - new Criterion() - .setField("viewField2") - .setValue("viewTest2") - .setValues( - new StringArray(ImmutableList.of("viewTest2")))))), + buildCriterion("field1", Condition.EQUAL, "test1"), + buildCriterion("field2", Condition.EQUAL, "test2"), + buildCriterion("viewField1", Condition.EQUAL, "viewTest1"), + buildCriterion( + "viewField2", Condition.EQUAL, "viewTest2")))), new ConjunctiveCriterion() .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field1") - .setValue("test1") - .setValues(new StringArray(ImmutableList.of("test1"))), - new Criterion() - .setField("field2") - .setValue("test2") - .setValues(new StringArray(ImmutableList.of("test2"))), - new Criterion() - .setField("viewField3") - .setValue("viewTest3") - .setValues( - new StringArray(ImmutableList.of("viewTest3"))), - new Criterion() - .setField("viewField4") - .setValue("viewTest4") - .setValues( - new StringArray(ImmutableList.of("viewTest4")))))), + buildCriterion("field1", Condition.EQUAL, "test1"), + buildCriterion("field2", Condition.EQUAL, "test2"), + buildCriterion("viewField3", Condition.EQUAL, "viewTest3"), + buildCriterion( + "viewField4", Condition.EQUAL, "viewTest4")))), new ConjunctiveCriterion() .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field3") - .setValue("test3") - .setValues(new StringArray(ImmutableList.of("test3"))), - new Criterion() - .setField("field4") - .setValue("test4") - .setValues(new StringArray(ImmutableList.of("test4"))), - new Criterion() - .setField("viewField1") - .setValue("viewTest1") - .setValues( - new StringArray(ImmutableList.of("viewTest1"))), - new Criterion() - .setField("viewField2") - .setValue("viewTest2") - .setValues( - new StringArray(ImmutableList.of("viewTest2")))))), + buildCriterion("field3", Condition.EQUAL, "test3"), + buildCriterion("field4", Condition.EQUAL, "test4"), + buildCriterion("viewField1", Condition.EQUAL, "viewTest1"), + buildCriterion( + "viewField2", Condition.EQUAL, "viewTest2")))), new ConjunctiveCriterion() .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field3") - .setValue("test3") - .setValues(new StringArray(ImmutableList.of("test3"))), - new Criterion() - .setField("field4") - .setValue("test4") - .setValues(new StringArray(ImmutableList.of("test4"))), - new Criterion() - .setField("viewField3") - .setValue("viewTest3") - .setValues( - new StringArray(ImmutableList.of("viewTest3"))), - new Criterion() - .setField("viewField4") - .setValue("viewTest4") - .setValues( - new StringArray( - ImmutableList.of("viewTest4"))))))))); + buildCriterion("field3", Condition.EQUAL, "test3"), + buildCriterion("field4", Condition.EQUAL, "test4"), + buildCriterion("viewField3", Condition.EQUAL, "viewTest3"), + buildCriterion( + "viewField4", Condition.EQUAL, "viewTest4"))))))); Assert.assertEquals(expectedResult, result); } @@ -302,28 +181,16 @@ public static void testApplyViewToFilterV1Filter() { .setCriteria( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field1") - .setValue("test1") - .setValues(new StringArray(ImmutableList.of("test1"))), - new Criterion() - .setField("field2") - .setValue("test2") - .setValues(new StringArray(ImmutableList.of("test2")))))); + buildCriterion("field1", Condition.EQUAL, "test1"), + buildCriterion("field2", Condition.EQUAL, "test2")))); Filter viewFilter = new Filter() .setCriteria( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("viewField1") - .setValue("viewTest1") - .setValues(new StringArray(ImmutableList.of("viewTest1"))), - new Criterion() - .setField("viewField2") - .setValue("viewTest2") - .setValues(new StringArray(ImmutableList.of("viewTest2")))))); + buildCriterion("viewField1", Condition.EQUAL, "viewTest1"), + buildCriterion("viewField2", Condition.EQUAL, "viewTest2")))); Filter result = SearchUtils.combineFilters(baseFilter, viewFilter); @@ -336,25 +203,11 @@ public static void testApplyViewToFilterV1Filter() { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field1") - .setValue("test1") - .setValues(new StringArray(ImmutableList.of("test1"))), - new Criterion() - .setField("field2") - .setValue("test2") - .setValues(new StringArray(ImmutableList.of("test2"))), - new Criterion() - .setField("viewField1") - .setValue("viewTest1") - .setValues( - new StringArray(ImmutableList.of("viewTest1"))), - new Criterion() - .setField("viewField2") - .setValue("viewTest2") - .setValues( - new StringArray( - ImmutableList.of("viewTest2"))))))))); + buildCriterion("field1", Condition.EQUAL, "test1"), + buildCriterion("field2", Condition.EQUAL, "test2"), + buildCriterion("viewField1", Condition.EQUAL, "viewTest1"), + buildCriterion( + "viewField2", Condition.EQUAL, "viewTest2"))))))); Assert.assertEquals(expectedResult, result); } diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/CreateViewResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/CreateViewResolverTest.java index c009cf37c5397..8f638e4ff9257 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/CreateViewResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/CreateViewResolverTest.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.view; import static com.linkedin.datahub.graphql.TestUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.testng.Assert.*; @@ -24,7 +25,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.service.ViewService; @@ -108,28 +108,17 @@ public void testGetSuccess() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setCondition(Condition.EQUAL) - .setField("test1") - .setValue( - "value1") // Unfortunate --- For - // backwards compat. - .setValues( - new StringArray( - ImmutableList.of( - "value1", "value2"))) - .setNegated(false), - new Criterion() - .setCondition(Condition.IN) - .setField("test2") - .setValue( - "value1") // Unfortunate --- For - // backwards compat. - .setValues( - new StringArray( - ImmutableList.of( - "value1", "value2"))) - .setNegated(true))))))))), + buildCriterion( + "test1", + Condition.EQUAL, + "value1", + "value2"), + buildCriterion( + "test2", + Condition.IN, + true, + "value1", + "value2"))))))))), Mockito.anyLong()); } diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ListGlobalViewsResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ListGlobalViewsResolverTest.java index b5c0531db792b..8fa3b098f2041 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ListGlobalViewsResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ListGlobalViewsResolverTest.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.view; import static com.linkedin.datahub.graphql.TestUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import static org.testng.Assert.*; @@ -8,7 +9,6 @@ import com.google.common.collect.ImmutableSet; import com.linkedin.common.urn.Urn; import com.linkedin.common.urn.UrnUtils; -import com.linkedin.data.template.StringArray; import com.linkedin.datahub.graphql.QueryContext; import com.linkedin.datahub.graphql.generated.DataHubViewType; import com.linkedin.datahub.graphql.generated.ListGlobalViewsInput; @@ -18,7 +18,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.search.SearchEntity; @@ -55,16 +54,10 @@ public void testGetSuccessInput() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("type") - .setValue(DataHubViewType.GLOBAL.toString()) - .setValues( - new StringArray( - ImmutableList.of( - DataHubViewType.GLOBAL - .toString()))) - .setCondition(Condition.EQUAL) - .setNegated(false)))))))), + buildCriterion( + "type", + Condition.EQUAL, + DataHubViewType.GLOBAL.toString())))))))), Mockito.any(), Mockito.eq(0), Mockito.eq(20))) diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ListMyViewsResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ListMyViewsResolverTest.java index 85d24f9251eaa..278aeef7b8da4 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ListMyViewsResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ListMyViewsResolverTest.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.view; import static com.linkedin.datahub.graphql.TestUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import static org.testng.Assert.*; @@ -8,7 +9,6 @@ import com.google.common.collect.ImmutableSet; import com.linkedin.common.urn.Urn; import com.linkedin.common.urn.UrnUtils; -import com.linkedin.data.template.StringArray; import com.linkedin.datahub.graphql.QueryContext; import com.linkedin.datahub.graphql.generated.DataHubViewType; import com.linkedin.datahub.graphql.generated.ListMyViewsInput; @@ -17,7 +17,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.search.SearchEntity; @@ -57,25 +56,14 @@ public void testGetSuccessInput1() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("createdBy") - .setValue(TEST_USER.toString()) - .setValues( - new StringArray( - ImmutableList.of( - TEST_USER.toString()))) - .setCondition(Condition.EQUAL) - .setNegated(false), - new Criterion() - .setField("type") - .setValue(DataHubViewType.GLOBAL.toString()) - .setValues( - new StringArray( - ImmutableList.of( - DataHubViewType.GLOBAL - .toString()))) - .setCondition(Condition.EQUAL) - .setNegated(false)))))))), + buildCriterion( + "createdBy", + Condition.EQUAL, + TEST_USER.toString()), + buildCriterion( + "type", + Condition.EQUAL, + DataHubViewType.GLOBAL.toString())))))))), Mockito.any(), Mockito.eq(0), Mockito.eq(20))) @@ -123,15 +111,10 @@ public void testGetSuccessInput2() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("createdBy") - .setValue(TEST_USER.toString()) - .setValues( - new StringArray( - ImmutableList.of( - TEST_USER.toString()))) - .setCondition(Condition.EQUAL) - .setNegated(false)))))))), + buildCriterion( + "createdBy", + Condition.EQUAL, + TEST_USER.toString())))))))), Mockito.any(), Mockito.eq(0), Mockito.eq(20))) diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/UpdateViewResolverTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/UpdateViewResolverTest.java index 86a502b40b936..45c2c31e3159b 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/UpdateViewResolverTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/UpdateViewResolverTest.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.view; import static com.linkedin.datahub.graphql.TestUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.testng.Assert.*; @@ -30,7 +31,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.service.ViewService; @@ -109,28 +109,17 @@ public void testGetSuccessGlobalViewIsCreator() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setCondition(Condition.EQUAL) - .setField("test1") - .setValue( - "value1") // Unfortunate --- For - // backwards compat. - .setValues( - new StringArray( - ImmutableList.of( - "value1", "value2"))) - .setNegated(false), - new Criterion() - .setCondition(Condition.IN) - .setField("test2") - .setValue( - "value1") // Unfortunate --- For - // backwards compat. - .setValues( - new StringArray( - ImmutableList.of( - "value1", "value2"))) - .setNegated(true))))))))), + buildCriterion( + "test1", + Condition.EQUAL, + "value1", + "value2"), + buildCriterion( + "test2", + Condition.IN, + true, + "value1", + "value2"))))))))), Mockito.anyLong()); } @@ -173,28 +162,17 @@ public void testGetSuccessGlobalViewManageGlobalViews() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setCondition(Condition.EQUAL) - .setField("test1") - .setValue( - "value1") // Unfortunate --- For - // backwards compat. - .setValues( - new StringArray( - ImmutableList.of( - "value1", "value2"))) - .setNegated(false), - new Criterion() - .setCondition(Condition.IN) - .setField("test2") - .setValue( - "value1") // Unfortunate --- For - // backwards compat. - .setValues( - new StringArray( - ImmutableList.of( - "value1", "value2"))) - .setNegated(true))))))))), + buildCriterion( + "test1", + Condition.EQUAL, + "value1", + "value2"), + buildCriterion( + "test2", + Condition.IN, + true, + "value1", + "value2"))))))))), Mockito.anyLong()); } diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ViewUtilsTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ViewUtilsTest.java index d142be1321a5c..c33aa629138f1 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ViewUtilsTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/view/ViewUtilsTest.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.graphql.resolvers.view; import static com.linkedin.datahub.graphql.TestUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.testng.Assert.*; @@ -22,7 +23,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.service.ViewService; @@ -148,26 +148,14 @@ public void testMapDefinition() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setNegated(false) - .setValues( - new StringArray( - ImmutableList.of("value1", "value2"))) - .setValue("value1") // Disgraceful - .setField("test1") // Consider whether we - // should NOT go through - // the keyword mapping. - .setCondition(Condition.IN), - new Criterion() - .setNegated(true) - .setValues( - new StringArray( - ImmutableList.of("value3", "value4"))) - .setValue("value3") // Disgraceful - .setField("test2") // Consider whether we - // should NOT go through - // the keyword mapping. - .setCondition(Condition.CONTAIN)))))))); + buildCriterion( + "test1", Condition.IN, "value1", "value2"), + buildCriterion( + "test2", + Condition.CONTAIN, + true, + "value3", + "value4")))))))); assertEquals(ViewUtils.mapDefinition(input, mock(AspectRetriever.class)), expectedResult); } diff --git a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/types/view/DataHubViewTypeTest.java b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/types/view/DataHubViewTypeTest.java index 685cccf27ccc0..8f3750c39f670 100644 --- a/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/types/view/DataHubViewTypeTest.java +++ b/datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/types/view/DataHubViewTypeTest.java @@ -1,5 +1,6 @@ package com.linkedin.datahub.graphql.types.view; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import static org.testng.Assert.*; @@ -25,7 +26,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.r2.RemoteInvocationException; @@ -74,13 +74,11 @@ public class DataHubViewTypeTest { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setValues( - new StringArray( - ImmutableList.of( - "value1", "value2"))) - .setField("test") - .setCondition(Condition.EQUAL)))))))) + buildCriterion( + "test", + Condition.EQUAL, + "value1", + "value2")))))))) .setEntityTypes( new StringArray( ImmutableList.of( @@ -110,38 +108,30 @@ public class DataHubViewTypeTest { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setValues( - new StringArray( - ImmutableList.of( - "value1", "value2"))) - .setField("test") - .setCondition(Condition.EQUAL), - new Criterion() - .setValues( - new StringArray( - ImmutableList.of( - "value1", "value2"))) - .setField("test2") - .setCondition(Condition.EQUAL)))), + buildCriterion( + "test", + Condition.EQUAL, + "value1", + "value2"), + buildCriterion( + "test2", + Condition.EQUAL, + "value1", + "value2")))), new ConjunctiveCriterion() .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setValues( - new StringArray( - ImmutableList.of( - "value1", "value2"))) - .setField("test2") - .setCondition(Condition.EQUAL), - new Criterion() - .setValues( - new StringArray( - ImmutableList.of( - "value1", "value2"))) - .setField("test2") - .setCondition(Condition.EQUAL)))))))) + buildCriterion( + "test2", + Condition.EQUAL, + "value1", + "value2"), + buildCriterion( + "test2", + Condition.EQUAL, + "value1", + "value2")))))))) .setEntityTypes( new StringArray( ImmutableList.of( diff --git a/datahub-upgrade/src/main/java/com/linkedin/datahub/upgrade/system/browsepaths/BackfillBrowsePathsV2Step.java b/datahub-upgrade/src/main/java/com/linkedin/datahub/upgrade/system/browsepaths/BackfillBrowsePathsV2Step.java index e6213a164febf..c197c6fd9c610 100644 --- a/datahub-upgrade/src/main/java/com/linkedin/datahub/upgrade/system/browsepaths/BackfillBrowsePathsV2Step.java +++ b/datahub-upgrade/src/main/java/com/linkedin/datahub/upgrade/system/browsepaths/BackfillBrowsePathsV2Step.java @@ -1,6 +1,9 @@ package com.linkedin.datahub.upgrade.system.browsepaths; import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; +import static com.linkedin.metadata.utils.CriterionUtils.buildExistsCriterion; +import static com.linkedin.metadata.utils.CriterionUtils.buildIsNullCriterion; import static com.linkedin.metadata.utils.SystemMetadataUtils.createDefaultSystemMetadata; import com.google.common.collect.ImmutableList; @@ -9,7 +12,6 @@ import com.linkedin.common.BrowsePathsV2; import com.linkedin.common.urn.Urn; import com.linkedin.common.urn.UrnUtils; -import com.linkedin.data.template.StringArray; import com.linkedin.datahub.upgrade.UpgradeContext; import com.linkedin.datahub.upgrade.UpgradeStep; import com.linkedin.datahub.upgrade.UpgradeStepResult; @@ -152,13 +154,10 @@ private String backfillBrowsePathsV2(String entityType, AuditStamp auditStamp, S private Filter backfillBrowsePathsV2Filter() { // Condition: has `browsePaths` AND does NOT have `browsePathV2` - Criterion missingBrowsePathV2 = new Criterion(); - missingBrowsePathV2.setCondition(Condition.IS_NULL); - missingBrowsePathV2.setField("browsePathV2"); + Criterion missingBrowsePathV2 = buildIsNullCriterion("browsePathV2"); + // Excludes entities without browsePaths - Criterion hasBrowsePathV1 = new Criterion(); - hasBrowsePathV1.setCondition(Condition.EXISTS); - hasBrowsePathV1.setField("browsePaths"); + Criterion hasBrowsePathV1 = buildExistsCriterion("browsePaths"); CriterionArray criterionArray = new CriterionArray(); criterionArray.add(missingBrowsePathV2); @@ -177,13 +176,8 @@ private Filter backfillBrowsePathsV2Filter() { private Filter backfillDefaultBrowsePathsV2Filter() { // Condition: has default `browsePathV2` - Criterion hasDefaultBrowsePathV2 = new Criterion(); - hasDefaultBrowsePathV2.setCondition(Condition.EQUAL); - hasDefaultBrowsePathV2.setField("browsePathV2"); - StringArray values = new StringArray(); - values.add(DEFAULT_BROWSE_PATH_V2); - hasDefaultBrowsePathV2.setValues(values); - hasDefaultBrowsePathV2.setValue(DEFAULT_BROWSE_PATH_V2); // not used, but required field? + Criterion hasDefaultBrowsePathV2 = + buildCriterion("browsePathV2", Condition.EQUAL, DEFAULT_BROWSE_PATH_V2); CriterionArray criterionArray = new CriterionArray(); criterionArray.add(hasDefaultBrowsePathV2); diff --git a/datahub-upgrade/src/main/java/com/linkedin/datahub/upgrade/system/policyfields/BackfillPolicyFieldsStep.java b/datahub-upgrade/src/main/java/com/linkedin/datahub/upgrade/system/policyfields/BackfillPolicyFieldsStep.java index ad28e6b6382d4..42361ebe59b85 100644 --- a/datahub-upgrade/src/main/java/com/linkedin/datahub/upgrade/system/policyfields/BackfillPolicyFieldsStep.java +++ b/datahub-upgrade/src/main/java/com/linkedin/datahub/upgrade/system/policyfields/BackfillPolicyFieldsStep.java @@ -1,6 +1,7 @@ package com.linkedin.datahub.upgrade.system.policyfields; import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildIsNullCriterion; import static com.linkedin.metadata.utils.SystemMetadataUtils.createDefaultSystemMetadata; import com.google.common.collect.ImmutableList; @@ -17,7 +18,6 @@ import com.linkedin.metadata.Constants; import com.linkedin.metadata.boot.BootstrapStep; import com.linkedin.metadata.entity.EntityService; -import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; import com.linkedin.metadata.query.filter.Criterion; @@ -246,9 +246,7 @@ private Optional> ingestPolicyFields( @NotNull private static ConjunctiveCriterion getCriterionForMissingField(String field) { - final Criterion missingPrivilegesField = new Criterion(); - missingPrivilegesField.setCondition(Condition.IS_NULL); - missingPrivilegesField.setField(field); + final Criterion missingPrivilegesField = buildIsNullCriterion(field); final CriterionArray criterionArray = new CriterionArray(); criterionArray.add(missingPrivilegesField); diff --git a/docs/how/updating-datahub.md b/docs/how/updating-datahub.md index ea53c2b470060..d002331e3929e 100644 --- a/docs/how/updating-datahub.md +++ b/docs/how/updating-datahub.md @@ -20,8 +20,9 @@ This file documents any backwards-incompatible changes in DataHub and assists pe ### Breaking Changes -- Metadata service authentication enabled by default -- Rest API authorization enabled by default +- #11486 - Deprecated Criterion filters using `value`. Use `values` instead. This also deprecates the ability to use comma delimited string to represent multiple values using `value`. +- #11484 - Metadata service authentication enabled by default +- #11484 - Rest API authorization enabled by default ### Potential Downtime diff --git a/metadata-io/src/main/java/com/linkedin/metadata/graph/dgraph/DgraphGraphService.java b/metadata-io/src/main/java/com/linkedin/metadata/graph/dgraph/DgraphGraphService.java index 352e89baefc25..1c4a986e24b04 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/graph/dgraph/DgraphGraphService.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/graph/dgraph/DgraphGraphService.java @@ -367,7 +367,7 @@ protected static String getQueryForRelatedEntities( filters.add( String.format( "%s as var(func: eq(<%s>, \"%s\"))", - sourceFilterName, criterion.getField(), criterion.getValue())); + sourceFilterName, criterion.getField(), criterion.getValues().get(0))); }); } @@ -384,7 +384,7 @@ protected static String getQueryForRelatedEntities( filters.add( String.format( "%s as var(func: eq(<%s>, \"%s\"))", - sourceFilterName, criterion.getField(), criterion.getValue())); + sourceFilterName, criterion.getField(), criterion.getValues().get(0))); }); } diff --git a/metadata-io/src/main/java/com/linkedin/metadata/graph/elastic/ESGraphQueryDAO.java b/metadata-io/src/main/java/com/linkedin/metadata/graph/elastic/ESGraphQueryDAO.java index 40fa79a0ef171..8c7f0e3256cf8 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/graph/elastic/ESGraphQueryDAO.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/graph/elastic/ESGraphQueryDAO.java @@ -123,9 +123,9 @@ private static void addFilterToQueryBuilder( criterionArray.forEach( criterion -> andQuery.filter( - QueryBuilders.termQuery( + QueryBuilders.termsQuery( (node == null ? "" : node + ".") + criterion.getField(), - criterion.getValue()))); + criterion.getValues()))); orQuery.should(andQuery); } rootQuery.filter(orQuery); diff --git a/metadata-io/src/main/java/com/linkedin/metadata/graph/elastic/ElasticSearchGraphService.java b/metadata-io/src/main/java/com/linkedin/metadata/graph/elastic/ElasticSearchGraphService.java index 1769c53e4cd9b..1068fae9478e1 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/graph/elastic/ElasticSearchGraphService.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/graph/elastic/ElasticSearchGraphService.java @@ -3,12 +3,12 @@ import static com.linkedin.metadata.aspect.models.graph.Edge.*; import static com.linkedin.metadata.graph.elastic.GraphFilterUtils.getUrnStatusFieldName; import static com.linkedin.metadata.graph.elastic.GraphFilterUtils.getUrnStatusQuery; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; -import com.linkedin.data.template.StringArray; import com.linkedin.metadata.aspect.models.graph.Edge; import com.linkedin.metadata.aspect.models.graph.EdgeUrnType; import com.linkedin.metadata.aspect.models.graph.RelatedEntities; @@ -229,11 +229,7 @@ public EntityLineageResult getLineage( private static Filter createUrnFilter(@Nonnull final Urn urn) { Filter filter = new Filter(); CriterionArray criterionArray = new CriterionArray(); - Criterion criterion = new Criterion(); - criterion.setCondition(Condition.EQUAL); - criterion.setField("urn"); - criterion.setValue(urn.toString()); - criterion.setValues(new StringArray(urn.toString())); + Criterion criterion = buildCriterion("urn", Condition.EQUAL, urn.toString()); criterionArray.add(criterion); filter.setOr( new ConjunctiveCriterionArray( diff --git a/metadata-io/src/main/java/com/linkedin/metadata/graph/neo4j/Neo4jGraphService.java b/metadata-io/src/main/java/com/linkedin/metadata/graph/neo4j/Neo4jGraphService.java index 75d993f52680a..ef748ebd23278 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/graph/neo4j/Neo4jGraphService.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/graph/neo4j/Neo4jGraphService.java @@ -489,7 +489,7 @@ public RelatedEntitiesResult findRelatedEntities( // Create a URN from the String. Only proceed if srcCriteria is not null or empty if (StringUtils.isNotEmpty(srcCriteria)) { final String urnValue = - sourceEntityFilter.getOr().get(0).getAnd().get(0).getValue().toString(); + sourceEntityFilter.getOr().get(0).getAnd().get(0).getValues().get(0).toString(); try { final Urn urn = Urn.createFromString(urnValue); srcNodeLabel = urn.getEntityType(); @@ -840,7 +840,8 @@ private static String criterionToString(@Nonnull CriterionArray criterionArray) final StringJoiner joiner = new StringJoiner(",", "{", "}"); criterionArray.forEach( - criterion -> joiner.add(toCriterionString(criterion.getField(), criterion.getValue()))); + criterion -> + joiner.add(toCriterionString(criterion.getField(), criterion.getValues().get(0)))); return joiner.length() <= 2 ? "" : joiner.toString(); } @@ -943,7 +944,7 @@ public RelatedEntitiesScrollResult scrollRelatedEntities( // Create a URN from the String. Only proceed if srcCriteria is not null or empty if (StringUtils.isNotEmpty(srcCriteria)) { final String urnValue = - sourceEntityFilter.getOr().get(0).getAnd().get(0).getValue().toString(); + sourceEntityFilter.getOr().get(0).getAnd().get(0).getValues().get(0).toString(); try { final Urn urn = Urn.createFromString(urnValue); srcNodeLabel = urn.getEntityType(); diff --git a/metadata-io/src/main/java/com/linkedin/metadata/search/LineageSearchService.java b/metadata-io/src/main/java/com/linkedin/metadata/search/LineageSearchService.java index ec9c44e42f7f4..67ebdf8882b80 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/search/LineageSearchService.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/search/LineageSearchService.java @@ -26,7 +26,6 @@ import com.linkedin.metadata.query.GroupingSpec; import com.linkedin.metadata.query.SearchFlags; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.query.filter.SortCriterion; @@ -358,14 +357,14 @@ LineageSearchResult getLightningSearchResult( .map(ConjunctiveCriterion::getAnd) .flatMap(CriterionArray::stream) .filter(criterion -> "platform".equals(criterion.getField())) - .map(Criterion::getValue) + .flatMap(criterion -> criterion.getValues().stream()) .collect(Collectors.toSet()); originCriteriaValues = inputFilters.getOr().stream() .map(ConjunctiveCriterion::getAnd) .flatMap(CriterionArray::stream) .filter(criterion -> "origin".equals(criterion.getField())) - .map(Criterion::getValue) + .flatMap(criterion -> criterion.getValues().stream()) .collect(Collectors.toSet()); } boolean isNotFiltered = diff --git a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESBrowseDAO.java b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESBrowseDAO.java index f1c42a1d277da..61bba11098fae 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESBrowseDAO.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/ESBrowseDAO.java @@ -125,7 +125,7 @@ public BrowseResult browse( @Nullable Filter filters, int from, int size) { - final Map requestMap = SearchUtils.getRequestMap(filters); + final Map> requestMap = SearchUtils.getRequestMap(filters); final OperationContext finalOpContext = opContext.withSearchFlags( @@ -213,7 +213,7 @@ protected SearchRequest constructGroupsSearchRequest( @Nonnull OperationContext opContext, @Nonnull String indexName, @Nonnull String path, - @Nonnull Map requestMap) { + @Nonnull Map> requestMap) { final SearchRequest searchRequest = new SearchRequest(indexName); final SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(0); @@ -235,7 +235,7 @@ protected SearchRequest constructGroupsSearchRequest( private QueryBuilder buildQueryString( @Nonnull OperationContext opContext, @Nonnull String path, - @Nonnull Map requestMap, + @Nonnull Map> requestMap, boolean isGroupQuery) { final int browseDepthVal = getPathDepth(path); @@ -253,7 +253,7 @@ private QueryBuilder buildQueryString( queryBuilder.filter(QueryBuilders.termQuery(BROWSE_PATH_DEPTH, browseDepthVal)); } - requestMap.forEach((field, val) -> queryBuilder.filter(QueryBuilders.termQuery(field, val))); + requestMap.forEach((field, vals) -> queryBuilder.filter(QueryBuilders.termsQuery(field, vals))); return queryBuilder; } @@ -272,7 +272,7 @@ SearchRequest constructEntitiesSearchRequest( @Nonnull OperationContext opContext, @Nonnull String indexName, @Nonnull String path, - @Nonnull Map requestMap, + @Nonnull Map> requestMap, int from, int size) { final SearchRequest searchRequest = new SearchRequest(indexName); @@ -302,7 +302,7 @@ SearchRequest constructEntitiesSearchRequest( @Nonnull OperationContext opContext, @Nonnull String indexName, @Nonnull String path, - @Nonnull Map requestMap, + @Nonnull Map> requestMap, @Nullable Object[] sort, @Nullable String pitId, @Nonnull String keepAlive, diff --git a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/filter/BaseQueryFilterRewriter.java b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/filter/BaseQueryFilterRewriter.java index 800d59bacc1d8..367705d369c7c 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/filter/BaseQueryFilterRewriter.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/filter/BaseQueryFilterRewriter.java @@ -1,14 +1,15 @@ package com.linkedin.metadata.search.elasticsearch.query.filter; import static com.linkedin.metadata.search.utils.QueryUtils.EMPTY_FILTER; -import static com.linkedin.metadata.search.utils.QueryUtils.newCriterion; import static com.linkedin.metadata.search.utils.QueryUtils.newRelationshipFilter; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.linkedin.common.urn.Urn; import com.linkedin.common.urn.UrnUtils; import com.linkedin.metadata.aspect.GraphRetriever; import com.linkedin.metadata.aspect.models.graph.Edge; import com.linkedin.metadata.aspect.models.graph.RelatedEntitiesScrollResult; +import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.RelationshipDirection; import com.linkedin.metadata.search.utils.QueryUtils; import io.datahubproject.metadata.context.OperationContext; @@ -209,7 +210,7 @@ private static void scrollGraph( graphRetriever.consumeRelatedEntities( consumer, entityTypes, - QueryUtils.newDisjunctiveFilter(newCriterion("urn", queryUrnStrs)), + QueryUtils.newDisjunctiveFilter(buildCriterion("urn", Condition.EQUAL, queryUrnStrs)), entityTypes, EMPTY_FILTER, relationshipTypes, diff --git a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/AggregationQueryBuilder.java b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/AggregationQueryBuilder.java index fa2eef964e006..39f69ed1716ab 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/AggregationQueryBuilder.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/AggregationQueryBuilder.java @@ -421,8 +421,6 @@ private void addCriterionFiltersToAggregationMetadata( .forEach( value -> addMissingAggregationValueToAggregationMetadata(value, originalAggMetadata)); - } else { - addMissingAggregationValueToAggregationMetadata(criterion.getValue(), originalAggMetadata); } } else { /* diff --git a/metadata-io/src/main/java/com/linkedin/metadata/search/utils/ESUtils.java b/metadata-io/src/main/java/com/linkedin/metadata/search/utils/ESUtils.java index 78bb8cb1e41ae..ace7fa2bc197c 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/search/utils/ESUtils.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/search/utils/ESUtils.java @@ -8,7 +8,7 @@ import static com.linkedin.metadata.search.elasticsearch.indexbuilder.MappingsBuilder.SUBFIELDS; import static com.linkedin.metadata.search.elasticsearch.query.request.SearchFieldConfig.KEYWORD_FIELDS; import static com.linkedin.metadata.search.elasticsearch.query.request.SearchFieldConfig.PATH_HIERARCHY_FIELDS; -import static com.linkedin.metadata.search.utils.SearchUtils.isUrn; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.google.common.collect.ImmutableList; import com.linkedin.metadata.aspect.AspectRetriever; @@ -25,7 +25,6 @@ import com.linkedin.metadata.search.elasticsearch.query.filter.QueryFilterRewriteChain; import com.linkedin.metadata.search.elasticsearch.query.filter.QueryFilterRewriterContext; import io.datahubproject.metadata.context.OperationContext; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -177,9 +176,7 @@ public static BoolQueryBuilder buildFilterQuery( .getCriteria() .forEach( criterion -> { - if (!criterion.getValue().trim().isEmpty() - || criterion.hasValues() - || criterion.getCondition() == Condition.IS_NULL) { + if (criterion.hasValues() || criterion.getCondition() == Condition.IS_NULL) { andQueryBuilder.must( getQueryBuilderFromCriterion( criterion, @@ -209,7 +206,6 @@ public static BoolQueryBuilder buildConjunctiveFilterQuery( .forEach( criterion -> { if (Set.of(Condition.EXISTS, Condition.IS_NULL).contains(criterion.getCondition()) - || (criterion.hasValue() && !criterion.getValue().trim().isEmpty()) || criterion.hasValues()) { if (!criterion.isNegated()) { // `filter` instead of `must` (enables caching and bypasses scoring) @@ -539,20 +535,13 @@ private static QueryBuilder getQueryBuilderFromCriterionForFieldToExpand( @Nonnull QueryFilterRewriteChain queryFilterRewriteChain) { final BoolQueryBuilder orQueryBuilder = new BoolQueryBuilder(); for (String field : fields) { - Criterion criterionToQuery = new Criterion(); - criterionToQuery.setCondition(criterion.getCondition()); - criterionToQuery.setNegated(criterion.isNegated()); - if (criterion.hasValues()) { - criterionToQuery.setValues(criterion.getValues()); - } - if (criterion.hasValue()) { - criterionToQuery.setValue(criterion.getValue()); - } - criterionToQuery.setField( - toKeywordField(field, isTimeseries, opContext.getAspectRetriever())); orQueryBuilder.should( getQueryBuilderFromCriterionForSingleField( - criterionToQuery, + buildCriterion( + toKeywordField(field, isTimeseries, opContext.getAspectRetriever()), + criterion.getCondition(), + criterion.isNegated(), + criterion.getValues()), isTimeseries, searchableFieldTypes, null, @@ -583,7 +572,7 @@ private static QueryBuilder getQueryBuilderFromCriterionForSingleField( return QueryBuilders.boolQuery() .must(QueryBuilders.existsQuery(fieldName)) .queryName(queryName != null ? queryName : fieldName); - } else if (criterion.hasValues() || criterion.hasValue()) { + } else if (criterion.hasValues()) { if (condition == Condition.EQUAL) { return buildEqualsConditionFromCriterion( fieldName, criterion, isTimeseries, searchableFieldTypes, aspectRetriever) @@ -643,21 +632,6 @@ private static QueryBuilder buildWildcardQueryWithMultipleValues( return boolQuery; } - private static QueryBuilder buildWildcardQueryWithSingleValue( - @Nonnull final String fieldName, - @Nonnull final Criterion criterion, - final boolean isTimeseries, - @Nullable String queryName, - @Nonnull AspectRetriever aspectRetriever, - String wildcardPattern) { - return QueryBuilders.wildcardQuery( - toKeywordField(criterion.getField(), isTimeseries, aspectRetriever), - String.format( - wildcardPattern, ESUtils.escapeReservedCharacters(criterion.getValue().trim()))) - .queryName(queryName != null ? queryName : fieldName) - .caseInsensitive(true); - } - private static QueryBuilder buildContainsConditionFromCriterion( @Nonnull final String fieldName, @Nonnull final Criterion criterion, @@ -665,11 +639,7 @@ private static QueryBuilder buildContainsConditionFromCriterion( final boolean isTimeseries, @Nonnull AspectRetriever aspectRetriever) { - if (!criterion.getValues().isEmpty()) { - return buildWildcardQueryWithMultipleValues( - fieldName, criterion, isTimeseries, queryName, aspectRetriever, "*%s*"); - } - return buildWildcardQueryWithSingleValue( + return buildWildcardQueryWithMultipleValues( fieldName, criterion, isTimeseries, queryName, aspectRetriever, "*%s*"); } @@ -680,11 +650,7 @@ private static QueryBuilder buildStartsWithConditionFromCriterion( final boolean isTimeseries, @Nonnull AspectRetriever aspectRetriever) { - if (!criterion.getValues().isEmpty()) { - return buildWildcardQueryWithMultipleValues( - fieldName, criterion, isTimeseries, queryName, aspectRetriever, "%s*"); - } - return buildWildcardQueryWithSingleValue( + return buildWildcardQueryWithMultipleValues( fieldName, criterion, isTimeseries, queryName, aspectRetriever, "%s*"); } @@ -695,11 +661,7 @@ private static QueryBuilder buildEndsWithConditionFromCriterion( final boolean isTimeseries, @Nonnull AspectRetriever aspectRetriever) { - if (!criterion.getValues().isEmpty()) { - return buildWildcardQueryWithMultipleValues( - fieldName, criterion, isTimeseries, queryName, aspectRetriever, "*%s"); - } - return buildWildcardQueryWithSingleValue( + return buildWildcardQueryWithMultipleValues( fieldName, criterion, isTimeseries, queryName, aspectRetriever, "*%s"); } @@ -709,19 +671,8 @@ private static QueryBuilder buildEqualsConditionFromCriterion( final boolean isTimeseries, final Map> searchableFieldTypes, @Nonnull AspectRetriever aspectRetriever) { - /* - * If the newer 'values' field of Criterion.pdl is set, then we - * handle using the following code to allow multi-match. - */ - if (!criterion.getValues().isEmpty()) { - return buildEqualsConditionFromCriterionWithValues( - fieldName, criterion, isTimeseries, searchableFieldTypes, aspectRetriever); - } - /* - * Otherwise, we are likely using the deprecated 'value' field. - * We handle using the legacy code path below. - */ - return buildEqualsFromCriterionWithValue(fieldName, criterion, isTimeseries, aspectRetriever); + return buildEqualsConditionFromCriterionWithValues( + fieldName, criterion, isTimeseries, searchableFieldTypes, aspectRetriever); } /** @@ -795,12 +746,7 @@ private static RangeQueryBuilder buildRangeQueryFromCriterion( // Determine criterion value, range query only accepts single value so take first value in // values if multiple - String criterionValueString; - if (!criterion.getValues().isEmpty()) { - criterionValueString = criterion.getValues().get(0).trim(); - } else { - criterionValueString = criterion.getValue().trim(); - } + String criterionValueString = criterion.getValues().get(0).trim(); Object criterionValue; String documentFieldName; if (fieldTypes.contains(BOOLEAN_FIELD_TYPE)) { @@ -829,48 +775,6 @@ private static RangeQueryBuilder buildRangeQueryFromCriterion( } } - /** - * Builds an instance of {@link QueryBuilder} representing an EQUALS condition which was created - * using the deprecated 'value' field of Criterion.pdl model. - * - *

Previously, we supported comma-separate values inside of a single string field, thus we have - * to account for splitting and matching against each value below. - * - *

For all new code, we should be using the new 'values' field for performing multi-match. This - * is simply retained for backwards compatibility of the search API. - */ - @Deprecated - private static QueryBuilder buildEqualsFromCriterionWithValue( - @Nonnull final String fieldName, - @Nonnull final Criterion criterion, - final boolean isTimeseries, - @Nonnull AspectRetriever aspectRetriever) { - // If the value is an URN style value, then we do not attempt to split it by comma (for obvious - // reasons) - if (isUrn(criterion.getValue())) { - return QueryBuilders.matchQuery( - toKeywordField(criterion.getField(), isTimeseries, aspectRetriever), - criterion.getValue().trim()) - .queryName(fieldName) - .analyzer(KEYWORD_ANALYZER); - } - final BoolQueryBuilder filters = new BoolQueryBuilder(); - // Cannot assume the existence of a .keyword or other subfield (unless contains `.`) - // Cannot assume the type of the underlying field or subfield thus KEYWORD_ANALYZER is forced - List fields = - criterion.getField().contains(".") - ? List.of(criterion.getField()) - : List.of(criterion.getField(), criterion.getField() + ".*"); - Arrays.stream(criterion.getValue().trim().split("\\s*,\\s*")) - .forEach( - elem -> - filters.should( - QueryBuilders.multiMatchQuery(elem, fields.toArray(new String[0])) - .queryName(fieldName) - .analyzer(KEYWORD_ANALYZER))); - return filters; - } - @Nonnull public static BoolQueryBuilder applyDefaultSearchFilters( @Nonnull OperationContext opContext, diff --git a/metadata-io/src/main/java/com/linkedin/metadata/search/utils/SearchUtils.java b/metadata-io/src/main/java/com/linkedin/metadata/search/utils/SearchUtils.java index add2b1526ab67..4f71a87ca16a8 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/search/utils/SearchUtils.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/search/utils/SearchUtils.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Predicate; @@ -42,7 +43,7 @@ private SearchUtils() {} * @return a request map */ @Nonnull - public static Map getRequestMap(@Nullable Filter requestParams) { + public static Map> getRequestMap(@Nullable Filter requestParams) { if (requestParams == null) { return Collections.emptyMap(); } @@ -67,7 +68,7 @@ public static Map getRequestMap(@Nullable Filter requestParams) }); return criterionArray.stream() - .collect(Collectors.toMap(Criterion::getField, Criterion::getValue)); + .collect(Collectors.toMap(Criterion::getField, Criterion::getValues)); } public static boolean isUrn(@Nonnull String value) { diff --git a/metadata-io/src/main/java/com/linkedin/metadata/structuredproperties/hooks/PropertyDefinitionDeleteSideEffect.java b/metadata-io/src/main/java/com/linkedin/metadata/structuredproperties/hooks/PropertyDefinitionDeleteSideEffect.java index 41addbe197f27..134c65d2b5fae 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/structuredproperties/hooks/PropertyDefinitionDeleteSideEffect.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/structuredproperties/hooks/PropertyDefinitionDeleteSideEffect.java @@ -4,6 +4,7 @@ import static com.linkedin.metadata.Constants.STRUCTURED_PROPERTY_DEFINITION_ASPECT_NAME; import static com.linkedin.metadata.Constants.STRUCTURED_PROPERTY_KEY_ASPECT_NAME; import static com.linkedin.metadata.Constants.STRUCTURED_PROPERTY_MAPPING_FIELD_PREFIX; +import static com.linkedin.metadata.utils.CriterionUtils.buildExistsCriterion; import com.linkedin.common.AuditStamp; import com.linkedin.common.urn.Urn; @@ -20,7 +21,6 @@ import com.linkedin.metadata.entity.ebean.batch.PatchItemImpl; import com.linkedin.metadata.models.EntitySpec; import com.linkedin.metadata.models.StructuredPropertyUtils; -import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; import com.linkedin.metadata.query.filter.Criterion; @@ -170,12 +170,11 @@ private Filter getFilter() { final ConjunctiveCriterion conjunction = new ConjunctiveCriterion(); final CriterionArray andCriterion = new CriterionArray(); - final Criterion propertyExistsCriterion = new Criterion(); // Cannot rely on automatic field name since the definition is deleted - propertyExistsCriterion.setField( - STRUCTURED_PROPERTY_MAPPING_FIELD_PREFIX - + StructuredPropertyUtils.toElasticsearchFieldName(propertyUrn, definition)); - propertyExistsCriterion.setCondition(Condition.EXISTS); + final Criterion propertyExistsCriterion = + buildExistsCriterion( + STRUCTURED_PROPERTY_MAPPING_FIELD_PREFIX + + StructuredPropertyUtils.toElasticsearchFieldName(propertyUrn, definition)); andCriterion.add(propertyExistsCriterion); conjunction.setAnd(andCriterion); diff --git a/metadata-io/src/main/java/com/linkedin/metadata/timeseries/elastic/ElasticSearchTimeseriesAspectService.java b/metadata-io/src/main/java/com/linkedin/metadata/timeseries/elastic/ElasticSearchTimeseriesAspectService.java index cb364f41aa218..67518121edae4 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/timeseries/elastic/ElasticSearchTimeseriesAspectService.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/timeseries/elastic/ElasticSearchTimeseriesAspectService.java @@ -1,6 +1,7 @@ package com.linkedin.metadata.timeseries.elastic; import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.codahale.metrics.Timer; import com.datahub.util.RecordUtils; @@ -339,20 +340,21 @@ public List getAspectValues( filterQueryBuilder.mustNot(QueryBuilders.termQuery(MappingsBuilder.IS_EXPLODED_FIELD, true)); if (startTimeMillis != null) { Criterion startTimeCriterion = - new Criterion() - .setField(MappingsBuilder.TIMESTAMP_MILLIS_FIELD) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTimeMillis.toString()); + buildCriterion( + MappingsBuilder.TIMESTAMP_MILLIS_FIELD, + Condition.GREATER_THAN_OR_EQUAL_TO, + startTimeMillis.toString()); filterQueryBuilder.must( ESUtils.getQueryBuilderFromCriterion( startTimeCriterion, true, searchableFieldTypes, opContext, queryFilterRewriteChain)); } if (endTimeMillis != null) { Criterion endTimeCriterion = - new Criterion() - .setField(MappingsBuilder.TIMESTAMP_MILLIS_FIELD) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(endTimeMillis.toString()); + buildCriterion( + MappingsBuilder.TIMESTAMP_MILLIS_FIELD, + Condition.LESS_THAN_OR_EQUAL_TO, + endTimeMillis.toString()); + filterQueryBuilder.must( ESUtils.getQueryBuilderFromCriterion( endTimeCriterion, true, searchableFieldTypes, opContext, queryFilterRewriteChain)); @@ -575,20 +577,21 @@ public TimeseriesScrollResult scrollAspects( if (startTimeMillis != null) { Criterion startTimeCriterion = - new Criterion() - .setField(MappingsBuilder.TIMESTAMP_MILLIS_FIELD) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTimeMillis.toString()); + buildCriterion( + MappingsBuilder.TIMESTAMP_MILLIS_FIELD, + Condition.GREATER_THAN_OR_EQUAL_TO, + startTimeMillis.toString()); + filterQueryBuilder.filter( ESUtils.getQueryBuilderFromCriterion( startTimeCriterion, true, searchableFieldTypes, opContext, queryFilterRewriteChain)); } if (endTimeMillis != null) { Criterion endTimeCriterion = - new Criterion() - .setField(MappingsBuilder.TIMESTAMP_MILLIS_FIELD) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(endTimeMillis.toString()); + buildCriterion( + MappingsBuilder.TIMESTAMP_MILLIS_FIELD, + Condition.LESS_THAN_OR_EQUAL_TO, + endTimeMillis.toString()); filterQueryBuilder.filter( ESUtils.getQueryBuilderFromCriterion( endTimeCriterion, true, searchableFieldTypes, opContext, queryFilterRewriteChain)); diff --git a/metadata-io/src/main/java/com/linkedin/metadata/timeseries/elastic/UsageServiceUtil.java b/metadata-io/src/main/java/com/linkedin/metadata/timeseries/elastic/UsageServiceUtil.java index abeefae3cf39f..54f97f45219ac 100644 --- a/metadata-io/src/main/java/com/linkedin/metadata/timeseries/elastic/UsageServiceUtil.java +++ b/metadata-io/src/main/java/com/linkedin/metadata/timeseries/elastic/UsageServiceUtil.java @@ -2,6 +2,7 @@ import static com.linkedin.metadata.Constants.INGESTION_MAX_SERIALIZED_STRING_LENGTH; import static com.linkedin.metadata.Constants.MAX_JACKSON_STRING_SIZE; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.codahale.metrics.Timer; import com.fasterxml.jackson.core.JsonProcessingException; @@ -97,26 +98,19 @@ public static UsageQueryResult query( // 1. Populate the filter. This is common for all queries. Filter filter = new Filter(); ArrayList criteria = new ArrayList<>(); - Criterion hasUrnCriterion = - new Criterion() - .setField("urn") - .setCondition(Condition.EQUAL) - .setValues(new StringArray(resource)); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, resource); + criteria.add(hasUrnCriterion); if (startTime != null) { Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValues(new StringArray(startTime.toString())); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); + criteria.add(startTimeCriterion); } if (endTime != null) { Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValues(new StringArray(endTime.toString())); + buildCriterion(ES_FIELD_TIMESTAMP, Condition.LESS_THAN_OR_EQUAL_TO, endTime.toString()); criteria.add(endTimeCriterion); } diff --git a/metadata-io/src/test/java/com/linkedin/metadata/recommendation/candidatesource/EntitySearchAggregationCandidateSourceTest.java b/metadata-io/src/test/java/com/linkedin/metadata/recommendation/candidatesource/EntitySearchAggregationCandidateSourceTest.java index 99520c189034a..a3c21e45540f9 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/recommendation/candidatesource/EntitySearchAggregationCandidateSourceTest.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/recommendation/candidatesource/EntitySearchAggregationCandidateSourceTest.java @@ -1,5 +1,6 @@ package com.linkedin.metadata.recommendation.candidatesource; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static org.testng.Assert.assertEquals; @@ -12,7 +13,7 @@ import com.linkedin.common.urn.TestEntityUrn; import com.linkedin.common.urn.Urn; import com.linkedin.metadata.models.registry.EntityRegistry; -import com.linkedin.metadata.query.filter.Criterion; +import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.recommendation.RecommendationContent; import com.linkedin.metadata.recommendation.RecommendationParams; @@ -142,7 +143,7 @@ public void testWhenSearchServiceReturnsValueResults() { assertEquals(params.getSearchParams().getFilters().size(), 1); assertEquals( params.getSearchParams().getFilters().get(0), - new Criterion().setField("testValue").setValue("value1")); + buildCriterion("testValue", Condition.EQUAL, "value1")); assertNotNull(params.getContentParams()); assertEquals(params.getContentParams().getCount().longValue(), 1L); assertTrue( @@ -165,7 +166,7 @@ public void testWhenSearchServiceReturnsValueResults() { assertEquals(params.getSearchParams().getFilters().size(), 1); assertEquals( params.getSearchParams().getFilters().get(0), - new Criterion().setField("testValue").setValue("value3")); + buildCriterion("testValue", Condition.EQUAL, "value3")); assertNotNull(params.getContentParams()); assertEquals(params.getContentParams().getCount().longValue(), 3L); content = candidates.get(1); @@ -178,7 +179,7 @@ public void testWhenSearchServiceReturnsValueResults() { assertEquals(params.getSearchParams().getFilters().size(), 1); assertEquals( params.getSearchParams().getFilters().get(0), - new Criterion().setField("testValue").setValue("value2")); + buildCriterion("testValue", Condition.EQUAL, "value2")); assertNotNull(params.getContentParams()); assertEquals(params.getContentParams().getCount().longValue(), 2L); assertTrue( @@ -208,7 +209,7 @@ public void testWhenSearchServiceReturnsUrnResults() { assertEquals(params.getSearchParams().getFilters().size(), 1); assertEquals( params.getSearchParams().getFilters().get(0), - new Criterion().setField("testUrn").setValue(testUrn1.toString())); + buildCriterion("testUrn", Condition.EQUAL, testUrn1.toString())); assertNotNull(params.getContentParams()); assertEquals(params.getContentParams().getCount().longValue(), 1L); assertTrue( @@ -233,7 +234,7 @@ public void testWhenSearchServiceReturnsUrnResults() { assertEquals(params.getSearchParams().getFilters().size(), 1); assertEquals( params.getSearchParams().getFilters().get(0), - new Criterion().setField("testUrn").setValue(testUrn3.toString())); + buildCriterion("testUrn", Condition.EQUAL, testUrn3.toString())); assertNotNull(params.getContentParams()); assertEquals(params.getContentParams().getCount().longValue(), 3L); content = candidates.get(1); @@ -246,7 +247,7 @@ public void testWhenSearchServiceReturnsUrnResults() { assertEquals(params.getSearchParams().getFilters().size(), 1); assertEquals( params.getSearchParams().getFilters().get(0), - new Criterion().setField("testUrn").setValue(testUrn2.toString())); + buildCriterion("testUrn", Condition.EQUAL, testUrn2.toString())); assertNotNull(params.getContentParams()); assertEquals(params.getContentParams().getCount().longValue(), 2L); assertTrue( diff --git a/metadata-io/src/test/java/com/linkedin/metadata/search/LineageServiceTestBase.java b/metadata-io/src/test/java/com/linkedin/metadata/search/LineageServiceTestBase.java index f689e8c98e3f1..d9268c1b50efe 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/search/LineageServiceTestBase.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/search/LineageServiceTestBase.java @@ -2,6 +2,7 @@ import static com.linkedin.metadata.Constants.DATASET_ENTITY_NAME; import static com.linkedin.metadata.Constants.ELASTICSEARCH_IMPLEMENTATION_ELASTICSEARCH; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static io.datahubproject.test.search.SearchTestUtils.syncAfterWrite; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -942,14 +943,10 @@ public void testLightningSearchService() throws Exception { // Platform ConjunctiveCriterionArray conCritArr = new ConjunctiveCriterionArray(); Criterion platform1Crit = - new Criterion() - .setField("platform") - .setValue("urn:li:dataPlatform:kafka") - .setCondition(Condition.EQUAL); + buildCriterion("platform", Condition.EQUAL, "urn:li:dataPlatform:kafka"); CriterionArray critArr = new CriterionArray(ImmutableList.of(platform1Crit)); conCritArr.add(new ConjunctiveCriterion().setAnd(critArr)); - Criterion degreeCrit = - new Criterion().setField("degree").setValue("2").setCondition(Condition.EQUAL); + Criterion degreeCrit = buildCriterion("degree", Condition.EQUAL, "2"); conCritArr.add( new ConjunctiveCriterion().setAnd(new CriterionArray(ImmutableList.of(degreeCrit)))); Filter filter = new Filter().setOr(conCritArr); @@ -1125,12 +1122,12 @@ public void testLightningEnvFiltering() throws Exception { // Set up filters ConjunctiveCriterionArray conCritArr = new ConjunctiveCriterionArray(); - Criterion platform1Crit = - new Criterion().setField("platform").setValue(kafkaPlatform).setCondition(Condition.EQUAL); + Criterion platform1Crit = buildCriterion("platform", Condition.EQUAL, kafkaPlatform); + CriterionArray critArr = new CriterionArray(ImmutableList.of(platform1Crit)); conCritArr.add(new ConjunctiveCriterion().setAnd(critArr)); - Criterion originCrit = - new Criterion().setField("origin").setValue("DEV").setCondition(Condition.EQUAL); + Criterion originCrit = buildCriterion("origin", Condition.EQUAL, "DEV"); + conCritArr.add( new ConjunctiveCriterion().setAnd(new CriterionArray(ImmutableList.of(originCrit)))); @@ -1201,10 +1198,9 @@ public void testLightningPagination() throws Exception { // Set up filters ConjunctiveCriterionArray conCritArr = new ConjunctiveCriterionArray(); - Criterion platform1Crit = - new Criterion().setField("platform").setValue(kafkaPlatform).setCondition(Condition.EQUAL); - Criterion platform2Crit = - new Criterion().setField("platform").setValue(hivePlatform).setCondition(Condition.EQUAL); + Criterion platform1Crit = buildCriterion("platform", Condition.EQUAL, kafkaPlatform); + + Criterion platform2Crit = buildCriterion("platform", Condition.EQUAL, hivePlatform); CriterionArray critArr = new CriterionArray(ImmutableList.of(platform1Crit)); conCritArr.add(new ConjunctiveCriterion().setAnd(critArr)); critArr = new CriterionArray(ImmutableList.of(platform2Crit)); @@ -1340,19 +1336,15 @@ public void testCanDoLightning() throws Exception { // Set up filters ConjunctiveCriterionArray conCritArr = new ConjunctiveCriterionArray(); - Criterion platform1Crit = - new Criterion().setField("platform").setValue(kafkaPlatform).setCondition(Condition.EQUAL); - Criterion platform2Crit = - new Criterion().setField("platform").setValue(hivePlatform).setCondition(Condition.EQUAL); + Criterion platform1Crit = buildCriterion("platform", Condition.EQUAL, kafkaPlatform); + + Criterion platform2Crit = buildCriterion("platform", Condition.EQUAL, hivePlatform); + CriterionArray critArr = new CriterionArray(ImmutableList.of(platform1Crit)); conCritArr.add(new ConjunctiveCriterion().setAnd(critArr)); critArr = new CriterionArray(ImmutableList.of(platform2Crit)); conCritArr.add(new ConjunctiveCriterion().setAnd(critArr)); - Criterion originCrit = - new Criterion() - .setField("origin") - .setValue(FabricType.PROD.name()) - .setCondition(Condition.EQUAL); + Criterion originCrit = buildCriterion("origin", Condition.EQUAL, FabricType.PROD.name()); conCritArr.add( new ConjunctiveCriterion().setAnd(new CriterionArray(ImmutableList.of(originCrit)))); diff --git a/metadata-io/src/test/java/com/linkedin/metadata/search/SearchServiceTestBase.java b/metadata-io/src/test/java/com/linkedin/metadata/search/SearchServiceTestBase.java index 45bc8548706bb..ba83a381916c2 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/search/SearchServiceTestBase.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/search/SearchServiceTestBase.java @@ -1,6 +1,7 @@ package com.linkedin.metadata.search; import static com.linkedin.metadata.Constants.ELASTICSEARCH_IMPLEMENTATION_ELASTICSEARCH; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static io.datahubproject.test.search.SearchTestUtils.syncAfterWrite; import static org.testng.Assert.assertEquals; @@ -11,7 +12,6 @@ import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.TestEntityUrn; import com.linkedin.common.urn.Urn; -import com.linkedin.data.template.StringArray; import com.linkedin.metadata.config.cache.EntityDocCountCacheConfiguration; import com.linkedin.metadata.config.search.SearchConfiguration; import com.linkedin.metadata.config.search.custom.CustomSearchConfiguration; @@ -241,19 +241,9 @@ public void testSearchService() throws Exception { @Test public void testAdvancedSearchOr() throws Exception { - final Criterion filterCriterion = - new Criterion() - .setField("platform") - .setCondition(Condition.EQUAL) - .setValue("hive") - .setValues(new StringArray(ImmutableList.of("hive"))); - - final Criterion subtypeCriterion = - new Criterion() - .setField("subtypes") - .setCondition(Condition.EQUAL) - .setValue("") - .setValues(new StringArray(ImmutableList.of("view"))); + final Criterion filterCriterion = buildCriterion("platform", Condition.EQUAL, "hive"); + + final Criterion subtypeCriterion = buildCriterion("subtypes", Condition.EQUAL, "view"); final Filter filterWithCondition = new Filter() @@ -329,19 +319,9 @@ public void testAdvancedSearchOr() throws Exception { @Test public void testAdvancedSearchSoftDelete() throws Exception { - final Criterion filterCriterion = - new Criterion() - .setField("platform") - .setCondition(Condition.EQUAL) - .setValue("hive") - .setValues(new StringArray(ImmutableList.of("hive"))); - - final Criterion removedCriterion = - new Criterion() - .setField("removed") - .setCondition(Condition.EQUAL) - .setValue("") - .setValues(new StringArray(ImmutableList.of("true"))); + final Criterion filterCriterion = buildCriterion("platform", Condition.EQUAL, "hive"); + + final Criterion removedCriterion = buildCriterion("removed", Condition.EQUAL, "true"); final Filter filterWithCondition = new Filter() @@ -419,13 +399,7 @@ public void testAdvancedSearchSoftDelete() throws Exception { @Test public void testAdvancedSearchNegated() throws Exception { - final Criterion filterCriterion = - new Criterion() - .setField("platform") - .setCondition(Condition.EQUAL) - .setValue("hive") - .setNegated(true) - .setValues(new StringArray(ImmutableList.of("hive"))); + final Criterion filterCriterion = buildCriterion("platform", Condition.EQUAL, true, "hive"); final Filter filterWithCondition = new Filter() diff --git a/metadata-io/src/test/java/com/linkedin/metadata/search/fixtures/GoldenTestBase.java b/metadata-io/src/test/java/com/linkedin/metadata/search/fixtures/GoldenTestBase.java index f53088bdffc90..1ebcc03eb690b 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/search/fixtures/GoldenTestBase.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/search/fixtures/GoldenTestBase.java @@ -1,18 +1,18 @@ package com.linkedin.metadata.search.fixtures; import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static io.datahubproject.test.search.SearchTestUtils.searchAcrossEntities; import static org.testng.Assert.*; import static org.testng.AssertJUnit.assertNotNull; import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; -import com.linkedin.data.template.StringArray; import com.linkedin.datahub.graphql.generated.EntityType; import com.linkedin.datahub.graphql.types.entitytype.EntityTypeMapper; +import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.search.MatchedFieldArray; @@ -205,10 +205,7 @@ public void testFilterOnCountField() { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("rowCount") - .setValue("") - .setValues(new StringArray(ImmutableList.of("68")))))))); + buildCriterion("rowCount", Condition.EQUAL, "68")))))); SearchResult searchResult = SearchTestUtils.facetAcrossEntities( getOperationContext(), diff --git a/metadata-io/src/test/java/com/linkedin/metadata/search/fixtures/SampleDataFixtureTestBase.java b/metadata-io/src/test/java/com/linkedin/metadata/search/fixtures/SampleDataFixtureTestBase.java index 6a48dc19b029a..8cb0678180ccb 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/search/fixtures/SampleDataFixtureTestBase.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/search/fixtures/SampleDataFixtureTestBase.java @@ -3,6 +3,7 @@ import static com.linkedin.metadata.Constants.DATASET_ENTITY_NAME; import static com.linkedin.metadata.Constants.DATA_JOB_ENTITY_NAME; import static com.linkedin.metadata.search.elasticsearch.query.request.SearchQueryBuilder.STRUCTURED_QUERY_PREFIX; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static com.linkedin.metadata.utils.SearchUtil.AGGREGATION_SEPARATOR_CHAR; import static io.datahubproject.test.search.SearchTestUtils.*; import static org.testng.Assert.assertEquals; @@ -14,7 +15,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.linkedin.common.urn.Urn; -import com.linkedin.data.template.StringArray; import com.linkedin.datahub.graphql.generated.AutoCompleteResults; import com.linkedin.datahub.graphql.types.chart.ChartType; import com.linkedin.datahub.graphql.types.container.ContainerType; @@ -1464,10 +1464,7 @@ public void testPlatformTest() { Filter filter = new Filter(); ArrayList criteria = new ArrayList<>(); Criterion hasPlatformCriterion = - new Criterion() - .setField(fieldName) - .setCondition(Condition.EQUAL) - .setValue(testPlatform); + buildCriterion(fieldName, Condition.EQUAL, testPlatform); criteria.add(hasPlatformCriterion); filter.setOr( new ConjunctiveCriterionArray( @@ -2000,10 +1997,7 @@ public void testFilterOnHasValuesField() { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("hasOwners") - .setValue("") - .setValues(new StringArray(ImmutableList.of("true")))))))); + buildCriterion("hasOwners", Condition.EQUAL, "true")))))); SearchResult searchResult = searchAcrossEntities( getOperationContext(), @@ -2025,10 +2019,7 @@ public void testFilterOnNumValuesField() { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("numInputDatasets") - .setValue("") - .setValues(new StringArray(ImmutableList.of("1")))))))); + buildCriterion("numInputDatasets", Condition.EQUAL, "1")))))); SearchResult searchResult = searchAcrossEntities( getOperationContext(), diff --git a/metadata-io/src/test/java/com/linkedin/metadata/search/query/SearchDAOTestBase.java b/metadata-io/src/test/java/com/linkedin/metadata/search/query/SearchDAOTestBase.java index e0258f0593339..eafe5c7b5c310 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/search/query/SearchDAOTestBase.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/search/query/SearchDAOTestBase.java @@ -1,6 +1,7 @@ package com.linkedin.metadata.search.query; import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static com.linkedin.metadata.utils.SearchUtil.AGGREGATION_SEPARATOR_CHAR; import static com.linkedin.metadata.utils.SearchUtil.ES_INDEX_FIELD; import static org.testng.Assert.assertEquals; @@ -9,9 +10,7 @@ import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; -import com.google.common.collect.ImmutableList; import com.linkedin.data.template.LongMap; -import com.linkedin.data.template.StringArray; import com.linkedin.metadata.config.search.SearchConfiguration; import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; @@ -51,12 +50,7 @@ public abstract class SearchDAOTestBase extends AbstractTestNGSpringContextTests @Test public void testTransformFilterForEntitiesNoChange() { Criterion c = - new Criterion() - .setValue("urn:li:tag:abc") - .setValues(new StringArray(ImmutableList.of("urn:li:tag:abc", "urn:li:tag:def"))) - .setNegated(false) - .setCondition(Condition.EQUAL) - .setField("tags.keyword"); + buildCriterion("tags.keyword", Condition.EQUAL, "urn:ki:tag:abc", "urn:li:tag:def"); Filter f = new Filter() @@ -82,13 +76,7 @@ public void testTransformFilterForEntitiesNullFilter() { @Test public void testTransformFilterForEntitiesWithChanges() { - Criterion c = - new Criterion() - .setValue("dataset") - .setValues(new StringArray(ImmutableList.of("dataset"))) - .setNegated(false) - .setCondition(Condition.EQUAL) - .setField("_entityType"); + Criterion c = buildCriterion("_entityType", Condition.EQUAL, "dataset"); Filter f = new Filter() @@ -109,12 +97,7 @@ public void testTransformFilterForEntitiesWithChanges() { assertNotEquals(originalF, transformedFilter); Criterion expectedNewCriterion = - new Criterion() - .setValue("smpldat_datasetindex_v2") - .setValues(new StringArray(ImmutableList.of("smpldat_datasetindex_v2"))) - .setNegated(false) - .setCondition(Condition.EQUAL) - .setField(ES_INDEX_FIELD); + buildCriterion(ES_INDEX_FIELD, Condition.EQUAL, "smpldat_datasetindex_v2"); Filter expectedNewFilter = new Filter() @@ -128,13 +111,7 @@ public void testTransformFilterForEntitiesWithChanges() { @Test public void testTransformFilterForEntitiesWithUnderscore() { - Criterion c = - new Criterion() - .setValue("data_job") - .setValues(new StringArray(ImmutableList.of("data_job"))) - .setNegated(false) - .setCondition(Condition.EQUAL) - .setField("_entityType"); + Criterion c = buildCriterion("_entityType", Condition.EQUAL, "data_job"); Filter f = new Filter() @@ -155,12 +132,7 @@ public void testTransformFilterForEntitiesWithUnderscore() { assertNotEquals(originalF, transformedFilter); Criterion expectedNewCriterion = - new Criterion() - .setValue("smpldat_datajobindex_v2") - .setValues(new StringArray(ImmutableList.of("smpldat_datajobindex_v2"))) - .setNegated(false) - .setCondition(Condition.EQUAL) - .setField(ES_INDEX_FIELD); + buildCriterion(ES_INDEX_FIELD, Condition.EQUAL, "smpldat_datajobindex_v2"); Filter expectedNewFilter = new Filter() @@ -174,20 +146,10 @@ public void testTransformFilterForEntitiesWithUnderscore() { @Test public void testTransformFilterForEntitiesWithSomeChanges() { - Criterion criterionChanged = - new Criterion() - .setValue("dataset") - .setValues(new StringArray(ImmutableList.of("dataset"))) - .setNegated(false) - .setCondition(Condition.EQUAL) - .setField("_entityType"); + Criterion criterionChanged = buildCriterion("_entityType", Condition.EQUAL, "dataset"); + Criterion criterionUnchanged = - new Criterion() - .setValue("urn:li:tag:abc") - .setValues(new StringArray(ImmutableList.of("urn:li:tag:abc", "urn:li:tag:def"))) - .setNegated(false) - .setCondition(Condition.EQUAL) - .setField("tags.keyword"); + buildCriterion("tags.keyword", Condition.EQUAL, "urn:li:tag:abc", "urn:li:tag:def"); Filter f = new Filter() @@ -209,12 +171,7 @@ public void testTransformFilterForEntitiesWithSomeChanges() { assertNotEquals(originalF, transformedFilter); Criterion expectedNewCriterion = - new Criterion() - .setValue("smpldat_datasetindex_v2") - .setValues(new StringArray(ImmutableList.of("smpldat_datasetindex_v2"))) - .setNegated(false) - .setCondition(Condition.EQUAL) - .setField(ES_INDEX_FIELD); + buildCriterion(ES_INDEX_FIELD, Condition.EQUAL, "smpldat_datasetindex_v2"); Filter expectedNewFilter = new Filter() diff --git a/metadata-io/src/test/java/com/linkedin/metadata/search/query/filter/ContainerExpansionRewriterTest.java b/metadata-io/src/test/java/com/linkedin/metadata/search/query/filter/ContainerExpansionRewriterTest.java index 2c49567d49ea7..f91e3a28f1bd6 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/search/query/filter/ContainerExpansionRewriterTest.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/search/query/filter/ContainerExpansionRewriterTest.java @@ -2,8 +2,8 @@ import static com.linkedin.metadata.Constants.CONTAINER_ENTITY_NAME; import static com.linkedin.metadata.search.utils.QueryUtils.EMPTY_FILTER; -import static com.linkedin.metadata.search.utils.QueryUtils.newCriterion; import static com.linkedin.metadata.search.utils.QueryUtils.newRelationshipFilter; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; @@ -114,7 +114,9 @@ public void testTermsQueryRewrite() { // Setup nested when(mockGraphRetriever.scrollRelatedEntities( eq(List.of(CONTAINER_ENTITY_NAME)), - eq(QueryUtils.newDisjunctiveFilter(newCriterion("urn", List.of(childUrn)))), + eq( + QueryUtils.newDisjunctiveFilter( + buildCriterion("urn", Condition.EQUAL, List.of(childUrn)))), eq(List.of(CONTAINER_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), @@ -161,7 +163,9 @@ public void testTermsQueryRewritePagination() { // Page 1 when(mockGraphRetriever.scrollRelatedEntities( eq(List.of(CONTAINER_ENTITY_NAME)), - eq(QueryUtils.newDisjunctiveFilter(newCriterion("urn", List.of(childUrn)))), + eq( + QueryUtils.newDisjunctiveFilter( + buildCriterion("urn", Condition.EQUAL, List.of(childUrn)))), eq(List.of(CONTAINER_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), @@ -183,7 +187,9 @@ public void testTermsQueryRewritePagination() { // Page 2 when(mockGraphRetriever.scrollRelatedEntities( eq(List.of(CONTAINER_ENTITY_NAME)), - eq(QueryUtils.newDisjunctiveFilter(newCriterion("urn", List.of(childUrn)))), + eq( + QueryUtils.newDisjunctiveFilter( + buildCriterion("urn", Condition.EQUAL, List.of(childUrn)))), eq(List.of(CONTAINER_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), @@ -206,7 +212,7 @@ public void testTermsQueryRewritePagination() { eq(List.of(CONTAINER_ENTITY_NAME)), eq( QueryUtils.newDisjunctiveFilter( - newCriterion("urn", List.of(parentUrn2, parentUrn)))), + buildCriterion("urn", Condition.EQUAL, List.of(parentUrn2, parentUrn)))), eq(List.of(CONTAINER_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), @@ -233,7 +239,7 @@ public void testTermsQueryRewritePagination() { eq(List.of(CONTAINER_ENTITY_NAME)), eq( QueryUtils.newDisjunctiveFilter( - newCriterion("urn", List.of(parentUrn2, parentUrn)))), + buildCriterion("urn", Condition.EQUAL, List.of(parentUrn2, parentUrn)))), eq(List.of(CONTAINER_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), @@ -284,7 +290,9 @@ public void testNestedBoolQueryRewrite() { // Setup nested container when(mockGraphRetriever.scrollRelatedEntities( eq(List.of(CONTAINER_ENTITY_NAME)), - eq(QueryUtils.newDisjunctiveFilter(newCriterion("urn", List.of(childUrn)))), + eq( + QueryUtils.newDisjunctiveFilter( + buildCriterion("urn", Condition.EQUAL, List.of(childUrn)))), eq(List.of(CONTAINER_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), diff --git a/metadata-io/src/test/java/com/linkedin/metadata/search/query/filter/DomainExpansionRewriterTest.java b/metadata-io/src/test/java/com/linkedin/metadata/search/query/filter/DomainExpansionRewriterTest.java index 8ee7dd3718ca9..76e650f405456 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/search/query/filter/DomainExpansionRewriterTest.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/search/query/filter/DomainExpansionRewriterTest.java @@ -2,8 +2,8 @@ import static com.linkedin.metadata.Constants.DOMAIN_ENTITY_NAME; import static com.linkedin.metadata.search.utils.QueryUtils.EMPTY_FILTER; -import static com.linkedin.metadata.search.utils.QueryUtils.newCriterion; import static com.linkedin.metadata.search.utils.QueryUtils.newRelationshipFilter; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; @@ -114,7 +114,9 @@ public void testTermsQueryRewrite() { // Setup nested when(mockGraphRetriever.scrollRelatedEntities( eq(List.of(DOMAIN_ENTITY_NAME)), - eq(QueryUtils.newDisjunctiveFilter(newCriterion("urn", List.of(parentUrn)))), + eq( + QueryUtils.newDisjunctiveFilter( + buildCriterion("urn", Condition.EQUAL, List.of(parentUrn)))), eq(List.of(DOMAIN_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), @@ -161,7 +163,9 @@ public void testTermsQueryRewritePagination() { // Page 1 when(mockGraphRetriever.scrollRelatedEntities( eq(List.of(DOMAIN_ENTITY_NAME)), - eq(QueryUtils.newDisjunctiveFilter(newCriterion("urn", List.of(grandParentUrn)))), + eq( + QueryUtils.newDisjunctiveFilter( + buildCriterion("urn", Condition.EQUAL, List.of(grandParentUrn)))), eq(List.of(DOMAIN_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), @@ -187,7 +191,9 @@ public void testTermsQueryRewritePagination() { // Page 2 when(mockGraphRetriever.scrollRelatedEntities( eq(List.of(DOMAIN_ENTITY_NAME)), - eq(QueryUtils.newDisjunctiveFilter(newCriterion("urn", List.of(grandParentUrn)))), + eq( + QueryUtils.newDisjunctiveFilter( + buildCriterion("urn", Condition.EQUAL, List.of(grandParentUrn)))), eq(List.of(DOMAIN_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), @@ -214,7 +220,7 @@ public void testTermsQueryRewritePagination() { eq(List.of(DOMAIN_ENTITY_NAME)), eq( QueryUtils.newDisjunctiveFilter( - newCriterion("urn", List.of(parentUrn2, parentUrn)))), + buildCriterion("urn", Condition.EQUAL, List.of(parentUrn2, parentUrn)))), eq(List.of(DOMAIN_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), @@ -237,7 +243,7 @@ public void testTermsQueryRewritePagination() { eq(List.of(DOMAIN_ENTITY_NAME)), eq( QueryUtils.newDisjunctiveFilter( - newCriterion("urn", List.of(parentUrn2, parentUrn)))), + buildCriterion("urn", Condition.EQUAL, List.of(parentUrn2, parentUrn)))), eq(List.of(DOMAIN_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), @@ -285,7 +291,9 @@ public void testNestedBoolQueryRewrite() { // Setup nested when(mockGraphRetriever.scrollRelatedEntities( eq(List.of(DOMAIN_ENTITY_NAME)), - eq(QueryUtils.newDisjunctiveFilter(newCriterion("urn", List.of(parentUrn)))), + eq( + QueryUtils.newDisjunctiveFilter( + buildCriterion("urn", Condition.EQUAL, List.of(parentUrn)))), eq(List.of(DOMAIN_ENTITY_NAME)), eq(EMPTY_FILTER), eq(List.of("IsPartOf")), diff --git a/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/SearchRequestHandlerTest.java b/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/SearchRequestHandlerTest.java index aec86c887e4df..a90c0291f53b8 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/SearchRequestHandlerTest.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/search/query/request/SearchRequestHandlerTest.java @@ -1,5 +1,8 @@ package com.linkedin.metadata.search.query.request; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; +import static com.linkedin.metadata.utils.CriterionUtils.buildExistsCriterion; +import static com.linkedin.metadata.utils.CriterionUtils.buildIsNullCriterion; import static com.linkedin.metadata.utils.SearchUtil.*; import static org.mockito.Mockito.mock; import static org.testng.Assert.*; @@ -36,7 +39,6 @@ import org.opensearch.index.query.BoolQueryBuilder; import org.opensearch.index.query.ExistsQueryBuilder; import org.opensearch.index.query.MatchQueryBuilder; -import org.opensearch.index.query.MultiMatchQueryBuilder; import org.opensearch.index.query.TermsQueryBuilder; import org.opensearch.search.aggregations.AggregationBuilder; import org.opensearch.search.aggregations.AggregationBuilders; @@ -368,8 +370,7 @@ public void testFilteredSearch() { private BoolQueryBuilder constructFilterQuery( SearchRequestHandler requestHandler, boolean scroll) { - final Criterion filterCriterion = - new Criterion().setField("keyword").setCondition(Condition.EQUAL).setValue("some value"); + final Criterion filterCriterion = buildCriterion("keyword", Condition.EQUAL, "some value"); final Filter filterWithoutRemovedCondition = new Filter() @@ -435,14 +436,9 @@ private void testFilterQuery(BoolQueryBuilder testQuery) { private BoolQueryBuilder constructRemovedQuery( SearchRequestHandler requestHandler, boolean scroll) { - final Criterion filterCriterion = - new Criterion().setField("keyword").setCondition(Condition.EQUAL).setValue("some value"); + final Criterion filterCriterion = buildCriterion("keyword", Condition.EQUAL, "some value"); - final Criterion removedCriterion = - new Criterion() - .setField("removed") - .setCondition(Condition.EQUAL) - .setValue(String.valueOf(false)); + final Criterion removedCriterion = buildCriterion("removed", Condition.EQUAL, "false"); final Filter filterWithRemovedCondition = new Filter() @@ -515,12 +511,7 @@ private void testRemovedQuery(BoolQueryBuilder queryWithRemoved) { // field EQUAL [value1, value2, ...] @Test public void testFilterFieldTagsByValues() { - final Criterion filterCriterion = - new Criterion() - .setField("fieldTags") - .setCondition(Condition.EQUAL) - .setValue("v1") - .setValues(new StringArray("v1", "v2")); + final Criterion filterCriterion = buildCriterion("fieldTags", Condition.EQUAL, "v1", "v2"); final BoolQueryBuilder testQuery = getQuery(filterCriterion); @@ -562,88 +553,11 @@ public void testFilterFieldTagsByValues() { } } - // For fields that are one of EDITABLE_FIELD_TO_QUERY_PAIRS, we want to make sure - // a filter that has a single value will result in one filter for each field in the - // pair of fields - @Test - public void testFilterFieldTagsByValue() { - final Criterion filterCriterion = - new Criterion().setField("fieldTags").setCondition(Condition.EQUAL).setValue("v1"); - - final BoolQueryBuilder testQuery = getQuery(filterCriterion); - - // bool -> must -> [bool] -> should -> [bool] -> must -> [bool] -> should -> [bool] -> should -> - // [match] - List matchQueryBuilders = - testQuery.filter().stream() - .filter(or -> or instanceof BoolQueryBuilder) - .flatMap(or -> ((BoolQueryBuilder) or).should().stream()) - .filter(should -> should instanceof BoolQueryBuilder) - .flatMap(should -> ((BoolQueryBuilder) should).filter().stream()) - .filter(must -> must instanceof BoolQueryBuilder) - .flatMap(must -> ((BoolQueryBuilder) must).should().stream()) - .filter(should -> should instanceof BoolQueryBuilder) - .flatMap(should -> ((BoolQueryBuilder) should).should().stream()) - .filter(should -> should instanceof MultiMatchQueryBuilder) - .map(should -> (MultiMatchQueryBuilder) should) - .collect(Collectors.toList()); - - assertTrue(matchQueryBuilders.size() == 2, "Expected to find two match queries"); - Map matchMap = new HashMap<>(); - matchQueryBuilders.forEach( - matchQueryBuilder -> { - Set fields = matchQueryBuilder.fields().keySet(); - assertTrue(matchQueryBuilder.value() instanceof String); - fields.forEach(field -> matchMap.put(field, (String) matchQueryBuilder.value())); - }); - - assertTrue(matchMap.containsKey("fieldTags.keyword")); - assertTrue(matchMap.containsKey("editedFieldTags.keyword")); - for (String value : matchMap.values()) { - assertTrue(value.equals("v1")); - } - } - - // Test fields not in EDITABLE_FIELD_TO_QUERY_PAIRS with a single value - @Test - public void testFilterPlatformByValue() { - final Criterion filterCriterion = - new Criterion().setField("platform").setCondition(Condition.EQUAL).setValue("mysql"); - - final BoolQueryBuilder testQuery = getQuery(filterCriterion); - - // bool -> filter -> [bool] -> should -> [bool] -> filter -> [bool] -> should -> [match] - List matchQueryBuilders = - testQuery.filter().stream() - .filter(or -> or instanceof BoolQueryBuilder) - .flatMap(or -> ((BoolQueryBuilder) or).should().stream()) - .filter(should -> should instanceof BoolQueryBuilder) - .flatMap(should -> ((BoolQueryBuilder) should).filter().stream()) - .filter(must -> must instanceof BoolQueryBuilder) - .flatMap(must -> ((BoolQueryBuilder) must).should().stream()) - .filter(should -> should instanceof MultiMatchQueryBuilder) - .map(should -> (MultiMatchQueryBuilder) should) - .collect(Collectors.toList()); - - assertTrue(matchQueryBuilders.size() == 1, "Expected to find one match query"); - MultiMatchQueryBuilder matchQueryBuilder = matchQueryBuilders.get(0); - assertEquals( - matchQueryBuilder.fields(), - Map.of( - "platform", 1.0f, - "platform.*", 1.0f)); - assertEquals(matchQueryBuilder.value(), "mysql"); - } - // Test fields not in EDITABLE_FIELD_TO_QUERY_PAIRS with a list of values @Test public void testFilterPlatformByValues() { final Criterion filterCriterion = - new Criterion() - .setField("platform") - .setCondition(Condition.EQUAL) - .setValue("mysql") - .setValues(new StringArray("mysql", "bigquery")); + buildCriterion("platform", Condition.EQUAL, "mysql", "bigquery"); final BoolQueryBuilder testQuery = getQuery(filterCriterion); @@ -678,13 +592,9 @@ public void testFilterPlatformByValues() { @Test public void testBrowsePathQueryFilter() { // Condition: has `browsePaths` AND does NOT have `browsePathV2` - Criterion missingBrowsePathV2 = new Criterion(); - missingBrowsePathV2.setCondition(Condition.IS_NULL); - missingBrowsePathV2.setField("browsePathV2"); + Criterion missingBrowsePathV2 = buildIsNullCriterion("browsePathV2"); // Excludes entities without browsePaths - Criterion hasBrowsePathV1 = new Criterion(); - hasBrowsePathV1.setCondition(Condition.EXISTS); - hasBrowsePathV1.setField("browsePaths"); + Criterion hasBrowsePathV1 = buildExistsCriterion("browsePaths"); CriterionArray criterionArray = new CriterionArray(); criterionArray.add(missingBrowsePathV2); diff --git a/metadata-io/src/test/java/com/linkedin/metadata/search/utils/ESUtilsTest.java b/metadata-io/src/test/java/com/linkedin/metadata/search/utils/ESUtilsTest.java index d171ef3cc7b2e..c5f9986284627 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/search/utils/ESUtilsTest.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/search/utils/ESUtilsTest.java @@ -2,15 +2,16 @@ import static com.linkedin.metadata.Constants.DATA_TYPE_URN_PREFIX; import static com.linkedin.metadata.Constants.STRUCTURED_PROPERTY_DEFINITION_ASPECT_NAME; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; +import static com.linkedin.metadata.utils.CriterionUtils.buildExistsCriterion; +import static com.linkedin.metadata.utils.CriterionUtils.buildIsNullCriterion; import static org.mockito.ArgumentMatchers.anySet; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; import com.linkedin.data.template.SetMode; -import com.linkedin.data.template.StringArray; import com.linkedin.entity.Aspect; import com.linkedin.metadata.aspect.AspectRetriever; import com.linkedin.metadata.query.filter.Condition; @@ -81,11 +82,7 @@ public static void setup() throws RemoteInvocationException, URISyntaxException @Test public void testGetQueryBuilderFromCriterionEqualsValues() { - final Criterion singleValueCriterion = - new Criterion() - .setField("myTestField") - .setCondition(Condition.EQUAL) - .setValues(new StringArray(ImmutableList.of("value1"))); + final Criterion singleValueCriterion = buildCriterion("myTestField", Condition.EQUAL, "value1"); QueryBuilder result = ESUtils.getQueryBuilderFromCriterion( @@ -107,10 +104,7 @@ public void testGetQueryBuilderFromCriterionEqualsValues() { Assert.assertEquals(result.toString(), expected); final Criterion multiValueCriterion = - new Criterion() - .setField("myTestField") - .setCondition(Condition.EQUAL) - .setValues(new StringArray(ImmutableList.of("value1", "value2"))); + buildCriterion("myTestField", Condition.EQUAL, "value1", "value2"); result = ESUtils.getQueryBuilderFromCriterion( @@ -133,10 +127,7 @@ public void testGetQueryBuilderFromCriterionEqualsValues() { Assert.assertEquals(result.toString(), expected); final Criterion timeseriesField = - new Criterion() - .setField("myTestField") - .setCondition(Condition.EQUAL) - .setValues(new StringArray(ImmutableList.of("value1", "value2"))); + buildCriterion("myTestField", Condition.EQUAL, "value1", "value2"); result = ESUtils.getQueryBuilderFromCriterion( @@ -162,7 +153,7 @@ public void testGetQueryBuilderFromCriterionEqualsValues() { @Test public void testGetQueryBuilderFromCriterionContain() { final Criterion singleValueCriterion = - new Criterion().setField("myTestField").setCondition(Condition.CONTAIN).setValue("value1"); + buildCriterion("myTestField", Condition.CONTAIN, "value1"); QueryBuilder result = ESUtils.getQueryBuilderFromCriterion( @@ -174,23 +165,28 @@ public void testGetQueryBuilderFromCriterionContain() { String expected = "{\n" - + " \"wildcard\" : {\n" - + " \"myTestField.keyword\" : {\n" - + " \"wildcard\" : \"*value1*\",\n" - + " \"case_insensitive\" : true,\n" - + " \"boost\" : 1.0,\n" - + " \"_name\" : \"myTestField\"\n" - + " }\n" + + " \"bool\" : {\n" + + " \"should\" : [\n" + + " {\n" + + " \"wildcard\" : {\n" + + " \"myTestField.keyword\" : {\n" + + " \"wildcard\" : \"*value1*\",\n" + + " \"case_insensitive\" : true,\n" + + " \"boost\" : 1.0,\n" + + " \"_name\" : \"myTestField\"\n" + + " }\n" + + " }\n" + + " }\n" + + " ],\n" + + " \"adjust_pure_negative\" : true,\n" + + " \"boost\" : 1.0\n" + " }\n" + "}"; Assert.assertEquals(result.toString(), expected); final Criterion multiValueCriterion = - new Criterion() - .setField("myTestField") - .setCondition(Condition.CONTAIN) - .setValues(new StringArray(ImmutableList.of("value1", "value2"))); + buildCriterion("myTestField", Condition.CONTAIN, "value1", "value2"); result = ESUtils.getQueryBuilderFromCriterion( @@ -236,10 +232,7 @@ public void testGetQueryBuilderFromCriterionContain() { @Test public void testWildcardQueryBuilderFromCriterionWhenStartsWith() { final Criterion singleValueCriterion = - new Criterion() - .setField("myTestField") - .setCondition(Condition.START_WITH) - .setValue("value1"); + buildCriterion("myTestField", Condition.START_WITH, "value1"); QueryBuilder result = ESUtils.getQueryBuilderFromCriterion( @@ -251,23 +244,28 @@ public void testWildcardQueryBuilderFromCriterionWhenStartsWith() { String expected = "{\n" - + " \"wildcard\" : {\n" - + " \"myTestField.keyword\" : {\n" - + " \"wildcard\" : \"value1*\",\n" - + " \"case_insensitive\" : true,\n" - + " \"boost\" : 1.0,\n" - + " \"_name\" : \"myTestField\"\n" - + " }\n" + + " \"bool\" : {\n" + + " \"should\" : [\n" + + " {\n" + + " \"wildcard\" : {\n" + + " \"myTestField.keyword\" : {\n" + + " \"wildcard\" : \"value1*\",\n" + + " \"case_insensitive\" : true,\n" + + " \"boost\" : 1.0,\n" + + " \"_name\" : \"myTestField\"\n" + + " }\n" + + " }\n" + + " }\n" + + " ],\n" + + " \"adjust_pure_negative\" : true,\n" + + " \"boost\" : 1.0\n" + " }\n" + "}"; Assert.assertEquals(result.toString(), expected); final Criterion multiValueCriterion = - new Criterion() - .setField("myTestField") - .setCondition(Condition.START_WITH) - .setValues(new StringArray(ImmutableList.of("value1", "value2"))); + buildCriterion("myTestField", Condition.START_WITH, "value1", "value2"); result = ESUtils.getQueryBuilderFromCriterion( @@ -313,7 +311,7 @@ public void testWildcardQueryBuilderFromCriterionWhenStartsWith() { @Test public void testWildcardQueryBuilderFromCriterionWhenEndsWith() { final Criterion singleValueCriterion = - new Criterion().setField("myTestField").setCondition(Condition.END_WITH).setValue("value1"); + buildCriterion("myTestField", Condition.END_WITH, "value1"); QueryBuilder result = ESUtils.getQueryBuilderFromCriterion( @@ -325,22 +323,27 @@ public void testWildcardQueryBuilderFromCriterionWhenEndsWith() { String expected = "{\n" - + " \"wildcard\" : {\n" - + " \"myTestField.keyword\" : {\n" - + " \"wildcard\" : \"*value1\",\n" - + " \"case_insensitive\" : true,\n" - + " \"boost\" : 1.0,\n" - + " \"_name\" : \"myTestField\"\n" - + " }\n" + + " \"bool\" : {\n" + + " \"should\" : [\n" + + " {\n" + + " \"wildcard\" : {\n" + + " \"myTestField.keyword\" : {\n" + + " \"wildcard\" : \"*value1\",\n" + + " \"case_insensitive\" : true,\n" + + " \"boost\" : 1.0,\n" + + " \"_name\" : \"myTestField\"\n" + + " }\n" + + " }\n" + + " }\n" + + " ],\n" + + " \"adjust_pure_negative\" : true,\n" + + " \"boost\" : 1.0\n" + " }\n" + "}"; Assert.assertEquals(result.toString(), expected); final Criterion multiValueCriterion = - new Criterion() - .setField("myTestField") - .setCondition(Condition.END_WITH) - .setValues(new StringArray(ImmutableList.of("value1", "value2"))); + buildCriterion("myTestField", Condition.END_WITH, "value1", "value2"); result = ESUtils.getQueryBuilderFromCriterion( @@ -385,8 +388,7 @@ public void testWildcardQueryBuilderFromCriterionWhenEndsWith() { @Test public void testGetQueryBuilderFromCriterionExists() { - final Criterion singleValueCriterion = - new Criterion().setField("myTestField").setCondition(Condition.EXISTS); + final Criterion singleValueCriterion = buildExistsCriterion("myTestField"); QueryBuilder result = ESUtils.getQueryBuilderFromCriterion( @@ -414,8 +416,7 @@ public void testGetQueryBuilderFromCriterionExists() { Assert.assertEquals(result.toString(), expected); // No diff in the timeseries field case for this condition. - final Criterion timeseriesField = - new Criterion().setField("myTestField").setCondition(Condition.EXISTS); + final Criterion timeseriesField = buildExistsCriterion("myTestField"); result = ESUtils.getQueryBuilderFromCriterion( @@ -445,8 +446,7 @@ public void testGetQueryBuilderFromCriterionExists() { @Test public void testGetQueryBuilderFromCriterionIsNull() { - final Criterion singleValueCriterion = - new Criterion().setField("myTestField").setCondition(Condition.IS_NULL); + final Criterion singleValueCriterion = buildIsNullCriterion("myTestField"); QueryBuilder result = ESUtils.getQueryBuilderFromCriterion( @@ -474,8 +474,7 @@ public void testGetQueryBuilderFromCriterionIsNull() { Assert.assertEquals(result.toString(), expected); // No diff in the timeseries case for this condition - final Criterion timeseriesField = - new Criterion().setField("myTestField").setCondition(Condition.IS_NULL); + final Criterion timeseriesField = buildIsNullCriterion("myTestField"); result = ESUtils.getQueryBuilderFromCriterion( @@ -507,11 +506,7 @@ public void testGetQueryBuilderFromCriterionIsNull() { public void testGetQueryBuilderFromCriterionFieldToExpand() { final Criterion singleValueCriterion = - new Criterion() - .setField(FIELD_TO_EXPAND) - .setCondition(Condition.EQUAL) - .setValue("") // Ignored - .setValues(new StringArray(ImmutableList.of("value1"))); + buildCriterion(FIELD_TO_EXPAND, Condition.EQUAL, "value1"); // Ensure that the query is expanded! QueryBuilder result = @@ -551,11 +546,7 @@ public void testGetQueryBuilderFromCriterionFieldToExpand() { Assert.assertEquals(result.toString(), expected); final Criterion timeseriesField = - new Criterion() - .setField(FIELD_TO_EXPAND) - .setCondition(Condition.EQUAL) - .setValue("") // Ignored - .setValues(new StringArray(ImmutableList.of("value1", "value2"))); + buildCriterion(FIELD_TO_EXPAND, Condition.EQUAL, "value1", "value2"); // Ensure that the query is expanded without keyword. result = @@ -601,10 +592,7 @@ public void testGetQueryBuilderFromCriterionFieldToExpand() { public void testGetQueryBuilderFromStructPropEqualsValue() { final Criterion singleValueCriterion = - new Criterion() - .setField("structuredProperties.ab.fgh.ten") - .setCondition(Condition.EQUAL) - .setValues(new StringArray(ImmutableList.of("value1"))); + buildCriterion("structuredProperties.ab.fgh.ten", Condition.EQUAL, "value1"); OperationContext opContext = mock(OperationContext.class); when(opContext.getAspectRetriever()).thenReturn(aspectRetriever); @@ -628,10 +616,7 @@ public void testGetQueryBuilderFromStructPropEqualsValue() { public void testGetQueryBuilderFromStructPropEqualsValueV1() { final Criterion singleValueCriterion = - new Criterion() - .setField("structuredProperties.ab.fgh.ten") - .setCondition(Condition.EQUAL) - .setValues(new StringArray(ImmutableList.of("value1"))); + buildCriterion("structuredProperties.ab.fgh.ten", Condition.EQUAL, "value1"); OperationContext opContextV1 = mock(OperationContext.class); when(opContextV1.getAspectRetriever()).thenReturn(aspectRetrieverV1); @@ -657,8 +642,7 @@ public void testGetQueryBuilderFromStructPropEqualsValueV1() { @Test public void testGetQueryBuilderFromStructPropExists() { - final Criterion singleValueCriterion = - new Criterion().setField("structuredProperties.ab.fgh.ten").setCondition(Condition.EXISTS); + final Criterion singleValueCriterion = buildExistsCriterion("structuredProperties.ab.fgh.ten"); OperationContext opContext = mock(OperationContext.class); when(opContext.getAspectRetriever()).thenReturn(aspectRetriever); @@ -684,8 +668,7 @@ public void testGetQueryBuilderFromStructPropExists() { Assert.assertEquals(result.toString(), expected); // No diff in the timeseries field case for this condition. - final Criterion timeseriesField = - new Criterion().setField("myTestField").setCondition(Condition.EXISTS); + final Criterion timeseriesField = buildExistsCriterion("myTestField"); result = ESUtils.getQueryBuilderFromCriterion( @@ -711,8 +694,7 @@ public void testGetQueryBuilderFromStructPropExists() { @Test public void testGetQueryBuilderFromStructPropExistsV1() { - final Criterion singleValueCriterion = - new Criterion().setField("structuredProperties.ab.fgh.ten").setCondition(Condition.EXISTS); + final Criterion singleValueCriterion = buildExistsCriterion("structuredProperties.ab.fgh.ten"); OperationContext opContextV1 = mock(OperationContext.class); when(opContextV1.getAspectRetriever()).thenReturn(aspectRetrieverV1); @@ -742,8 +724,7 @@ public void testGetQueryBuilderFromStructPropExistsV1() { Assert.assertEquals(result.toString(), expected); // No diff in the timeseries field case for this condition. - final Criterion timeseriesField = - new Criterion().setField("myTestField").setCondition(Condition.EXISTS); + final Criterion timeseriesField = buildCriterion("myTestField", Condition.EXISTS); result = ESUtils.getQueryBuilderFromCriterion( diff --git a/metadata-io/src/test/java/com/linkedin/metadata/structuredproperties/hooks/PropertyDefinitionDeleteSideEffectTest.java b/metadata-io/src/test/java/com/linkedin/metadata/structuredproperties/hooks/PropertyDefinitionDeleteSideEffectTest.java index ab205d0463c4c..b1b716c560481 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/structuredproperties/hooks/PropertyDefinitionDeleteSideEffectTest.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/structuredproperties/hooks/PropertyDefinitionDeleteSideEffectTest.java @@ -2,6 +2,7 @@ import static com.linkedin.metadata.Constants.STRUCTURED_PROPERTY_DEFINITION_ASPECT_NAME; import static com.linkedin.metadata.Constants.STRUCTURED_PROPERTY_KEY_ASPECT_NAME; +import static com.linkedin.metadata.utils.CriterionUtils.buildExistsCriterion; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; @@ -23,7 +24,6 @@ import com.linkedin.metadata.aspect.plugins.config.AspectPluginConfig; import com.linkedin.metadata.entity.SearchRetriever; import com.linkedin.metadata.models.registry.EntityRegistry; -import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; import com.linkedin.metadata.query.filter.Criterion; @@ -178,10 +178,9 @@ private static Filter expectedFilter() { final ConjunctiveCriterion conjunction = new ConjunctiveCriterion(); final CriterionArray andCriterion = new CriterionArray(); - final Criterion propertyExistsCriterion = new Criterion(); - propertyExistsCriterion.setField( - "structuredProperties._versioned.io_acryl_privacy_retentionTime.00000000000001.string"); - propertyExistsCriterion.setCondition(Condition.EXISTS); + final Criterion propertyExistsCriterion = + buildExistsCriterion( + "structuredProperties._versioned.io_acryl_privacy_retentionTime.00000000000001.string"); andCriterion.add(propertyExistsCriterion); conjunction.setAnd(andCriterion); diff --git a/metadata-io/src/test/java/com/linkedin/metadata/timeseries/search/TimeseriesAspectServiceTestBase.java b/metadata-io/src/test/java/com/linkedin/metadata/timeseries/search/TimeseriesAspectServiceTestBase.java index 15597132289b2..faf616b0fb3cf 100644 --- a/metadata-io/src/test/java/com/linkedin/metadata/timeseries/search/TimeseriesAspectServiceTestBase.java +++ b/metadata-io/src/test/java/com/linkedin/metadata/timeseries/search/TimeseriesAspectServiceTestBase.java @@ -2,6 +2,7 @@ import static com.linkedin.metadata.Constants.INGESTION_MAX_SERIALIZED_STRING_LENGTH; import static com.linkedin.metadata.Constants.MAX_JACKSON_STRING_SIZE; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static io.datahubproject.test.search.SearchTestUtils.syncAfterWrite; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -359,8 +360,7 @@ public void testGetAspectTimeseriesValuesAllSorted() { @Test(groups = "getAspectValues", dependsOnGroups = "upsert") public void testGetAspectTimeseriesValuesWithFilter() { Filter filter = new Filter(); - Criterion hasStatEqualsTwenty = - new Criterion().setField("stat").setCondition(Condition.EQUAL).setValue("20"); + Criterion hasStatEqualsTwenty = buildCriterion("stat", Condition.EQUAL, "20"); filter.setCriteria(new CriterionArray(hasStatEqualsTwenty)); List resultAspects = elasticSearchTimeseriesAspectService.getAspectValues( @@ -453,18 +453,15 @@ public void testGetAspectTimeseriesValueMissingUrn() { dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsLatestStatForDay1() { // Filter is only on the urn - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.START_WITH, TEST_URN.toString()); Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(startTime + 23 * TIME_INCREMENT)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 23 * TIME_INCREMENT)); Filter filter = QueryUtils.getFilterFromCriteria( @@ -511,20 +508,15 @@ public void testGetAggregatedStatsLatestStatForDay1() { dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsLatestStatForDay1WithValues() { // Filter is only on the urn - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValues(new StringArray(startTime.toString())) - .setValue(""); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValues(new StringArray(String.valueOf(startTime + 23 * TIME_INCREMENT))) - .setValue(""); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 23 * TIME_INCREMENT)); Filter filter = QueryUtils.getFilterFromCriteria( @@ -571,18 +563,15 @@ public void testGetAggregatedStatsLatestStatForDay1WithValues() { dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsLatestAComplexNestedRecordForDay1() { // Filter is only on the urn - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(startTime + 23 * TIME_INCREMENT)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 23 * TIME_INCREMENT)); Filter filter = QueryUtils.getFilterFromCriteria( @@ -635,18 +624,15 @@ public void testGetAggregatedStatsLatestAComplexNestedRecordForDay1() { dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsLatestStrArrayDay1() { // Filter is only on the urn - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(startTime + 23 * TIME_INCREMENT)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 23 * TIME_INCREMENT)); Filter filter = QueryUtils.getFilterFromCriteria( @@ -699,18 +685,15 @@ public void testGetAggregatedStatsLatestStrArrayDay1() { dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsLatestStatForTwoDays() { // Filter is only on the urn - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(startTime + 47 * TIME_INCREMENT)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 47 * TIME_INCREMENT)); Filter filter = QueryUtils.getFilterFromCriteria( @@ -760,18 +743,15 @@ public void testGetAggregatedStatsLatestStatForTwoDays() { groups = {"getAggregatedStats"}, dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsLatestStatForFirst10HoursOfDay1() { - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(startTime + 9 * TIME_INCREMENT)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 9 * TIME_INCREMENT)); Filter filter = QueryUtils.getFilterFromCriteria( @@ -818,23 +798,17 @@ public void testGetAggregatedStatsLatestStatForFirst10HoursOfDay1() { dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsLatestStatForCol1Day1() { Long lastEntryTimeStamp = startTime + 23 * TIME_INCREMENT; - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(lastEntryTimeStamp)); - Criterion hasCol1 = - new Criterion() - .setField("componentProfiles.key") - .setCondition(Condition.EQUAL) - .setValue("col1"); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(lastEntryTimeStamp)); + + Criterion hasCol1 = buildCriterion("componentProfiles.key", Condition.EQUAL, "col1"); Filter filter = QueryUtils.getFilterFromCriteria( @@ -895,18 +869,17 @@ public void testGetAggregatedStatsLatestStatForCol1Day1() { dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsLatestStatForAllColumnsDay1() { Long lastEntryTimeStamp = startTime + 23 * TIME_INCREMENT; - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); + Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); + Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(lastEntryTimeStamp)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(lastEntryTimeStamp)); Filter filter = QueryUtils.getFilterFromCriteria( @@ -977,18 +950,15 @@ public void testGetAggregatedStatsLatestStatForAllColumnsDay1() { groups = {"getAggregatedStats"}, dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsSumStatForFirst10HoursOfDay1() { - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(startTime + 9 * TIME_INCREMENT)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 9 * TIME_INCREMENT)); Filter filter = QueryUtils.getFilterFromCriteria( @@ -1033,23 +1003,19 @@ public void testGetAggregatedStatsSumStatForFirst10HoursOfDay1() { dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsSumStatForCol2Day1() { Long lastEntryTimeStamp = startTime + 23 * TIME_INCREMENT; - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); + Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); + Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(lastEntryTimeStamp)); - Criterion hasCol2 = - new Criterion() - .setField("componentProfiles.key") - .setCondition(Condition.EQUAL) - .setValue("col2"); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(lastEntryTimeStamp)); + + Criterion hasCol2 = buildCriterion("componentProfiles.key", Condition.EQUAL, "col2"); Filter filter = QueryUtils.getFilterFromCriteria( @@ -1103,18 +1069,15 @@ public void testGetAggregatedStatsSumStatForCol2Day1() { dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsCardinalityAggStrStatDay1() { // Filter is only on the urn - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(startTime + 23 * TIME_INCREMENT)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 23 * TIME_INCREMENT)); Filter filter = QueryUtils.getFilterFromCriteria( @@ -1159,18 +1122,15 @@ public void testGetAggregatedStatsCardinalityAggStrStatDay1() { dependsOnGroups = {"upsert"}) public void testGetAggregatedStatsSumStatsCollectionDay1() { // Filter is only on the urn - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(startTime + 23 * TIME_INCREMENT)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 23 * TIME_INCREMENT)); Filter filter = QueryUtils.getFilterFromCriteria( @@ -1214,18 +1174,15 @@ public void testGetAggregatedStatsSumStatsCollectionDay1() { groups = {"deleteAspectValues1"}, dependsOnGroups = {"getAggregatedStats", "getAspectValues", "testCountBeforeDelete"}) public void testDeleteAspectValuesByUrnAndTimeRangeDay1() { - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(startTime + 23 * TIME_INCREMENT)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 23 * TIME_INCREMENT)); Filter filter = QueryUtils.getFilterFromCriteria( @@ -1243,8 +1200,8 @@ public void testDeleteAspectValuesByUrnAndTimeRangeDay1() { groups = {"deleteAspectValues2"}, dependsOnGroups = {"deleteAspectValues1", "testCountAfterDelete"}) public void testDeleteAspectValuesByUrn() { - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); + Filter filter = QueryUtils.getFilterFromCriteria(ImmutableList.of(hasUrnCriterion)); DeleteAspectValuesResult result = elasticSearchTimeseriesAspectService.deleteAspectValues( @@ -1259,8 +1216,8 @@ public void testDeleteAspectValuesByUrn() { dependsOnGroups = {"upsert"}) public void testCountByFilter() { // Test with filter - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); + Filter filter = QueryUtils.getFilterFromCriteria(ImmutableList.of(hasUrnCriterion)); long count = elasticSearchTimeseriesAspectService.countByFilter( @@ -1269,15 +1226,14 @@ public void testCountByFilter() { // Test with filter with multiple criteria Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); + Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(startTime + 23 * TIME_INCREMENT)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 23 * TIME_INCREMENT)); Filter urnAndTimeFilter = QueryUtils.getFilterFromCriteria( @@ -1301,8 +1257,8 @@ public void testCountByFilter() { public void testCountByFilterAfterDelete() throws Exception { syncAfterWrite(getBulkProcessor()); // Test with filter - Criterion hasUrnCriterion = - new Criterion().setField("urn").setCondition(Condition.EQUAL).setValue(TEST_URN.toString()); + Criterion hasUrnCriterion = buildCriterion("urn", Condition.EQUAL, TEST_URN.toString()); + Filter filter = QueryUtils.getFilterFromCriteria(ImmutableList.of(hasUrnCriterion)); long count = elasticSearchTimeseriesAspectService.countByFilter( @@ -1311,15 +1267,14 @@ public void testCountByFilterAfterDelete() throws Exception { // Test with filter with multiple criteria Criterion startTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.GREATER_THAN_OR_EQUAL_TO) - .setValue(startTime.toString()); + buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTime.toString()); + Criterion endTimeCriterion = - new Criterion() - .setField(ES_FIELD_TIMESTAMP) - .setCondition(Condition.LESS_THAN_OR_EQUAL_TO) - .setValue(String.valueOf(startTime + 23 * TIME_INCREMENT)); + buildCriterion( + ES_FIELD_TIMESTAMP, + Condition.LESS_THAN_OR_EQUAL_TO, + String.valueOf(startTime + 23 * TIME_INCREMENT)); Filter urnAndTimeFilter = QueryUtils.getFilterFromCriteria( diff --git a/metadata-jobs/mae-consumer/src/main/java/com/linkedin/metadata/kafka/hook/siblings/SiblingAssociationHook.java b/metadata-jobs/mae-consumer/src/main/java/com/linkedin/metadata/kafka/hook/siblings/SiblingAssociationHook.java index bbe0feed7de11..ed585d8fb0cb2 100644 --- a/metadata-jobs/mae-consumer/src/main/java/com/linkedin/metadata/kafka/hook/siblings/SiblingAssociationHook.java +++ b/metadata-jobs/mae-consumer/src/main/java/com/linkedin/metadata/kafka/hook/siblings/SiblingAssociationHook.java @@ -1,6 +1,7 @@ package com.linkedin.metadata.kafka.hook.siblings; import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; @@ -425,10 +426,9 @@ private Filter createFilterForEntitiesWithYouAsSibling(final Urn entityUrn) { final ConjunctiveCriterion conjunction = new ConjunctiveCriterion(); final CriterionArray andCriterion = new CriterionArray(); - final Criterion urnCriterion = new Criterion(); - urnCriterion.setField("siblings.keyword"); - urnCriterion.setValue(entityUrn.toString()); - urnCriterion.setCondition(Condition.EQUAL); + final Criterion urnCriterion = + buildCriterion("siblings.keyword", Condition.EQUAL, entityUrn.toString()); + andCriterion.add(urnCriterion); conjunction.setAnd(andCriterion); diff --git a/metadata-service/auth-impl/src/main/java/com/datahub/authentication/invite/InviteTokenService.java b/metadata-service/auth-impl/src/main/java/com/datahub/authentication/invite/InviteTokenService.java index c8ffd36f5ebc9..8bc18eae92a23 100644 --- a/metadata-service/auth-impl/src/main/java/com/datahub/authentication/invite/InviteTokenService.java +++ b/metadata-service/auth-impl/src/main/java/com/datahub/authentication/invite/InviteTokenService.java @@ -2,6 +2,7 @@ import static com.linkedin.metadata.Constants.*; import static com.linkedin.metadata.entity.AspectUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.linkedin.common.urn.Urn; import com.linkedin.entity.EntityResponse; @@ -117,10 +118,7 @@ private Filter createInviteTokenFilter() { final ConjunctiveCriterion conjunction = new ConjunctiveCriterion(); final CriterionArray andCriterion = new CriterionArray(); - final Criterion roleCriterion = new Criterion(); - roleCriterion.setField(HAS_ROLE_FIELD_NAME); - roleCriterion.setValue("false"); - roleCriterion.setCondition(Condition.EQUAL); + final Criterion roleCriterion = buildCriterion(HAS_ROLE_FIELD_NAME, Condition.EQUAL, "false"); andCriterion.add(roleCriterion); conjunction.setAnd(andCriterion); @@ -136,10 +134,7 @@ private Filter createInviteTokenFilter(@Nonnull final String roleUrnStr) { final ConjunctiveCriterion conjunction = new ConjunctiveCriterion(); final CriterionArray andCriterion = new CriterionArray(); - final Criterion roleCriterion = new Criterion(); - roleCriterion.setField(ROLE_FIELD_NAME); - roleCriterion.setValue(roleUrnStr); - roleCriterion.setCondition(Condition.EQUAL); + final Criterion roleCriterion = buildCriterion(ROLE_FIELD_NAME, Condition.EQUAL, roleUrnStr); andCriterion.add(roleCriterion); conjunction.setAnd(andCriterion); diff --git a/metadata-service/factories/src/main/java/com/linkedin/metadata/boot/steps/BackfillBrowsePathsV2Step.java b/metadata-service/factories/src/main/java/com/linkedin/metadata/boot/steps/BackfillBrowsePathsV2Step.java index 668892bb46b7f..2c00c73c96549 100644 --- a/metadata-service/factories/src/main/java/com/linkedin/metadata/boot/steps/BackfillBrowsePathsV2Step.java +++ b/metadata-service/factories/src/main/java/com/linkedin/metadata/boot/steps/BackfillBrowsePathsV2Step.java @@ -1,6 +1,7 @@ package com.linkedin.metadata.boot.steps; -import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildExistsCriterion; +import static com.linkedin.metadata.utils.CriterionUtils.buildIsNullCriterion; import static com.linkedin.metadata.utils.SystemMetadataUtils.createDefaultSystemMetadata; import com.google.common.collect.ImmutableList; @@ -13,7 +14,6 @@ import com.linkedin.metadata.aspect.utils.DefaultAspectsUtil; import com.linkedin.metadata.boot.UpgradeStep; import com.linkedin.metadata.entity.EntityService; -import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; import com.linkedin.metadata.query.filter.Criterion; @@ -89,13 +89,10 @@ private String backfillBrowsePathsV2( throws Exception { // Condition: has `browsePaths` AND does NOT have `browsePathV2` - Criterion missingBrowsePathV2 = new Criterion(); - missingBrowsePathV2.setCondition(Condition.IS_NULL); - missingBrowsePathV2.setField("browsePathV2"); + Criterion missingBrowsePathV2 = buildIsNullCriterion("browsePathV2"); + // Excludes entities without browsePaths - Criterion hasBrowsePathV1 = new Criterion(); - hasBrowsePathV1.setCondition(Condition.EXISTS); - hasBrowsePathV1.setField("browsePaths"); + Criterion hasBrowsePathV1 = buildExistsCriterion("browsePaths"); CriterionArray criterionArray = new CriterionArray(); criterionArray.add(missingBrowsePathV2); diff --git a/metadata-service/factories/src/test/java/com/linkedin/gms/factory/search/CacheTest.java b/metadata-service/factories/src/test/java/com/linkedin/gms/factory/search/CacheTest.java index 153348e7ec119..dc0f436888ef1 100644 --- a/metadata-service/factories/src/test/java/com/linkedin/gms/factory/search/CacheTest.java +++ b/metadata-service/factories/src/test/java/com/linkedin/gms/factory/search/CacheTest.java @@ -2,6 +2,7 @@ import static com.datahub.util.RecordUtils.*; import static com.linkedin.metadata.search.client.CachingEntitySearchService.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.Mockito.mock; import com.google.common.collect.ImmutableList; @@ -10,7 +11,6 @@ import com.hazelcast.jet.core.JetTestSupport; import com.hazelcast.spring.cache.HazelcastCacheManager; import com.linkedin.common.urn.CorpuserUrn; -import com.linkedin.data.template.StringArray; import com.linkedin.metadata.graph.EntityLineageResult; import com.linkedin.metadata.graph.LineageDirection; import com.linkedin.metadata.graph.LineageRelationship; @@ -123,19 +123,9 @@ public void hazelcastTestScroll() { .setPageSize(1) .setMetadata(new SearchResultMetadata()); - final Criterion filterCriterion = - new Criterion() - .setField("platform") - .setCondition(Condition.EQUAL) - .setValue("hive") - .setValues(new StringArray(ImmutableList.of("hive"))); - - final Criterion subtypeCriterion = - new Criterion() - .setField("subtypes") - .setCondition(Condition.EQUAL) - .setValue("") - .setValues(new StringArray(ImmutableList.of("view"))); + final Criterion filterCriterion = buildCriterion("platform", Condition.EQUAL, "hive"); + + final Criterion subtypeCriterion = buildCriterion("subtypes", Condition.EQUAL, "view"); final Filter filterWithCondition = new Filter() diff --git a/metadata-service/restli-client/src/main/java/com/linkedin/entity/client/RestliEntityClient.java b/metadata-service/restli-client/src/main/java/com/linkedin/entity/client/RestliEntityClient.java index bc5b9e439d293..824460b8a1a50 100644 --- a/metadata-service/restli-client/src/main/java/com/linkedin/entity/client/RestliEntityClient.java +++ b/metadata-service/restli-client/src/main/java/com/linkedin/entity/client/RestliEntityClient.java @@ -1,5 +1,7 @@ package com.linkedin.entity.client; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; + import com.datahub.plugins.auth.authorization.Authorizer; import com.datahub.util.RecordUtils; import com.google.common.collect.ImmutableList; @@ -59,7 +61,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.query.filter.SortCriterion; @@ -1181,7 +1182,7 @@ public static Filter newFilter(@Nullable Map params) { CriterionArray criteria = params.entrySet().stream() .filter(e -> Objects.nonNull(e.getValue())) - .map(e -> newCriterion(e.getKey(), e.getValue(), Condition.EQUAL)) + .map(e -> buildCriterion(e.getKey(), Condition.EQUAL, e.getValue())) .collect(Collectors.toCollection(CriterionArray::new)); return new Filter() .setOr( @@ -1189,12 +1190,6 @@ public static Filter newFilter(@Nullable Map params) { ImmutableList.of(new ConjunctiveCriterion().setAnd(criteria)))); } - @Nonnull - public static Criterion newCriterion( - @Nonnull String field, @Nonnull String value, @Nonnull Condition condition) { - return new Criterion().setField(field).setValue(value).setCondition(condition); - } - @Nonnull public static Filter filterOrDefaultEmptyFilter(@Nullable Filter filter) { return filter != null ? filter : new Filter().setOr(new ConjunctiveCriterionArray()); diff --git a/metadata-service/restli-servlet-impl/src/main/java/com/linkedin/metadata/resources/entity/EntityResource.java b/metadata-service/restli-servlet-impl/src/main/java/com/linkedin/metadata/resources/entity/EntityResource.java index 1690185324560..74c15d1f35889 100644 --- a/metadata-service/restli-servlet-impl/src/main/java/com/linkedin/metadata/resources/entity/EntityResource.java +++ b/metadata-service/restli-servlet-impl/src/main/java/com/linkedin/metadata/resources/entity/EntityResource.java @@ -22,6 +22,7 @@ import com.datahub.authorization.EntitySpec; import com.linkedin.metadata.resources.restli.RestliUtils; +import com.linkedin.metadata.utils.CriterionUtils; import com.linkedin.metadata.utils.SystemMetadataUtils; import io.datahubproject.metadata.context.RequestContext; import io.datahubproject.metadata.services.RestrictedService; @@ -53,7 +54,6 @@ import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.query.filter.SortCriterion; -import com.linkedin.metadata.resources.restli.RestliUtils; import com.linkedin.metadata.run.AspectRowSummary; import com.linkedin.metadata.run.AspectRowSummaryArray; import com.linkedin.metadata.run.DeleteEntityResponse; @@ -984,16 +984,16 @@ private Long deleteTimeseriesAspects( // Construct the filter. List criteria = new ArrayList<>(); - criteria.add(QueryUtils.newCriterion("urn", urn.toString())); + criteria.add(CriterionUtils.buildCriterion("urn", Condition.EQUAL, urn.toString())); if (startTimeMillis != null) { criteria.add( - QueryUtils.newCriterion( - ES_FIELD_TIMESTAMP, startTimeMillis.toString(), Condition.GREATER_THAN_OR_EQUAL_TO)); + CriterionUtils.buildCriterion( + ES_FIELD_TIMESTAMP, Condition.GREATER_THAN_OR_EQUAL_TO, startTimeMillis.toString())); } if (endTimeMillis != null) { criteria.add( - QueryUtils.newCriterion( - ES_FIELD_TIMESTAMP, endTimeMillis.toString(), Condition.LESS_THAN_OR_EQUAL_TO)); + CriterionUtils.buildCriterion( + ES_FIELD_TIMESTAMP, Condition.LESS_THAN_OR_EQUAL_TO, endTimeMillis.toString())); } final Filter filter = QueryUtils.getFilterFromCriteria(criteria); diff --git a/metadata-service/restli-servlet-impl/src/main/java/com/linkedin/metadata/resources/operations/OperationsResource.java b/metadata-service/restli-servlet-impl/src/main/java/com/linkedin/metadata/resources/operations/OperationsResource.java index ea329ce0809fb..c1c41f0996f9f 100644 --- a/metadata-service/restli-servlet-impl/src/main/java/com/linkedin/metadata/resources/operations/OperationsResource.java +++ b/metadata-service/restli-servlet-impl/src/main/java/com/linkedin/metadata/resources/operations/OperationsResource.java @@ -2,16 +2,14 @@ import static com.datahub.authorization.AuthUtil.isAPIAuthorized; import static com.linkedin.metadata.resources.restli.RestliConstants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.codahale.metrics.MetricRegistry; import com.datahub.authentication.Authentication; import com.datahub.authentication.AuthenticationContext; -import com.datahub.authorization.EntitySpec; import com.datahub.plugins.auth.authorization.Authorizer; import com.google.common.annotations.VisibleForTesting; -import com.linkedin.common.urn.Urn; import com.linkedin.metadata.aspect.VersionedAspect; -import com.linkedin.metadata.authorization.Disjunctive; import com.linkedin.metadata.authorization.PoliciesConfig; import com.linkedin.metadata.entity.EntityService; import com.linkedin.metadata.query.filter.Condition; @@ -37,7 +35,6 @@ import io.opentelemetry.extension.annotations.WithSpan; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.inject.Inject; @@ -246,8 +243,8 @@ String executeTruncateTimeseriesAspect( List criteria = new ArrayList<>(); criteria.add( - QueryUtils.newCriterion( - "timestampMillis", String.valueOf(endTimeMillis), Condition.LESS_THAN_OR_EQUAL_TO)); + buildCriterion( + "timestampMillis", Condition.LESS_THAN_OR_EQUAL_TO, String.valueOf(endTimeMillis))); final Filter filter = QueryUtils.getFilterFromCriteria(criteria); long numToDelete = _timeseriesAspectService.countByFilter(opContext, entityType, aspectName, filter); @@ -289,8 +286,8 @@ String executeTruncateTimeseriesAspect( // count List reindexCriteria = new ArrayList<>(); reindexCriteria.add( - QueryUtils.newCriterion( - "timestampMillis", String.valueOf(endTimeMillis), Condition.GREATER_THAN)); + buildCriterion( + "timestampMillis", Condition.GREATER_THAN, String.valueOf(endTimeMillis))); final Filter reindexFilter = QueryUtils.getFilterFromCriteria(reindexCriteria); String taskId = diff --git a/metadata-service/services/src/main/java/com/linkedin/metadata/entity/DeleteEntityService.java b/metadata-service/services/src/main/java/com/linkedin/metadata/entity/DeleteEntityService.java index 145e71b4371e6..a3c57a19eddd5 100644 --- a/metadata-service/services/src/main/java/com/linkedin/metadata/entity/DeleteEntityService.java +++ b/metadata-service/services/src/main/java/com/linkedin/metadata/entity/DeleteEntityService.java @@ -1,6 +1,7 @@ package com.linkedin.metadata.entity; import static com.linkedin.metadata.search.utils.QueryUtils.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.datahub.util.RecordUtils; import com.google.common.collect.ImmutableList; @@ -30,7 +31,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.query.filter.RelationshipDirection; @@ -571,25 +571,15 @@ private AssetScrollResult getAssetsReferencingUrn( // first, get all entities with this form assigned on it final CriterionArray incompleteFormsArray = new CriterionArray(); incompleteFormsArray.add( - new Criterion() - .setField("incompleteForms") - .setValue(deletedUrn.toString()) - .setCondition(Condition.EQUAL)); + buildCriterion("incompleteForms", Condition.EQUAL, deletedUrn.toString())); final CriterionArray completedFormsArray = new CriterionArray(); completedFormsArray.add( - new Criterion() - .setField("completedForms") - .setValue(deletedUrn.toString()) - .setCondition(Condition.EQUAL)); + buildCriterion("completedForms", Condition.EQUAL, deletedUrn.toString())); // next, get all metadata tests created for this form final CriterionArray metadataTestSourceArray = new CriterionArray(); metadataTestSourceArray.add( - new Criterion() - .setField("sourceEntity") - .setValue(deletedUrn.toString()) - .setCondition(Condition.EQUAL)); - metadataTestSourceArray.add( - new Criterion().setField("sourceType").setValue("FORMS").setCondition(Condition.EQUAL)); + buildCriterion("sourceEntity", Condition.EQUAL, deletedUrn.toString())); + metadataTestSourceArray.add(buildCriterion("sourceType", Condition.EQUAL, "FORMS")); Filter filter = new Filter() .setOr( diff --git a/metadata-service/services/src/main/java/com/linkedin/metadata/recommendation/candidatesource/EntitySearchAggregationSource.java b/metadata-service/services/src/main/java/com/linkedin/metadata/recommendation/candidatesource/EntitySearchAggregationSource.java index da4dd9d76d451..c1593088a2dd7 100644 --- a/metadata-service/services/src/main/java/com/linkedin/metadata/recommendation/candidatesource/EntitySearchAggregationSource.java +++ b/metadata-service/services/src/main/java/com/linkedin/metadata/recommendation/candidatesource/EntitySearchAggregationSource.java @@ -1,10 +1,12 @@ package com.linkedin.metadata.recommendation.candidatesource; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; + import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; import com.linkedin.metadata.models.EntitySpec; import com.linkedin.metadata.models.registry.EntityRegistry; -import com.linkedin.metadata.query.filter.Criterion; +import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.recommendation.ContentParams; @@ -167,9 +169,8 @@ private RecommendationContent buildRecommendationContent(T candidate, long c .setFilters( new CriterionArray( ImmutableList.of( - new Criterion() - .setField(getSearchFieldName()) - .setValue(candidate.toString())))); + buildCriterion( + getSearchFieldName(), Condition.EQUAL, candidate.toString())))); ContentParams contentParams = new ContentParams().setCount(count); RecommendationContent content = new RecommendationContent(); if (candidate instanceof Urn) { diff --git a/metadata-service/services/src/main/java/com/linkedin/metadata/search/utils/QueryUtils.java b/metadata-service/services/src/main/java/com/linkedin/metadata/search/utils/QueryUtils.java index f6a37f958c30d..7e9d1701bf79a 100644 --- a/metadata-service/services/src/main/java/com/linkedin/metadata/search/utils/QueryUtils.java +++ b/metadata-service/services/src/main/java/com/linkedin/metadata/search/utils/QueryUtils.java @@ -1,12 +1,12 @@ package com.linkedin.metadata.search.utils; import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import com.datahub.util.ModelUtils; import com.google.common.collect.ImmutableList; import com.linkedin.common.urn.Urn; import com.linkedin.data.template.RecordTemplate; -import com.linkedin.data.template.StringArray; import com.linkedin.metadata.aspect.AspectVersion; import com.linkedin.metadata.config.DataHubAppConfiguration; import com.linkedin.metadata.models.EntitySpec; @@ -32,7 +32,6 @@ import java.util.stream.Stream; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import javax.validation.constraints.Null; import org.apache.commons.collections.CollectionUtils; public class QueryUtils { @@ -41,43 +40,6 @@ public class QueryUtils { private QueryUtils() {} - // Creates new Criterion with field and value, using EQUAL condition. - @Nonnull - public static Criterion newCriterion(@Nonnull String field, @Nonnull String value) { - return newCriterion(field, value, Condition.EQUAL); - } - - // Creates new Criterion with field, value and condition. - @Nonnull - public static Criterion newCriterion( - @Nonnull String field, @Nonnull String value, @Nonnull Condition condition) { - return new Criterion() - .setField(field) - .setValue(value) - .setValues(new StringArray(ImmutableList.of(value))) - .setCondition(condition); - } - - // Creates new Criterion with field and value, using EQUAL condition. - @Nullable - public static Criterion newCriterion(@Nonnull String field, @Nonnull List values) { - return newCriterion(field, values, Condition.EQUAL); - } - - // Creates new Criterion with field, value and condition. - @Null - public static Criterion newCriterion( - @Nonnull String field, @Nonnull List values, @Nonnull Condition condition) { - if (values.isEmpty()) { - return null; - } - return new Criterion() - .setField(field) - .setValue(values.get(0)) // Hack! This is due to bad modeling. - .setValues(new StringArray(values)) - .setCondition(condition); - } - // Creates new Filter from a map of Criteria by removing null-valued Criteria and using EQUAL // condition (default). @Nonnull @@ -88,7 +50,7 @@ public static Filter newFilter(@Nullable Map params) { CriterionArray criteria = params.entrySet().stream() .filter(e -> Objects.nonNull(e.getValue())) - .map(e -> newCriterion(e.getKey(), e.getValue())) + .map(e -> buildCriterion(e.getKey(), Condition.EQUAL, e.getValue())) .collect(Collectors.toCollection(CriterionArray::new)); return new Filter() .setOr( @@ -259,32 +221,27 @@ public static Filter buildFilterWithUrns( // Prevent increasing the query size by avoiding querying multiple fields with the // same URNs Criterion urnMatchCriterion = - new Criterion() - .setField("urn") - .setValue("") - .setValues( - new StringArray( - urns.stream() - .filter( - urn -> - !schemaFieldEnabled - || !urn.getEntityType().equals(SCHEMA_FIELD_ENTITY_NAME)) - .map(Object::toString) - .collect(Collectors.toList()))); + buildCriterion( + "urn", + Condition.EQUAL, + urns.stream() + .filter( + urn -> + !schemaFieldEnabled + || !urn.getEntityType().equals(SCHEMA_FIELD_ENTITY_NAME)) + .map(Object::toString) + .collect(Collectors.toList())); Criterion schemaUrnAliasCriterion = - new Criterion() - .setField(String.format("%s.keyword", SCHEMA_FIELD_ALIASES_ASPECT)) - .setValue("") - .setValues( - new StringArray( - urns.stream() - .filter( - urn -> - schemaFieldEnabled - && urn.getEntityType().equals(SCHEMA_FIELD_ENTITY_NAME)) - .map(Object::toString) - .collect(Collectors.toList()))); + buildCriterion( + String.format("%s.keyword", SCHEMA_FIELD_ALIASES_ASPECT), + Condition.EQUAL, + urns.stream() + .filter( + urn -> + schemaFieldEnabled && urn.getEntityType().equals(SCHEMA_FIELD_ENTITY_NAME)) + .map(Object::toString) + .collect(Collectors.toList())); if (inputFilters == null || CollectionUtils.isEmpty(inputFilters.getOr())) { return QueryUtils.newDisjunctiveFilter(urnMatchCriterion, schemaUrnAliasCriterion); diff --git a/metadata-service/services/src/test/java/com/linkedin/metadata/service/ViewServiceTest.java b/metadata-service/services/src/test/java/com/linkedin/metadata/service/ViewServiceTest.java index d4b91b717d2f8..ea8d3792a1396 100644 --- a/metadata-service/services/src/test/java/com/linkedin/metadata/service/ViewServiceTest.java +++ b/metadata-service/services/src/test/java/com/linkedin/metadata/service/ViewServiceTest.java @@ -1,6 +1,7 @@ package com.linkedin.metadata.service; import static com.linkedin.metadata.Constants.*; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; @@ -21,7 +22,6 @@ import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; -import com.linkedin.metadata.query.filter.Criterion; import com.linkedin.metadata.query.filter.CriterionArray; import com.linkedin.metadata.query.filter.Filter; import com.linkedin.metadata.utils.GenericRecordUtils; @@ -69,10 +69,8 @@ private void testCreateViewSuccess() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setCondition(Condition.EQUAL) - .setValue("value")))))))), + buildCriterion( + "field", Condition.EQUAL, "value")))))))), 0L); Assert.assertEquals(urn, TEST_VIEW_URN); @@ -99,10 +97,8 @@ private void testCreateViewSuccess() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setCondition(Condition.EQUAL) - .setValue("value")))))))), + buildCriterion( + "field", Condition.EQUAL, "value")))))))), 0L); Assert.assertEquals(urn, TEST_VIEW_URN); @@ -138,10 +134,10 @@ private void testCreateViewErrorMissingInputs() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setCondition(Condition.EQUAL) - .setValue("value")))))))), + buildCriterion( + "field", + Condition.EQUAL, + "value")))))))), 0L)); // Case 2: missing View name @@ -166,10 +162,10 @@ private void testCreateViewErrorMissingInputs() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setCondition(Condition.EQUAL) - .setValue("value")))))))), + buildCriterion( + "field", + Condition.EQUAL, + "value")))))))), 0L)); // Case 3: missing View definition @@ -218,10 +214,10 @@ private void testCreateViewError() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setCondition(Condition.EQUAL) - .setValue("value")))))))), + buildCriterion( + "field", + Condition.EQUAL, + "value")))))))), 1L)); } @@ -264,10 +260,8 @@ private void testUpdateViewSuccess() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setCondition(Condition.EQUAL) - .setValue("value")))))))); + buildCriterion( + "field", Condition.EQUAL, "value")))))))); // Case 1: Update name only service.updateView(opContext, TEST_VIEW_URN, newName, null, null, 1L); @@ -441,10 +435,8 @@ private void testGetViewInfoSuccess() throws Exception { .setAnd( new CriterionArray( ImmutableList.of( - new Criterion() - .setField("field") - .setCondition(Condition.EQUAL) - .setValue("value")))))))); + buildCriterion( + "field", Condition.EQUAL, "value")))))))); resetGetViewInfoMockEntityClient( mockClient, TEST_VIEW_URN, type, name, description, definition, TEST_USER_URN, 0L, 1L); diff --git a/metadata-utils/src/main/java/com/linkedin/metadata/utils/CriterionUtils.java b/metadata-utils/src/main/java/com/linkedin/metadata/utils/CriterionUtils.java new file mode 100644 index 0000000000000..e40c4af1e0ae7 --- /dev/null +++ b/metadata-utils/src/main/java/com/linkedin/metadata/utils/CriterionUtils.java @@ -0,0 +1,71 @@ +package com.linkedin.metadata.utils; + +import com.linkedin.data.template.StringArray; +import com.linkedin.metadata.query.filter.Condition; +import com.linkedin.metadata.query.filter.Criterion; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.stream.Collectors; +import javax.annotation.Nonnull; + +public class CriterionUtils { + private CriterionUtils() {} + + public static Criterion buildExistsCriterion(@Nonnull String field) { + return buildCriterion(field, Condition.EXISTS, false, Collections.emptyList()); + } + + public static Criterion buildNotExistsCriterion(@Nonnull String field) { + return buildCriterion(field, Condition.EXISTS, true, Collections.emptyList()); + } + + public static Criterion buildIsNullCriterion(@Nonnull String field) { + return buildCriterion(field, Condition.IS_NULL, false, Collections.emptyList()); + } + + public static Criterion buildIsNotNullCriterion(@Nonnull String field) { + return buildCriterion(field, Condition.IS_NULL, true, Collections.emptyList()); + } + + public static Criterion buildCriterion( + @Nonnull String field, @Nonnull Condition condition, String... values) { + return buildCriterion( + field, + condition, + null, + values == null + ? Collections.emptyList() + : Arrays.stream(values).collect(Collectors.toList())); + } + + public static Criterion buildCriterion( + @Nonnull String field, @Nonnull Condition condition, Collection values) { + return buildCriterion(field, condition, false, values); + } + + public static Criterion buildCriterion( + @Nonnull String field, @Nonnull Condition condition, boolean negated, String... values) { + return buildCriterion( + field, + condition, + negated, + values == null + ? Collections.emptyList() + : Arrays.stream(values).collect(Collectors.toList())); + } + + public static Criterion buildCriterion( + @Nonnull String field, + @Nonnull Condition condition, + Boolean negated, + Collection values) { + Criterion criterion = new Criterion(); + criterion.setField(field); + criterion.setCondition(condition); + criterion.setNegated(negated != null ? negated : false); + criterion.setValues(values != null ? new StringArray(values) : new StringArray()); + criterion.setValue(""); // deprecated + return criterion; + } +} diff --git a/metadata-utils/src/main/java/com/linkedin/metadata/utils/SearchUtil.java b/metadata-utils/src/main/java/com/linkedin/metadata/utils/SearchUtil.java index aa18124c826da..b115d11a30739 100644 --- a/metadata-utils/src/main/java/com/linkedin/metadata/utils/SearchUtil.java +++ b/metadata-utils/src/main/java/com/linkedin/metadata/utils/SearchUtil.java @@ -1,7 +1,9 @@ package com.linkedin.metadata.utils; +import static com.linkedin.metadata.utils.CriterionUtils.buildCriterion; + import com.linkedin.common.urn.Urn; -import com.linkedin.data.template.StringArray; +import com.linkedin.metadata.query.filter.Condition; import com.linkedin.metadata.query.filter.ConjunctiveCriterion; import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray; import com.linkedin.metadata.query.filter.Criterion; @@ -70,16 +72,14 @@ public static FilterValue createFilterValue(String value, Long facetCount, Boole private static Criterion transformEntityTypeCriterion( Criterion criterion, IndexConvention indexConvention) { - return criterion - .setField(ES_INDEX_FIELD) - .setValues( - new StringArray( - criterion.getValues().stream() - .map(value -> String.join("", value.split("_"))) - .map(indexConvention::getEntityIndexName) - .collect(Collectors.toList()))) - .setValue( - indexConvention.getEntityIndexName(String.join("", criterion.getValue().split("_")))); + return buildCriterion( + ES_INDEX_FIELD, + Condition.EQUAL, + criterion.isNegated(), + criterion.getValues().stream() + .map(value -> String.join("", value.split("_"))) + .map(indexConvention::getEntityIndexName) + .collect(Collectors.toList())); } private static ConjunctiveCriterion transformConjunctiveCriterion(