FIX CL-1641 - Allow to search by descriptionSources (#21487)

* FIX CL-1641 - Allow to search by descriptionSources

* Add new fields for advanced search filters

* feat: added createdBy params

* Move the tag label type options to constants

* Add tier & tag source

---------

Co-authored-by: Aniket Katkar <aniketkatkar97@gmail.com>
Co-authored-by: Teddy Crepineau <teddy.crepineau@gmail.com>
Co-authored-by: ulixius9 <mayursingal9@gmail.com>
This commit is contained in:
Pere Miquel Brull 2025-06-06 14:10:25 +02:00 committed by GitHub
parent 9a5d02b2c7
commit a51187d46b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
47 changed files with 562 additions and 132 deletions

View File

@ -13,7 +13,6 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.glassfish.jersey.internal.util.ExceptionUtils;
import org.openmetadata.common.utils.CommonUtil;
@ -22,19 +21,16 @@ import org.openmetadata.schema.EntityInterface;
import org.openmetadata.schema.entity.teams.User;
import org.openmetadata.schema.system.IndexingError;
import org.openmetadata.schema.system.StepStats;
import org.openmetadata.schema.type.ChangeDescription;
import org.openmetadata.schema.type.ChangeSummaryMap;
import org.openmetadata.schema.type.Column;
import org.openmetadata.schema.type.EntityReference;
import org.openmetadata.schema.type.Include;
import org.openmetadata.schema.type.TagLabel;
import org.openmetadata.schema.type.change.ChangeSource;
import org.openmetadata.schema.type.change.ChangeSummary;
import org.openmetadata.service.Entity;
import org.openmetadata.service.apps.bundles.insights.utils.TimestampUtils;
import org.openmetadata.service.exception.EntityNotFoundException;
import org.openmetadata.service.exception.SearchIndexException;
import org.openmetadata.service.jdbi3.EntityRepository;
import org.openmetadata.service.search.SearchIndexUtils;
import org.openmetadata.service.util.JsonUtils;
import org.openmetadata.service.util.ResultList;
import org.openmetadata.service.workflows.interfaces.Processor;
@ -152,11 +148,7 @@ public class DataInsightsEntityEnricherProcessor
String entityType = (String) contextData.get(ENTITY_TYPE_KEY);
Map<String, ChangeSummary> changeSummaryMap =
Optional.ofNullable(entity.getChangeDescription())
.map(ChangeDescription::getChangeSummary)
.map(ChangeSummaryMap::getAdditionalProperties)
.orElse(null);
Map<String, ChangeSummary> changeSummaryMap = SearchIndexUtils.getChangeSummaryMap(entity);
// Enrich with EntityType
if (CommonUtil.nullOrEmpty(entityType)) {
@ -171,10 +163,12 @@ public class DataInsightsEntityEnricherProcessor
entityMap.put("endTimestamp", endTimestamp);
// Process Description Source
entityMap.put("descriptionSources", processDescriptionSources(entity, changeSummaryMap));
entityMap.put(
"descriptionSources", SearchIndexUtils.processDescriptionSources(entity, changeSummaryMap));
// Process Tag Source
TagAndTierSources tagAndTierSources = processTagAndTierSources(entity);
SearchIndexUtils.TagAndTierSources tagAndTierSources =
SearchIndexUtils.processTagAndTierSources(entity);
entityMap.put("tagSources", tagAndTierSources.getTagSources());
entityMap.put("tierSources", tagAndTierSources.getTierSources());
@ -187,7 +181,7 @@ public class DataInsightsEntityEnricherProcessor
// Enrich with Description Stats
entityMap.put("hasDescription", CommonUtil.nullOrEmpty(entity.getDescription()) ? 0 : 1);
if (hasColumns(entity)) {
if (SearchIndexUtils.hasColumns(entity)) {
entityMap.put("numberOfColumns", ((ColumnsEntityInterface) entity).getColumns().size());
entityMap.put(
"numberOfColumnsWithDescription",
@ -205,65 +199,6 @@ public class DataInsightsEntityEnricherProcessor
return entityMap;
}
private boolean hasColumns(EntityInterface entity) {
return List.of(entity.getClass().getInterfaces()).contains(ColumnsEntityInterface.class);
}
private String getDescriptionSource(
String description, Map<String, ChangeSummary> changeSummaryMap, String changeSummaryKey) {
if (description == null) {
return null;
}
String descriptionSource = ChangeSource.INGESTED.value();
if (changeSummaryMap != null) {
if (changeSummaryMap.containsKey(changeSummaryKey)
&& changeSummaryMap.get(changeSummaryKey).getChangeSource() != null) {
descriptionSource = changeSummaryMap.get(changeSummaryKey).getChangeSource().value();
}
}
return descriptionSource;
}
private void processDescriptionSource(
EntityInterface entity,
Map<String, ChangeSummary> changeSummaryMap,
Map<String, Integer> descriptionSources) {
Optional.ofNullable(
getDescriptionSource(entity.getDescription(), changeSummaryMap, "description"))
.ifPresent(
source ->
descriptionSources.put(source, descriptionSources.getOrDefault(source, 0) + 1));
}
private void processColumnDescriptionSources(
ColumnsEntityInterface entity,
Map<String, ChangeSummary> changeSummaryMap,
Map<String, Integer> descriptionSources) {
for (Column column : entity.getColumns()) {
Optional.ofNullable(
getDescriptionSource(
column.getDescription(),
changeSummaryMap,
String.format("columns.%s.description", column.getName())))
.ifPresent(
source ->
descriptionSources.put(source, descriptionSources.getOrDefault(source, 0) + 1));
}
}
private Map<String, Integer> processDescriptionSources(
EntityInterface entity, Map<String, ChangeSummary> changeSummaryMap) {
Map<String, Integer> descriptionSources = new HashMap<>();
processDescriptionSource(entity, changeSummaryMap, descriptionSources);
if (hasColumns(entity)) {
processColumnDescriptionSources(
(ColumnsEntityInterface) entity, changeSummaryMap, descriptionSources);
}
return descriptionSources;
}
private String processTeam(EntityInterface entity) {
String team = null;
Optional<List<EntityReference>> oEntityOwners = Optional.ofNullable(entity.getOwners());
@ -303,52 +238,6 @@ public class DataInsightsEntityEnricherProcessor
return team;
}
private void processTagAndTierSources(
List<TagLabel> tagList, TagAndTierSources tagAndTierSources) {
Optional.ofNullable(tagList)
.ifPresent(
tags -> {
tags.forEach(
tag -> {
String tagSource = tag.getLabelType().value();
if (tag.getTagFQN().startsWith("Tier.")) {
tagAndTierSources
.getTierSources()
.put(
tagSource,
tagAndTierSources.getTierSources().getOrDefault(tagSource, 0) + 1);
} else {
tagAndTierSources
.getTagSources()
.put(
tagSource,
tagAndTierSources.getTagSources().getOrDefault(tagSource, 0) + 1);
}
});
});
}
private void processEntityTagSources(
EntityInterface entity, TagAndTierSources tagAndTierSources) {
processTagAndTierSources(entity.getTags(), tagAndTierSources);
}
private void processColumnTagSources(
ColumnsEntityInterface entity, TagAndTierSources tagAndTierSources) {
for (Column column : entity.getColumns()) {
processTagAndTierSources(column.getTags(), tagAndTierSources);
}
}
private TagAndTierSources processTagAndTierSources(EntityInterface entity) {
TagAndTierSources tagAndTierSources = new TagAndTierSources();
processEntityTagSources(entity, tagAndTierSources);
if (hasColumns(entity)) {
processColumnTagSources((ColumnsEntityInterface) entity, tagAndTierSources);
}
return tagAndTierSources;
}
private String processTier(EntityInterface entity) {
String tier = null;
@ -412,15 +301,4 @@ public class DataInsightsEntityEnricherProcessor
public StepStats getStats() {
return stats;
}
@Getter
public static class TagAndTierSources {
private final Map<String, Integer> tagSources;
private final Map<String, Integer> tierSources;
public TagAndTierSources() {
this.tagSources = new HashMap<>();
this.tierSources = new HashMap<>();
}
}
}

View File

@ -46,6 +46,7 @@ public class ListFilter extends Filter<ListFilter> {
conditions.add(getEntityFQNHashCondition());
conditions.add(getTestCaseResolutionStatusType());
conditions.add(getAssignee());
conditions.add(getCreatedByCondition());
conditions.add(getEventSubscriptionAlertType());
conditions.add(getApiCollectionCondition(tableName));
conditions.add(getWorkflowDefinitionIdCondition());
@ -80,6 +81,16 @@ public class ListFilter extends Filter<ListFilter> {
return assignee == null ? "" : String.format("assignee = '%s'", assignee);
}
private String getCreatedByCondition() {
if (Boolean.TRUE.equals(DatasourceConfig.getInstance().isMySQL())) {
String createdBy = queryParams.get("createdBy");
return createdBy == null ? "" : "json->>'$.createdBy' = :createdBy";
} else {
String createdBy = queryParams.get("createdBy");
return createdBy == null ? "" : "json#>'{createdBy}' = :createdBy";
}
}
private String getWorkflowDefinitionIdCondition() {
String workflowDefinitionId = queryParams.get("workflowDefinitionId");
return workflowDefinitionId == null

View File

@ -217,14 +217,20 @@ public class TestCaseResource extends EntityResource<TestCase, TestCaseRepositor
allowableValues = {"column", "table", "all"}))
@QueryParam("testCaseType")
@DefaultValue("all")
String type) {
String type,
@Parameter(
description = "Filter test cases by the user who created them",
schema = @Schema(type = "string"))
@QueryParam("createdBy")
String createdBy) {
ListFilter filter =
new ListFilter(include)
.addQueryParam("testSuiteId", testSuiteId)
.addQueryParam("includeAllTests", includeAllTests.toString())
.addQueryParam("testCaseStatus", status)
.addQueryParam("testCaseType", type)
.addQueryParam("entityFQN", entityFQN);
.addQueryParam("entityFQN", entityFQN)
.addQueryParam("createdBy", createdBy);
ResourceContextInterface resourceContext = getResourceContext(entityLink, filter);
// Override OperationContext to change the entity to table and operation from VIEW_ALL to
@ -406,7 +412,12 @@ public class TestCaseResource extends EntityResource<TestCase, TestCaseRepositor
description = "raw elasticsearch query to use in list",
schema = @Schema(type = "string"))
@QueryParam("queryString")
String queryString)
String queryString,
@Parameter(
description = "Filter test cases by the user who created them",
schema = @Schema(type = "string"))
@QueryParam("createdBy")
String createdBy)
throws IOException {
if ((startTimestamp == null && endTimestamp != null)
|| (startTimestamp != null && endTimestamp == null)) {
@ -428,6 +439,7 @@ public class TestCaseResource extends EntityResource<TestCase, TestCaseRepositor
searchListFilter.addQueryParam("tags", tags);
searchListFilter.addQueryParam("tier", tier);
searchListFilter.addQueryParam("serviceName", serviceName);
searchListFilter.addQueryParam("createdBy", createdBy);
if (!nullOrEmpty(owner)) {
EntityInterface entity;
StringBuilder owners = new StringBuilder();

View File

@ -17,16 +17,28 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.Getter;
import org.openmetadata.schema.ColumnsEntityInterface;
import org.openmetadata.schema.EntityInterface;
import org.openmetadata.schema.tests.DataQualityReport;
import org.openmetadata.schema.tests.Datum;
import org.openmetadata.schema.tests.type.DataQualityReportMetadata;
import org.openmetadata.schema.type.ChangeDescription;
import org.openmetadata.schema.type.ChangeSummaryMap;
import org.openmetadata.schema.type.Column;
import org.openmetadata.schema.type.EntityReference;
import org.openmetadata.schema.type.TagLabel;
import org.openmetadata.schema.type.change.ChangeSource;
import org.openmetadata.schema.type.change.ChangeSummary;
import org.openmetadata.service.util.JsonUtils;
import org.openmetadata.service.util.Utilities;
public final class SearchIndexUtils {
// Keeping the bots list static so we can call this from anywhere in the codebase
public static final List<String> AI_BOTS =
List.of("collateaiapplicationbot", "collateaiqualityagentapplicationbot");
private SearchIndexUtils() {}
public static List<String> parseFollowers(List<EntityReference> followersRef) {
@ -286,4 +298,134 @@ public final class SearchIndexUtils {
}
return new SearchAggregation(root, aggregationsMetadata);
}
public static String getDescriptionSource(
String description, Map<String, ChangeSummary> changeSummaryMap, String changeSummaryKey) {
if (description == null) {
return null;
}
String descriptionSource = ChangeSource.INGESTED.value();
if (changeSummaryMap != null) {
if (changeSummaryMap.containsKey(changeSummaryKey)
&& changeSummaryMap.get(changeSummaryKey).getChangeSource() != null) {
if (AI_BOTS.contains(changeSummaryMap.get(changeSummaryKey).getChangedBy())) {
// If bot is directly PATCHing and not suggesting, we need to still consider it's a
// suggested change
descriptionSource = ChangeSource.SUGGESTED.value();
} else {
// Otherwise, use the change summary source
descriptionSource = changeSummaryMap.get(changeSummaryKey).getChangeSource().value();
}
}
}
return descriptionSource;
}
private static void processTagAndTierSources(
List<TagLabel> tagList, TagAndTierSources tagAndTierSources) {
Optional.ofNullable(tagList)
.ifPresent(
tags -> {
tags.forEach(
tag -> {
String tagSource = tag.getLabelType().value();
if (tag.getTagFQN().startsWith("Tier.")) {
tagAndTierSources
.getTierSources()
.put(
tagSource,
tagAndTierSources.getTierSources().getOrDefault(tagSource, 0) + 1);
} else {
tagAndTierSources
.getTagSources()
.put(
tagSource,
tagAndTierSources.getTagSources().getOrDefault(tagSource, 0) + 1);
}
});
});
}
private static void processEntityTagSources(
EntityInterface entity, TagAndTierSources tagAndTierSources) {
processTagAndTierSources(entity.getTags(), tagAndTierSources);
}
private static void processColumnTagSources(
ColumnsEntityInterface entity, TagAndTierSources tagAndTierSources) {
for (Column column : entity.getColumns()) {
processTagAndTierSources(column.getTags(), tagAndTierSources);
}
}
public static TagAndTierSources processTagAndTierSources(EntityInterface entity) {
TagAndTierSources tagAndTierSources = new TagAndTierSources();
processEntityTagSources(entity, tagAndTierSources);
if (SearchIndexUtils.hasColumns(entity)) {
processColumnTagSources((ColumnsEntityInterface) entity, tagAndTierSources);
}
return tagAndTierSources;
}
public static void processDescriptionSource(
EntityInterface entity,
Map<String, ChangeSummary> changeSummaryMap,
Map<String, Integer> descriptionSources) {
Optional.ofNullable(
getDescriptionSource(entity.getDescription(), changeSummaryMap, "description"))
.ifPresent(
source ->
descriptionSources.put(source, descriptionSources.getOrDefault(source, 0) + 1));
}
public static void processColumnDescriptionSources(
ColumnsEntityInterface entity,
Map<String, ChangeSummary> changeSummaryMap,
Map<String, Integer> descriptionSources) {
for (Column column : entity.getColumns()) {
Optional.ofNullable(
getDescriptionSource(
column.getDescription(),
changeSummaryMap,
String.format("columns.%s.description", column.getName())))
.ifPresent(
source ->
descriptionSources.put(source, descriptionSources.getOrDefault(source, 0) + 1));
}
}
public static boolean hasColumns(EntityInterface entity) {
return List.of(entity.getClass().getInterfaces()).contains(ColumnsEntityInterface.class);
}
public static Map<String, Integer> processDescriptionSources(
EntityInterface entity, Map<String, ChangeSummary> changeSummaryMap) {
Map<String, Integer> descriptionSources = new HashMap<>();
processDescriptionSource(entity, changeSummaryMap, descriptionSources);
if (hasColumns(entity)) {
processColumnDescriptionSources(
(ColumnsEntityInterface) entity, changeSummaryMap, descriptionSources);
}
return descriptionSources;
}
public static Map<String, ChangeSummary> getChangeSummaryMap(EntityInterface entity) {
return Optional.ofNullable(entity.getChangeDescription())
.map(ChangeDescription::getChangeSummary)
.map(ChangeSummaryMap::getAdditionalProperties)
.orElse(null);
}
@Getter
public static class TagAndTierSources {
private final Map<String, Integer> tagSources;
private final Map<String, Integer> tierSources;
public TagAndTierSources() {
this.tagSources = new HashMap<>();
this.tierSources = new HashMap<>();
}
}
}

View File

@ -27,6 +27,7 @@ public class SearchListFilter extends Filter<SearchListFilter> {
conditions.add(getIncludeCondition(entityType));
conditions.add(getDomainCondition());
conditions.add(getOwnerCondition());
conditions.add(getCreatedByCondition());
if (entityType != null) {
conditions.add(entityType.equals(Entity.TEST_CASE) ? getTestCaseCondition() : null);
@ -122,6 +123,14 @@ public class SearchListFilter extends Filter<SearchListFilter> {
return "";
}
private String getCreatedByCondition() {
String createdBy = getQueryParam("createdBy");
if (!nullOrEmpty(createdBy)) {
return String.format("{\"term\": {\"createdBy\": \"%s\"}}", escapeDoubleQuotes(createdBy));
}
return "";
}
private String buildQueryFilter(String conditionFilter, String sourceFilter) {
String q = queryParams.get("q");
boolean isQEmpty = nullOrEmpty(q);

View File

@ -34,6 +34,7 @@ import org.openmetadata.schema.type.LineageDetails;
import org.openmetadata.schema.type.Relationship;
import org.openmetadata.schema.type.TableConstraint;
import org.openmetadata.schema.type.TagLabel;
import org.openmetadata.schema.type.change.ChangeSummary;
import org.openmetadata.service.Entity;
import org.openmetadata.service.exception.EntityNotFoundException;
import org.openmetadata.service.jdbi3.CollectionDAO;
@ -108,6 +109,15 @@ public interface SearchIndex {
: Math.max(entity.getVotes().getUpVotes() - entity.getVotes().getDownVotes(), 0);
map.put("totalVotes", totalVotes);
map.put("descriptionStatus", getDescriptionStatus(entity));
Map<String, ChangeSummary> changeSummaryMap = SearchIndexUtils.getChangeSummaryMap(entity);
map.put(
"descriptionSources", SearchIndexUtils.processDescriptionSources(entity, changeSummaryMap));
SearchIndexUtils.TagAndTierSources tagAndTierSources =
SearchIndexUtils.processTagAndTierSources(entity);
map.put("tagSources", tagAndTierSources.getTagSources());
map.put("tierSources", tagAndTierSources.getTierSources());
map.put("fqnParts", getFQNParts(entity.getFullyQualifiedName()));
map.put("deleted", entity.getDeleted() != null && entity.getDeleted());
TagLabel tierTag = new ParseTags(Entity.getEntityTags(entityType, entity)).getTierTag();

View File

@ -420,6 +420,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -645,6 +645,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -385,6 +385,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"dashboards": {
"properties": {
"id": {

View File

@ -124,6 +124,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"domain" : {
"properties": {
"id": {

View File

@ -585,6 +585,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -448,6 +448,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -524,6 +524,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -495,6 +495,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -460,6 +460,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -275,6 +275,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"extension": {
"type": "object"
}

View File

@ -446,6 +446,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"childrenCount": {
"type": "integer"
}

View File

@ -347,6 +347,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"applicationType": {
"type": "keyword",
"normalizer": "lowercase_normalizer"

View File

@ -345,6 +345,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -521,6 +521,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -435,6 +435,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -477,6 +477,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -494,6 +494,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -650,6 +650,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"columnDescriptionStatus": {
"type": "keyword"
},

View File

@ -511,6 +511,15 @@
"descriptionStatus": {
"type": "keyword"
},
"descriptionSources": {
"type": "object"
},
"tagSources": {
"type": "object"
},
"tierSources": {
"type": "object"
},
"certification": {
"type": "object",
"properties": {

View File

@ -41,6 +41,8 @@ import static org.openmetadata.service.security.SecurityUtil.getPrincipalName;
import static org.openmetadata.service.security.mask.PIIMasker.MASKED_VALUE;
import static org.openmetadata.service.util.EntityUtil.fieldUpdated;
import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS;
import static org.openmetadata.service.util.TestUtils.INGESTION_BOT;
import static org.openmetadata.service.util.TestUtils.INGESTION_BOT_AUTH_HEADERS;
import static org.openmetadata.service.util.TestUtils.TEST_AUTH_HEADERS;
import static org.openmetadata.service.util.TestUtils.TEST_USER_NAME;
import static org.openmetadata.service.util.TestUtils.UpdateType.MINOR_UPDATE;
@ -3822,4 +3824,64 @@ public class TestCaseResourceTest extends EntityResourceTest<TestCase, CreateTes
WebTarget target = getResource(testCaseId).path("/failedRowsSample");
return TestUtils.get(target, TableData.class, authHeaders);
}
@Test
void test_listTestCasesFilterByCreatedBy(TestInfo testInfo) throws IOException {
if (supportsSearchIndex) {
// Create test case with admin user
CreateTestCase adminTestCaseReq =
createRequest(testInfo)
.withName("adminTestCase")
.withEntityLink(TABLE_LINK)
.withTestSuite(TEST_SUITE1.getFullyQualifiedName())
.withTestDefinition(TEST_DEFINITION1.getFullyQualifiedName());
TestCase adminTestCase = createAndCheckEntity(adminTestCaseReq, ADMIN_AUTH_HEADERS);
// Create test case with test user
CreateTestCase testUserTestCaseReq =
createRequest(testInfo)
.withName("testUserTestCase")
.withEntityLink(TABLE_LINK)
.withTestSuite(TEST_SUITE1.getFullyQualifiedName())
.withTestDefinition(TEST_DEFINITION1.getFullyQualifiedName());
TestCase testUserTestCase =
createAndCheckEntity(testUserTestCaseReq, INGESTION_BOT_AUTH_HEADERS);
// Test filtering by admin user (by name) in search endpoint
Map<String, String> queryParams = new HashMap<>();
queryParams.put("createdBy", ADMIN_USER_NAME);
ResultList<TestCase> adminTestCases =
listEntitiesFromSearch(queryParams, 10, 0, ADMIN_AUTH_HEADERS);
assertTrue(
adminTestCases.getData().stream()
.allMatch(tc -> tc.getCreatedBy().equals(ADMIN_USER_NAME)),
"Should find test case created by admin user");
// Test filtering by test user (by name) in search endpoint
queryParams.clear();
queryParams.put("createdBy", INGESTION_BOT);
ResultList<TestCase> testUserTestCases =
listEntitiesFromSearch(queryParams, 10, 0, ADMIN_AUTH_HEADERS);
assertTrue(
testUserTestCases.getData().stream()
.allMatch(tc -> tc.getCreatedBy().equals(INGESTION_BOT)),
"Should find test case created by test user");
// Test with list endpoint (non-search)
Map<String, String> listParams = new HashMap<>();
listParams.put("createdBy", ADMIN_USER_NAME);
ResultList<TestCase> listResults = listEntities(listParams, ADMIN_AUTH_HEADERS);
assertTrue(
listResults.getData().stream().allMatch(tc -> tc.getCreatedBy().equals(ADMIN_USER_NAME)),
"List endpoint should also filter by createdBy");
// Test with list endpoint (non-search)
listParams.clear();
listParams.put("createdBy", INGESTION_BOT);
listResults = listEntities(listParams, ADMIN_AUTH_HEADERS);
assertTrue(
listResults.getData().stream().allMatch(tc -> tc.getCreatedBy().equals(INGESTION_BOT)),
"List endpoint should also filter by createdBy");
}
}
}

View File

@ -14,6 +14,7 @@
import { t } from 'i18next';
import { EntityFields } from '../enums/AdvancedSearch.enum';
import { SearchIndex } from '../enums/search.enum';
import { LabelType } from '../generated/type/tagLabel';
export const COMMON_DROPDOWN_ITEMS = [
{
@ -303,6 +304,8 @@ export const RANGE_FIELD_OPERATORS = ['between', 'not_between'];
export const LIST_VALUE_OPERATORS = ['select_equals', 'select_not_equals'];
export const NULL_CHECK_OPERATORS = ['is_null', 'is_not_null'];
export const MISC_FIELDS = ['owner.displayName', 'tags.tagFQN'];
export const OWNER_QUICK_FILTER_DEFAULT_OPTIONS_KEY = 'displayName.keyword';
@ -315,3 +318,11 @@ export const SEARCH_INDICES_WITH_COLUMNS_FIELD = [
SearchIndex.DATA_ASSET,
SearchIndex.ALL,
];
export const TAG_LABEL_TYPE_LIST_VALUES = {
[LabelType.Manual]: t('label.manual'),
[LabelType.Derived]: t('label.derived'),
[LabelType.Propagated]: t('label.propagated'),
[LabelType.Automated]: t('label.automated'),
[LabelType.Generated]: t('label.generated'),
};

View File

@ -71,6 +71,8 @@ export enum EntityFields {
REQUEST_SCHEMA_FIELD = 'requestSchema.schemaFields.name.keyword',
RESPONSE_SCHEMA_FIELD = 'responseSchema.schemaFields.name.keyword',
SERVICE_NAME = 'service.name.keyword',
SUGGESTED_DESCRIPTION = 'descriptionSources.Suggested',
TAGS_LABEL_TYPE = 'tags.labelType',
}
export const EntitySourceFields: Partial<Record<EntityFields, string[]>> = {

View File

@ -129,6 +129,7 @@
"auto-classification": "Automatische Klassifizierung",
"auto-pii-confidence-score": "Auto PII-Vertrauensscore",
"auto-tag-pii-uppercase": "Auto PII-Tag",
"automated": "Automatisiert",
"automatically-generate": "Automatisch generieren",
"average-daily-active-users-on-the-platform": "Durchschnittliche aktive Nutzer auf der Plattoform",
"average-entity": "Durchschnittlicher {{entity}}",
@ -403,6 +404,7 @@
"deployed": "Bereitgestellt",
"deployed-lowercase": "bereitgestellt",
"deploying-lowercase": "am bereitstellen",
"derived": "Abgeleitet",
"description": "Beschreibung",
"description-kpi": "Beschreibung KPI",
"description-lowercase": "beschreibung",
@ -612,6 +614,7 @@
"gcs-credential-value": "GCS-Anmeldeinformation-Wert",
"generate": "Generieren",
"generate-new-token": "Neuen Token generieren",
"generated": "Generiert",
"generated-by": "Erstellt von",
"get-app-support": "Get App Support",
"global-setting-plural": "Globale Einstellungen",
@ -792,6 +795,7 @@
"manage-entity": "{{entity}} verwalten",
"manage-rule": "Regeln verwalten",
"mandatory": "Obligatorisch",
"manual": "Manuell",
"many-to-many": "Many to Many",
"many-to-one": "Many to One",
"march": "März",
@ -1048,6 +1052,7 @@
"project": "Projekt",
"project-id": "Projekt-ID",
"project-lowercase": "projekt",
"propagated": "Weitergeleitet",
"property": "Eigenschaft",
"public-team": "Öffentliches Team",
"quality": "Qualität",
@ -1355,6 +1360,7 @@
"tag": "Tag",
"tag-boost-plural": "Tag-Boosts",
"tag-category-lowercase": "Tag-Kategorie",
"tag-label-type": "Tag-Beschriftungstyp",
"tag-lowercase": "tag",
"tag-lowercase-plural": "tags",
"tag-plural": "Tags",

View File

@ -129,6 +129,7 @@
"auto-classification": "Auto Classification",
"auto-pii-confidence-score": "Auto PII Confidence Score",
"auto-tag-pii-uppercase": "Auto Tag PII",
"automated": "Automated",
"automatically-generate": "Automatically Generate",
"average-daily-active-users-on-the-platform": "Average Daily Active Users on the Platform",
"average-entity": "Avg. {{entity}}",
@ -403,6 +404,7 @@
"deployed": "Deployed",
"deployed-lowercase": "deployed",
"deploying-lowercase": "deploying",
"derived": "Derived",
"description": "Description",
"description-kpi": "Description KPI",
"description-lowercase": "description",
@ -612,6 +614,7 @@
"gcs-credential-value": "GCS Credentials Values",
"generate": "Generate",
"generate-new-token": "Generate New Token",
"generated": "Generated",
"generated-by": "Generated by",
"get-app-support": "Get App Support",
"global-setting-plural": "Global Settings",
@ -792,6 +795,7 @@
"manage-entity": "Manage {{entity}}",
"manage-rule": "Manage Rule",
"mandatory": "Mandatory",
"manual": "Manual",
"many-to-many": "Many to Many",
"many-to-one": "Many to One",
"march": "March",
@ -1048,6 +1052,7 @@
"project": "Project",
"project-id": "Project ID",
"project-lowercase": "project",
"propagated": "Propagated",
"property": "Property",
"public-team": "Public Team",
"quality": "Quality",
@ -1355,6 +1360,7 @@
"tag": "Tag",
"tag-boost-plural": "Tag Boosts",
"tag-category-lowercase": "tag category",
"tag-label-type": "Tag Label Type",
"tag-lowercase": "tag",
"tag-lowercase-plural": "tags",
"tag-plural": "Tags",

View File

@ -129,6 +129,7 @@
"auto-classification": "Clasificación automática",
"auto-pii-confidence-score": "Nivel de Confianza de Auto PII",
"auto-tag-pii-uppercase": "Etiqueta de información personal identificable automática",
"automated": "Automatizado",
"automatically-generate": "Generar automáticamente",
"average-daily-active-users-on-the-platform": "Average Daily Active Users on the Platform",
"average-entity": "Media {{entity}}",
@ -403,6 +404,7 @@
"deployed": "Desplegado",
"deployed-lowercase": "deployed",
"deploying-lowercase": "deploying",
"derived": "Derivado",
"description": "Descripción",
"description-kpi": "Description KPI",
"description-lowercase": "descripción",
@ -612,6 +614,7 @@
"gcs-credential-value": "Valores de credenciales de GCS",
"generate": "Generar",
"generate-new-token": "Generar un nuevo token",
"generated": "Generado",
"generated-by": "Generado por",
"get-app-support": "Soporte para la aplicación",
"global-setting-plural": "Configuración global",
@ -792,6 +795,7 @@
"manage-entity": "Administrar {{entity}}",
"manage-rule": "Administrar regla",
"mandatory": "Obligatorio",
"manual": "Manual",
"many-to-many": "Many to Many",
"many-to-one": "Many to One",
"march": "Marzo",
@ -1048,6 +1052,7 @@
"project": "Proyecto",
"project-id": "ID del proyecto",
"project-lowercase": "proyecto",
"propagated": "Propagado",
"property": "Propiedad",
"public-team": "Equipo público",
"quality": "Calidad",
@ -1355,6 +1360,7 @@
"tag": "Etiqueta",
"tag-boost-plural": "Impulsos de etiquetas",
"tag-category-lowercase": "categoría de etiqueta",
"tag-label-type": "Tipo de etiqueta",
"tag-lowercase": "etiqueta",
"tag-lowercase-plural": "etiquetas",
"tag-plural": "Etiquetas",

View File

@ -129,6 +129,7 @@
"auto-classification": "Classification Automatique",
"auto-pii-confidence-score": "Score de Confiance Auto PII",
"auto-tag-pii-uppercase": "Balise Auto PII",
"automated": "Automatique",
"automatically-generate": "Générer Automatiquement",
"average-daily-active-users-on-the-platform": "Average Daily Active Users on the Platform",
"average-entity": "Moyenne {{entity}}",
@ -403,6 +404,7 @@
"deployed": "Déployé",
"deployed-lowercase": "deployed",
"deploying-lowercase": "deploying",
"derived": "Dérivé",
"description": "Description",
"description-kpi": "Description KPI",
"description-lowercase": "description",
@ -612,6 +614,7 @@
"gcs-credential-value": "Valeur des Identifiants GCS",
"generate": "Générer",
"generate-new-token": "Générer un Nouveau Jeton",
"generated": "Généré",
"generated-by": "Generated by",
"get-app-support": "Get App Support",
"global-setting-plural": "Paramètres globaux",
@ -792,6 +795,7 @@
"manage-entity": "Gérer {{entity}}",
"manage-rule": "Gérer les Règles",
"mandatory": "Obligatoire",
"manual": "Manuel",
"many-to-many": "Many to Many",
"many-to-one": "Many to One",
"march": "Mars",
@ -1048,6 +1052,7 @@
"project": "Projet",
"project-id": "ID du Projet",
"project-lowercase": "projet",
"propagated": "Propagé",
"property": "Propriété",
"public-team": "Équipe Publique",
"quality": "Qualité",
@ -1355,6 +1360,7 @@
"tag": "Tag",
"tag-boost-plural": "Boosts de tags",
"tag-category-lowercase": "catégorie de tag",
"tag-label-type": "Type de balise",
"tag-lowercase": "tag",
"tag-lowercase-plural": "tags",
"tag-plural": "Tags",

View File

@ -129,6 +129,7 @@
"auto-classification": "auto clasificación",
"auto-pii-confidence-score": "Puntuación de confianza automática de PII",
"auto-tag-pii-uppercase": "Etiquetado automático de PII",
"automated": "Automático",
"automatically-generate": "Xerar automaticamente",
"average-daily-active-users-on-the-platform": "Media Usuarios Activos Diarios na Plataforma",
"average-entity": "Media {{entity}}",
@ -403,6 +404,7 @@
"deployed": "Despregado",
"deployed-lowercase": "despregado",
"deploying-lowercase": "despregando",
"derived": "Derivado",
"description": "Descrición",
"description-kpi": "Descrición KPI",
"description-lowercase": "descrición",
@ -612,6 +614,7 @@
"gcs-credential-value": "Valor das credenciais de GCS",
"generate": "Xerar",
"generate-new-token": "Xerar novo token",
"generated": "Xerado",
"generated-by": "Xerado por",
"get-app-support": "Obter soporte de aplicación",
"global-setting-plural": "Configuración global",
@ -792,6 +795,7 @@
"manage-entity": "Xestionar {{entity}}",
"manage-rule": "Xestionar regra",
"mandatory": "Obrigatorio",
"manual": "Manual",
"many-to-many": "Moitos a Moitos",
"many-to-one": "Moitos a Un",
"march": "Marzo",
@ -1048,6 +1052,7 @@
"project": "Proxecto",
"project-id": "ID do proxecto",
"project-lowercase": "proxecto",
"propagated": "Propagado",
"property": "Propiedade",
"public-team": "Equipo público",
"quality": "Calidade",
@ -1355,6 +1360,7 @@
"tag": "Etiqueta",
"tag-boost-plural": "Impulsos de etiquetas",
"tag-category-lowercase": "categoría de etiqueta",
"tag-label-type": "Tipo de etiqueta",
"tag-lowercase": "etiqueta",
"tag-lowercase-plural": "etiquetas",
"tag-plural": "Etiquetas",

View File

@ -129,6 +129,7 @@
"auto-classification": "סיווג אוטומטי",
"auto-pii-confidence-score": "ציון ביטחון PII אוטומטי",
"auto-tag-pii-uppercase": "תיוג PII אוטומטי",
"automated": "אוטומטי",
"automatically-generate": "צור באופן אוטומטי",
"average-daily-active-users-on-the-platform": "Average Daily Active Users on the Platform",
"average-entity": "ממוצע {{entity}}",
@ -403,6 +404,7 @@
"deployed": "נפרס",
"deployed-lowercase": "deployed",
"deploying-lowercase": "deploying",
"derived": "מושך",
"description": "תיאור",
"description-kpi": "Description KPI",
"description-lowercase": "תיאור",
@ -612,6 +614,7 @@
"gcs-credential-value": "ערכי אישור GCS",
"generate": "צור",
"generate-new-token": "צור טוקן חדש",
"generated": "מושך",
"generated-by": "Generated by",
"get-app-support": "קבל תמיכת אפליקציה",
"global-setting-plural": "הגדרות גלובליות",
@ -792,6 +795,7 @@
"manage-entity": "נהל {{entity}}",
"manage-rule": "נהל כלל",
"mandatory": "חובה",
"manual": "ידני",
"many-to-many": "Many to Many",
"many-to-one": "Many to One",
"march": "מרץ",
@ -1048,6 +1052,7 @@
"project": "פרויקט",
"project-id": "מזהה הפרויקט",
"project-lowercase": "פרויקט",
"propagated": "מושך",
"property": "מאפיין",
"public-team": "צוות ציבורי",
"quality": "איכות",
@ -1355,6 +1360,7 @@
"tag": "תג",
"tag-boost-plural": "הגברות תגיות",
"tag-category-lowercase": "קטגוריית תג",
"tag-label-type": "סוג תגיות",
"tag-lowercase": "תג",
"tag-lowercase-plural": "תגיות",
"tag-plural": "תגיות",

View File

@ -129,6 +129,7 @@
"auto-classification": "自動分類",
"auto-pii-confidence-score": "Auto PII Confidence Score",
"auto-tag-pii-uppercase": "自動PIIタグ",
"automated": "自動",
"automatically-generate": "自動生成",
"average-daily-active-users-on-the-platform": "Average Daily Active Users on the Platform",
"average-entity": "平均 {{entity}}",
@ -403,6 +404,7 @@
"deployed": "デプロイされた",
"deployed-lowercase": "deployed",
"deploying-lowercase": "deploying",
"derived": "派生",
"description": "説明",
"description-kpi": "Description KPI",
"description-lowercase": "説明",
@ -612,6 +614,7 @@
"gcs-credential-value": "GCS Credentials Values",
"generate": "生成",
"generate-new-token": "新しいトークンを生成",
"generated": "生成",
"generated-by": "Generated by",
"get-app-support": "Get App Support",
"global-setting-plural": "グローバル設定",
@ -792,6 +795,7 @@
"manage-entity": "{{entity}}の管理",
"manage-rule": "ルールの管理",
"mandatory": "Mandatory",
"manual": "手動",
"many-to-many": "Many to Many",
"many-to-one": "Many to One",
"march": "3月",
@ -1048,6 +1052,7 @@
"project": "Project",
"project-id": "プロジェクトID",
"project-lowercase": "プロジェクト",
"propagated": "伝播",
"property": "プロパティ",
"public-team": "Public Team",
"quality": "品質",
@ -1355,6 +1360,7 @@
"tag": "タグ",
"tag-boost-plural": "タグブースト",
"tag-category-lowercase": "タグのカテゴリ",
"tag-label-type": "タグラベルタイプ",
"tag-lowercase": "タグ",
"tag-lowercase-plural": "tags",
"tag-plural": "タグ",

View File

@ -129,6 +129,7 @@
"auto-classification": "자동 분류",
"auto-pii-confidence-score": "자동 PII 신뢰도 점수",
"auto-tag-pii-uppercase": "PII 자동 태그",
"automated": "자동",
"automatically-generate": "자동 생성",
"average-daily-active-users-on-the-platform": "플랫폼의 일일 평균 활성 사용자 수",
"average-entity": "평균 {{entity}}",
@ -403,6 +404,7 @@
"deployed": "배포됨",
"deployed-lowercase": "배포됨",
"deploying-lowercase": "배포 중",
"derived": "유도됨",
"description": "설명",
"description-kpi": "설명 KPI",
"description-lowercase": "설명",
@ -612,6 +614,7 @@
"gcs-credential-value": "GCS 자격 증명 값",
"generate": "생성",
"generate-new-token": "새 토큰 생성",
"generated": "생성됨",
"generated-by": "생성자",
"get-app-support": "앱 지원 받기",
"global-setting-plural": "전역 설정",
@ -792,6 +795,7 @@
"manage-entity": "{{entity}} 관리",
"manage-rule": "규칙 관리",
"mandatory": "필수",
"manual": "수동",
"many-to-many": "다대다",
"many-to-one": "다대일",
"march": "3월",
@ -1048,6 +1052,7 @@
"project": "프로젝트",
"project-id": "프로젝트 ID",
"project-lowercase": "프로젝트",
"propagated": "전파됨",
"property": "속성",
"public-team": "공개 팀",
"quality": "품질",
@ -1355,6 +1360,7 @@
"tag": "태그",
"tag-boost-plural": "태그 부스트들",
"tag-category-lowercase": "태그 카테고리",
"tag-label-type": "태그 라벨 유형",
"tag-lowercase": "태그",
"tag-lowercase-plural": "태그들",
"tag-plural": "태그들",

View File

@ -129,6 +129,7 @@
"auto-classification": "Auto Classification",
"auto-pii-confidence-score": "ऑटो PII आत्मविश्वास स्कोअर",
"auto-tag-pii-uppercase": "ऑटो टॅग PII",
"automated": "स्वयंचलित",
"automatically-generate": "स्वयंचलितपणे व्युत्पन्न करा",
"average-daily-active-users-on-the-platform": "प्लॅटफॉर्मवरील सरासरी दैनिक सक्रिय वापरकर्ते",
"average-entity": "सरासरी {{entity}}",
@ -403,6 +404,7 @@
"deployed": "उपयोजित केले",
"deployed-lowercase": "उपयोजित केले",
"deploying-lowercase": "उपयोजित करत आहे",
"derived": "व्युत्पन्न",
"description": "वर्णन",
"description-kpi": "वर्णन KPI",
"description-lowercase": "वर्णन",
@ -612,6 +614,7 @@
"gcs-credential-value": "जीसीएस क्रेडेन्शियल मूल्ये",
"generate": "व्युत्पन्न करा",
"generate-new-token": "नवीन टोकन व्युत्पन्न करा",
"generated": "उत्पन्न",
"generated-by": "द्वारे व्युत्पन्न",
"get-app-support": "ॲप समर्थन मिळवा",
"global-setting-plural": "वैश्विक सेटिंग्ज",
@ -792,6 +795,7 @@
"manage-entity": "व्यवस्थापित करा {{entity}}",
"manage-rule": "नियम व्यवस्थापित करा",
"mandatory": "अनिवार्य",
"manual": "मॅन्युअल",
"many-to-many": "अनेक ते अनेक",
"many-to-one": "अनेक ते एक",
"march": "मार्च",
@ -1048,6 +1052,7 @@
"project": "प्रकल्प",
"project-id": "प्रकल्प आयडी",
"project-lowercase": "प्रकल्प",
"propagated": "प्रसारित",
"property": "गुणधर्म",
"public-team": "सार्वजनिक टीम",
"quality": "गुणवत्ता",
@ -1355,6 +1360,7 @@
"tag": "टॅग",
"tag-boost-plural": "टॅग बूस्ट",
"tag-category-lowercase": "टॅग श्रेणी",
"tag-label-type": "टॅग लेबल प्रकार",
"tag-lowercase": "टॅग",
"tag-lowercase-plural": "टॅग्ज",
"tag-plural": "टॅग्ज",

View File

@ -129,6 +129,7 @@
"auto-classification": "Automatische classificatie",
"auto-pii-confidence-score": "Automatische PII-vertrouwensscore",
"auto-tag-pii-uppercase": "Automatisch taggen van PII",
"automated": "Automatisch",
"automatically-generate": "Automatisch genereren",
"average-daily-active-users-on-the-platform": "Average Daily Active Users on the Platform",
"average-entity": "Gemiddeld {{entity}}",
@ -403,6 +404,7 @@
"deployed": "Gedeployed",
"deployed-lowercase": "deployed",
"deploying-lowercase": "deploying",
"derived": "Afgeleid",
"description": "Beschrijving",
"description-kpi": "Description KPI",
"description-lowercase": "beschrijving",
@ -612,6 +614,7 @@
"gcs-credential-value": "Waarden van GCS-verificatiegegevens",
"generate": "Genereren",
"generate-new-token": "Nieuw token genereren",
"generated": "Gegenereerd",
"generated-by": "Gegenereerd door",
"get-app-support": "App-ondersteuning krijgen",
"global-setting-plural": "Globale instellingen",
@ -792,6 +795,7 @@
"manage-entity": "Beheer {{entity}}",
"manage-rule": "Beheer regel",
"mandatory": "Verplicht",
"manual": "Handmatig",
"many-to-many": "Many to Many",
"many-to-one": "Many to One",
"march": "maart",
@ -1048,6 +1052,7 @@
"project": "Project",
"project-id": "Project-ID",
"project-lowercase": "project",
"propagated": "Geëxtend",
"property": "Eigenschap",
"public-team": "Openbaar team",
"quality": "Kwaliteit",
@ -1355,6 +1360,7 @@
"tag": "Tag",
"tag-boost-plural": "Tag boosts",
"tag-category-lowercase": "tagcategorie",
"tag-label-type": "Tag Label Soort",
"tag-lowercase": "tag",
"tag-lowercase-plural": "tags",
"tag-plural": "Tags",

View File

@ -129,6 +129,7 @@
"auto-classification": "طبقه‌بندی خودکار",
"auto-pii-confidence-score": "امتیاز اعتماد PII خودکار",
"auto-tag-pii-uppercase": "برچسب PII خودکار",
"automated": "خودکار",
"automatically-generate": "تولید خودکار",
"average-daily-active-users-on-the-platform": "Average Daily Active Users on the Platform",
"average-entity": "متوسط {{entity}}",
@ -403,6 +404,7 @@
"deployed": "مستقر شد",
"deployed-lowercase": "مستقر شد",
"deploying-lowercase": "در حال استقرار",
"derived": "اشتقاقی",
"description": "توضیحات",
"description-kpi": "توضیحات KPI",
"description-lowercase": "توضیحات",
@ -612,6 +614,7 @@
"gcs-credential-value": "مقادیر اعتبارنامه‌های GCS",
"generate": "تولید",
"generate-new-token": "تولید توکن جدید",
"generated": "تولید شده",
"generated-by": "تولید شده توسط",
"get-app-support": "دریافت پشتیبانی برنامه",
"global-setting-plural": "تنظیمات سراسری",
@ -792,6 +795,7 @@
"manage-entity": "مدیریت {{entity}}",
"manage-rule": "مدیریت قانون",
"mandatory": "اجباری",
"manual": "مندرج",
"many-to-many": "Many to Many",
"many-to-one": "Many to One",
"march": "مارس",
@ -1048,6 +1052,7 @@
"project": "پروژه",
"project-id": "شناسه پروژه",
"project-lowercase": "پروژه",
"propagated": "پراگت",
"property": "ویژگی",
"public-team": "تیم عمومی",
"quality": "کیفیت",
@ -1355,6 +1360,7 @@
"tag": "برچسب",
"tag-boost-plural": "تقویت برچسب‌ها",
"tag-category-lowercase": "دسته‌بندی برچسب",
"tag-label-type": "نوع برچسب",
"tag-lowercase": "برچسب",
"tag-lowercase-plural": "برچسب‌ها",
"tag-plural": "برچسب‌ها",

View File

@ -129,6 +129,7 @@
"auto-classification": "Classificação Automática",
"auto-pii-confidence-score": "Pontuação de Confiança Automática PII",
"auto-tag-pii-uppercase": "Tag automática de PII",
"automated": "Automático",
"automatically-generate": "Gerar Automaticamente",
"average-daily-active-users-on-the-platform": "Média de usuários ativos diários na plataforma",
"average-entity": "Média {{entity}}",
@ -403,6 +404,7 @@
"deployed": "Implementado",
"deployed-lowercase": "implantado",
"deploying-lowercase": "implantando",
"derived": "Derivado",
"description": "Descrição",
"description-kpi": "Descrição KPI",
"description-lowercase": "descrição",
@ -612,6 +614,7 @@
"gcs-credential-value": "Valores das Credenciais GCS",
"generate": "Gerar",
"generate-new-token": "Gerar Novo Token",
"generated": "Gerado",
"generated-by": "Gerado por",
"get-app-support": "Obter Suporte do Aplicativo",
"global-setting-plural": "Configurações globais",
@ -792,6 +795,7 @@
"manage-entity": "Gerenciar {{entity}}",
"manage-rule": "Gerenciar Regra",
"mandatory": "Obrigatório",
"manual": "Manual",
"many-to-many": "Muitos para muitos",
"many-to-one": "Muitos para um",
"march": "Março",
@ -1048,6 +1052,7 @@
"project": "Projeto",
"project-id": "ID do Projeto",
"project-lowercase": "projeto",
"propagated": "Propagado",
"property": "Propriedade",
"public-team": "Equipe Pública",
"quality": "Qualidade",
@ -1355,6 +1360,7 @@
"tag": "Tag",
"tag-boost-plural": "Impulsos de tags",
"tag-category-lowercase": "categoria de tag",
"tag-label-type": "Tipo de rótulo de tag",
"tag-lowercase": "tag",
"tag-lowercase-plural": "tags",
"tag-plural": "Tags",

View File

@ -129,6 +129,7 @@
"auto-classification": "Classificação Automática",
"auto-pii-confidence-score": "Pontuação de Confiança Automática PII",
"auto-tag-pii-uppercase": "Etiqueta Automática PII",
"automated": "Automático",
"automatically-generate": "Gerar Automaticamente",
"average-daily-active-users-on-the-platform": "Average Daily Active Users on the Platform",
"average-entity": "Média {{entity}}",
@ -403,6 +404,7 @@
"deployed": "Implementado",
"deployed-lowercase": "deployed",
"deploying-lowercase": "deploying",
"derived": "Derivado",
"description": "Descrição",
"description-kpi": "Description KPI",
"description-lowercase": "descrição",
@ -612,6 +614,7 @@
"gcs-credential-value": "Valores das Credenciais GCS",
"generate": "Gerar",
"generate-new-token": "Gerar Novo Token",
"generated": "Gerado",
"generated-by": "Generated by",
"get-app-support": "Obter Suporte do Aplicativo",
"global-setting-plural": "Definições globais",
@ -792,6 +795,7 @@
"manage-entity": "Gerenciar {{entity}}",
"manage-rule": "Gerenciar Regra",
"mandatory": "Obrigatório",
"manual": "Manual",
"many-to-many": "Many to Many",
"many-to-one": "Many to One",
"march": "Março",
@ -1048,6 +1052,7 @@
"project": "Projeto",
"project-id": "ID do Projeto",
"project-lowercase": "projeto",
"propagated": "Propagado",
"property": "Propriedade",
"public-team": "Equipa Pública",
"quality": "Qualidade",
@ -1355,6 +1360,7 @@
"tag": "Etiqueta",
"tag-boost-plural": "Impulsos de etiquetas",
"tag-category-lowercase": "categoria de tag",
"tag-label-type": "Tipo de rótulo de tag",
"tag-lowercase": "tag",
"tag-lowercase-plural": "tags",
"tag-plural": "Etiquetas",

View File

@ -129,6 +129,7 @@
"auto-classification": "Автоклассификация",
"auto-pii-confidence-score": "Оценка достоверности Auto PII",
"auto-tag-pii-uppercase": "Автотег PII",
"automated": "Автоматический",
"automatically-generate": "Автоматически генерировать",
"average-daily-active-users-on-the-platform": "Average Daily Active Users on the Platform",
"average-entity": "Среднее {{entity}}",
@ -403,6 +404,7 @@
"deployed": "Развернуто",
"deployed-lowercase": "deployed",
"deploying-lowercase": "deploying",
"derived": "Производный",
"description": "Описание",
"description-kpi": "Description KPI",
"description-lowercase": "описание",
@ -612,6 +614,7 @@
"gcs-credential-value": "Значения учетных данных GCS",
"generate": "Сгенерировать",
"generate-new-token": "Сгенерировать новый токен",
"generated": "Сгенерированный",
"generated-by": "Generated by",
"get-app-support": "Get App Support",
"global-setting-plural": "Глобальные настройки",
@ -792,6 +795,7 @@
"manage-entity": "Управление {{entity}}",
"manage-rule": "Правила управления",
"mandatory": "Обязательный",
"manual": "Ручной",
"many-to-many": "Many to Many",
"many-to-one": "Many to One",
"march": "Март",
@ -1048,6 +1052,7 @@
"project": "Проект",
"project-id": "ID проекта",
"project-lowercase": "проект",
"propagated": "Распространяется",
"property": "Свойство",
"public-team": "Открытая команда",
"quality": "Качество",
@ -1355,6 +1360,7 @@
"tag": "Тег",
"tag-boost-plural": "Усиления тегов",
"tag-category-lowercase": "тег категории",
"tag-label-type": "Тип метки тега",
"tag-lowercase": "тег",
"tag-lowercase-plural": "теги",
"tag-plural": "Теги",

View File

@ -129,6 +129,7 @@
"auto-classification": "การจำแนกประเภทอัตโนมัติ",
"auto-pii-confidence-score": "คะแนนความมั่นใจ PII อัตโนมัติ",
"auto-tag-pii-uppercase": "แท็ก PII อัตโนมัติ",
"automated": "อัตโนมัติ",
"automatically-generate": "สร้างโดยอัตโนมัติ",
"average-daily-active-users-on-the-platform": "Average Daily Active Users on the Platform",
"average-entity": "ค่าเฉลี่ย {{entity}}",
@ -403,6 +404,7 @@
"deployed": "เรียกใช้แล้ว",
"deployed-lowercase": "ถูกเรียกใช้",
"deploying-lowercase": "กำลังเรียกใช้",
"derived": "ออกมาจาก",
"description": "คำอธิบาย",
"description-kpi": "คำอธิบาย KPI",
"description-lowercase": "คำอธิบาย",
@ -612,6 +614,7 @@
"gcs-credential-value": "ค่าเครดิตเชียล GCS",
"generate": "สร้าง",
"generate-new-token": "สร้างโทเค็นใหม่",
"generated": "สร้างขึ้น",
"generated-by": "สร้างโดย",
"get-app-support": "ขอความช่วยเหลือจากแอป",
"global-setting-plural": "การตั้งค่าทั่วไป",
@ -792,6 +795,7 @@
"manage-entity": "จัดการ {{entity}}",
"manage-rule": "จัดการกฎ",
"mandatory": "บังคับ",
"manual": "มืออาชีพ",
"many-to-many": "หลายต่อหลาย",
"many-to-one": "หลายต่อหนึ่ง",
"march": "มีนาคม",
@ -1048,6 +1052,7 @@
"project": "โปรเจค",
"project-id": "รหัสโปรเจค",
"project-lowercase": "โปรเจค",
"propagated": "กระจาย",
"property": "คุณสมบัติ",
"public-team": "ทีมสาธารณะ",
"quality": "คุณภาพ",
@ -1355,6 +1360,7 @@
"tag": "แท็ก",
"tag-boost-plural": "การเพิ่มประสิทธิภาพแท็ก",
"tag-category-lowercase": "หมวดหมู่แท็ก",
"tag-label-type": "ประเภทป้ายกำกับ",
"tag-lowercase": "แท็ก",
"tag-lowercase-plural": "แท็กหลายรายการ",
"tag-plural": "แท็กหลายรายการ",

View File

@ -129,6 +129,7 @@
"auto-classification": "Otomatik Sınıflandırma",
"auto-pii-confidence-score": "Otomatik KVT Güven Skoru",
"auto-tag-pii-uppercase": "KVT'yi Otomatik Etiketle",
"automated": "Otomatik",
"automatically-generate": "Otomatik Oluştur",
"average-daily-active-users-on-the-platform": "Platformdaki Ortalama Günlük Aktif Kullanıcı Sayısı",
"average-entity": "Ort. {{entity}}",
@ -403,6 +404,7 @@
"deployed": "Dağıtıldı",
"deployed-lowercase": "dağıtıldı",
"deploying-lowercase": "dağıtılıyor",
"derived": "Türetilmiş",
"description": "Açıklama",
"description-kpi": "Açıklama KPI'ı",
"description-lowercase": "açıklama",
@ -612,6 +614,7 @@
"gcs-credential-value": "GCS Kimlik Bilgileri Değerleri",
"generate": "Oluştur",
"generate-new-token": "Yeni Anahtar Oluştur",
"generated": "Oluşturuldu",
"generated-by": "Oluşturan",
"get-app-support": "Uygulama Desteği Al",
"global-setting-plural": "Global Ayarlar",
@ -792,6 +795,7 @@
"manage-entity": "{{entity}} Yönet",
"manage-rule": "Kuralı Yönet",
"mandatory": "Zorunlu",
"manual": "El ile",
"many-to-many": "Çoka Çok",
"many-to-one": "Çoka Bir",
"march": "Mart",
@ -1048,6 +1052,7 @@
"project": "Proje",
"project-id": "Proje Kimliği",
"project-lowercase": "proje",
"propagated": "Yayılır",
"property": "Özellik",
"public-team": "Herkese Açık Takım",
"quality": "Kalite",
@ -1355,6 +1360,7 @@
"tag": "Etiket",
"tag-boost-plural": "Etiket Destekleri",
"tag-category-lowercase": "etiket kategorisi",
"tag-label-type": "Etiket Etiket Türü",
"tag-lowercase": "etiket",
"tag-lowercase-plural": "etiketler",
"tag-plural": "Etiketler",

View File

@ -129,6 +129,7 @@
"auto-classification": "自动分类",
"auto-pii-confidence-score": "自动计算 PII 信任值",
"auto-tag-pii-uppercase": "自动标记 PII",
"automated": "自动",
"automatically-generate": "自动生成",
"average-daily-active-users-on-the-platform": "Average Daily Active Users on the Platform",
"average-entity": "平均 {{entity}}",
@ -403,6 +404,7 @@
"deployed": "已部署",
"deployed-lowercase": "deployed",
"deploying-lowercase": "deploying",
"derived": "衍生",
"description": "描述",
"description-kpi": "Description KPI",
"description-lowercase": "描述",
@ -612,6 +614,7 @@
"gcs-credential-value": "GCS 凭证值",
"generate": "生成",
"generate-new-token": "生成新令牌",
"generated": "生成",
"generated-by": "生成自",
"get-app-support": "Get App Support",
"global-setting-plural": "全局设置",
@ -792,6 +795,7 @@
"manage-entity": "管理{{entity}}",
"manage-rule": "管理规则",
"mandatory": "必填",
"manual": "手动",
"many-to-many": "Many to Many",
"many-to-one": "Many to One",
"march": "三月",
@ -1048,6 +1052,7 @@
"project": "项目",
"project-id": "项目 ID",
"project-lowercase": "项目",
"propagated": "传播",
"property": "属性",
"public-team": "公开的团队",
"quality": "质控",
@ -1355,6 +1360,7 @@
"tag": "标签",
"tag-boost-plural": "标签提升",
"tag-category-lowercase": "标签分类",
"tag-label-type": "标签类型",
"tag-lowercase": "标签",
"tag-lowercase-plural": "标签",
"tag-plural": "标签",

View File

@ -50,6 +50,8 @@ describe('AdvancedSearchClassBase', () => {
'extension',
'descriptionStatus',
'entityType',
'descriptionSources.Suggested',
'tags.labelType',
]);
});
});

View File

@ -25,8 +25,10 @@ import AntdConfig from 'react-awesome-query-builder/lib/config/antd';
import { CustomPropertyEnumConfig } from '../components/Explore/AdvanceSearchProvider/AdvanceSearchProvider.interface';
import {
LIST_VALUE_OPERATORS,
NULL_CHECK_OPERATORS,
RANGE_FIELD_OPERATORS,
SEARCH_INDICES_WITH_COLUMNS_FIELD,
TAG_LABEL_TYPE_LIST_VALUES,
TEXT_FIELD_OPERATORS,
} from '../constants/AdvancedSearch.constants';
import {
@ -724,6 +726,22 @@ class AdvancedSearchClassBase {
useAsyncSearch: true,
},
},
[EntityFields.SUGGESTED_DESCRIPTION]: {
label: t('label.suggested-description'),
type: 'select',
operators: NULL_CHECK_OPERATORS,
mainWidgetProps: this.mainWidgetProps,
valueSources: ['value'],
},
[EntityFields.TAGS_LABEL_TYPE]: {
label: t('label.tag-label-type'),
type: 'select',
mainWidgetProps: this.mainWidgetProps,
valueSources: ['value'],
fieldSettings: {
listValues: TAG_LABEL_TYPE_LIST_VALUES,
},
},
};
}