From 96da10dc78f394aa25617849229d746c374c62fb Mon Sep 17 00:00:00 2001 From: ssaksena Date: Wed, 27 May 2026 18:18:40 +0530 Subject: [PATCH] ATLAS-5032: Long qualifiedName basic search fix --- .../apache/atlas/repository/Constants.java | 1 + .../atlas/discovery/SearchProcessor.java | 13 ++ .../discovery/EntitySearchProcessorTest.java | 217 +++++++++++++++++- 3 files changed, 227 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/org/apache/atlas/repository/Constants.java b/common/src/main/java/org/apache/atlas/repository/Constants.java index 13f36c4b479..85d6bfa5017 100644 --- a/common/src/main/java/org/apache/atlas/repository/Constants.java +++ b/common/src/main/java/org/apache/atlas/repository/Constants.java @@ -152,6 +152,7 @@ public final class Constants { public static final String INDEX_SEARCH_MAX_RESULT_SET_SIZE = "atlas.graph.index.search.max-result-set-size"; public static final String INDEX_SEARCH_TYPES_MAX_QUERY_STR_LENGTH = "atlas.graph.index.search.types.max-query-str-length"; public static final String INDEX_SEARCH_TAGS_MAX_QUERY_STR_LENGTH = "atlas.graph.index.search.tags.max-query-str-length"; + public static final String INDEX_SEARCH_SOLR_MAX_TOKEN_LENGTH = "atlas.graph.solr.index.search.max-token-length"; public static final String INDEX_SEARCH_VERTEX_PREFIX_PROPERTY = "atlas.graph.index.search.vertex.prefix"; public static final String INDEX_SEARCH_VERTEX_PREFIX_DEFAULT = "$v$"; public static final String MAX_FULLTEXT_QUERY_STR_LENGTH = "atlas.graph.fulltext-max-query-str-length"; diff --git a/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java b/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java index 25897b65645..51dcfe97d61 100644 --- a/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java +++ b/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java @@ -112,6 +112,7 @@ public abstract class SearchProcessor { public static final int MAX_RESULT_SIZE = getApplicationProperty(Constants.INDEX_SEARCH_MAX_RESULT_SET_SIZE, 150); public static final int MAX_QUERY_STR_LENGTH_TYPES = getApplicationProperty(Constants.INDEX_SEARCH_TYPES_MAX_QUERY_STR_LENGTH, 512); public static final int MAX_QUERY_STR_LENGTH_TAGS = getApplicationProperty(Constants.INDEX_SEARCH_TAGS_MAX_QUERY_STR_LENGTH, 512); + public static final int SOLR_MAX_TOKEN_STR_LENGTH = getApplicationProperty(Constants.INDEX_SEARCH_SOLR_MAX_TOKEN_LENGTH, 255); public static final String INDEX_SEARCH_PREFIX = AtlasGraphUtilsV2.getIndexSearchPrefix(); public static final String AND_STR = " AND "; public static final String EMPTY_STRING = ""; @@ -671,6 +672,10 @@ protected AtlasGraphQuery toGraphFilterQuery(Set stru for (AtlasStructType structType : structTypes) { String qualifiedName = structType.getVertexPropertyName(criteria.getAttributeName()); + if (isIndexSearchable(criteria, structType)) { + LOG.debug("toGraphFilterQuery() ==> skipped attribute: {}, filter value: {}, and operator: {}", criteria.getAttributeName(), criteria.getAttributeValue(), criteria.getOperator()); + continue; + } if (filterAttributes.contains(qualifiedName)) { String attrName = criteria.getAttributeName(); @@ -866,6 +871,10 @@ private boolean isIndexSearchable(FilterCriteria filterCriteria, AtlasStructType } else if (operator == SearchParameters.Operator.CONTAINS && AtlasAttribute.hastokenizeChar(attributeValue) && indexType == null) { // indexType = TEXT LOG.debug("{} operator found for string (TEXT) attribute {} and special characters found in filter value {}, deferring to in-memory or graph query (might cause poor performance)", operator, qualifiedName, attributeValue); + ret = false; + } else if ((operator == SearchParameters.Operator.STARTS_WITH || operator == SearchParameters.Operator.ENDS_WITH || operator == SearchParameters.Operator.CONTAINS) && attributeValue.length() > SOLR_MAX_TOKEN_STR_LENGTH) { + LOG.debug("{} operator found for string attribute {} (SOLR MAX TOKEN STR LENGTH:{}) and filter value {}, deferring to in-memory or graph query (might cause poor performance)", operator, qualifiedName, SOLR_MAX_TOKEN_STR_LENGTH, attributeValue); + ret = false; } } @@ -920,6 +929,10 @@ private String toIndexQuery(Set structTypes, FilterCr ArrayList orExpQuery = new ArrayList<>(); for (AtlasStructType structType : structTypes) { + if (!isIndexSearchable(criteria, structType)) { + LOG.debug("toIndexQuery() ==> skipped attribute: {}, and filter value: {}, and operator: {}", criteria.getAttributeName(), criteria.getAttributeValue(), criteria.getOperator()); + continue; + } String name = structType.getVertexPropertyName(criteria.getAttributeName()); if (filterAttributes.contains(name)) { diff --git a/repository/src/test/java/org/apache/atlas/discovery/EntitySearchProcessorTest.java b/repository/src/test/java/org/apache/atlas/discovery/EntitySearchProcessorTest.java index bb5056d8e47..4826d58901e 100644 --- a/repository/src/test/java/org/apache/atlas/discovery/EntitySearchProcessorTest.java +++ b/repository/src/test/java/org/apache/atlas/discovery/EntitySearchProcessorTest.java @@ -17,6 +17,7 @@ */ package org.apache.atlas.discovery; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import org.apache.atlas.AtlasClient; import org.apache.atlas.BasicTestSetup; @@ -26,6 +27,7 @@ import org.apache.atlas.model.discovery.SearchParameters; import org.apache.atlas.model.instance.AtlasClassification; import org.apache.atlas.model.instance.AtlasEntity; +import org.apache.atlas.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo; import org.apache.atlas.model.instance.AtlasEntityHeader; import org.apache.atlas.model.instance.EntityMutationResponse; import org.apache.atlas.repository.Constants; @@ -35,6 +37,7 @@ import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.repository.store.graph.v2.AtlasEntityStream; import org.apache.atlas.repository.store.graph.v2.EntityGraphRetriever; +import org.apache.atlas.type.AtlasEntityType; import org.apache.atlas.type.AtlasTypeRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,6 +67,14 @@ public class EntitySearchProcessorTest extends BasicTestSetup { private static final Logger LOG = LoggerFactory.getLogger(EntitySearchProcessorTest.class); + private static final String HIVE_COLUMN_TYPE = "hive_column"; + + private static final String LONG_TABLE_NAME = + "rltdvhrxhocivajyqojaxulwzhgzgzpkfolziacfnndzncjkthzeaeykdhhrjqdeibhdgiepwqkinvqzqxevushydtwjaabzgbfjmzvcbsoxewruhyhciyjefzsnokxvbeiiowzbhlkmujcnwilslgeswobzwwvkugyupsemqxsbdcmgrlpxmeuljvxyddvpccvcloupjorziwhogwnjvsdrwksvrbxcxjlcrcmrvvmbdmenafmvgrqzcaqbgpnhxiqbvxcbnudafsmjzvlzzzzpqmjkngbximmbjbijrqfb"; + + private static final String LONG_TOKENIZED_TABLE_NAME = + "rrrrtokenizeeeeivajaxulwzhgzgzpkfoianndzncjkthzeaeykdhhrjqdeibhdgiepwqkinvqzqxevushydtwjaabzgbfjmzvcbsoxewruhyhciyjefzsnokxvbeiiowzbhlkmujcnwilslgeswobzwwvkugyupsemqxsbdcmgrlpxmeuljvxyddvpccvcloupjogrqzcaqbgpnhxiqbvxcbnudafsmaajzvlzzzzpqmjkngbximmbjbijrq1"; + private static final SimpleDateFormat FORMATTED_DATE = new SimpleDateFormat("dd-MMM-yyyy"); private static final String EXPECTED_ENTITY_NAME = "hive_Table_Null_tableType"; private static final TimeZone TIME_ZONE_UTC = TimeZone.getTimeZone("UTC"); @@ -88,6 +99,7 @@ public void setup() throws Exception { super.initialize(); setupTestData(); + createLongQualifiedNameTestEntities(); createJapaneseEntityWithDescription(); createChineseEntityWithDescription(); FORMATTED_DATE.setTimeZone(TIME_ZONE_UTC); @@ -200,7 +212,7 @@ public void searchWithNEQ_pipeSeperatedAttr() throws AtlasBaseException { EntitySearchProcessor processor = new EntitySearchProcessor(context); List vertices = processor.execute(); - assertEquals(vertices.size(), 7); + assertEquals(vertices.size(), 10); List nameList = new ArrayList<>(); for (AtlasVertex vertex : vertices) { @@ -278,7 +290,7 @@ public void entityTypes() throws AtlasBaseException { SearchContext context = new SearchContext(params, typeRegistry, graph, Collections.emptySet()); EntitySearchProcessor processor = new EntitySearchProcessor(context); - assertEquals(processor.execute().size(), 14); + assertEquals(processor.execute().size(), 17); } @Test(expectedExceptions = AtlasBaseException.class, expectedExceptionsMessageRegExp = "Not_Exists: Unknown/invalid typename") @@ -377,7 +389,7 @@ public void searchWithNotContains_pipeSeperatedAttr() throws AtlasBaseException EntitySearchProcessor processor = new EntitySearchProcessor(context); List vertices = processor.execute(); - assertEquals(vertices.size(), 7); + assertEquals(vertices.size(), 10); List nameList = new ArrayList<>(); for (AtlasVertex vertex : vertices) { @@ -792,6 +804,131 @@ public void searchWithNameBeginswith() throws AtlasBaseException { assertTrue(guids.contains(cjkGuid2)); } + @Test + public void searchTablesByQualifiedNameBeginswithAndEndswith() throws AtlasBaseException { + SearchParameters.FilterCriteria filterCriteria = new SearchParameters.FilterCriteria(); + List lstCriterion = new ArrayList<>(); + + filterCriteria.setCondition(SearchParameters.FilterCriteria.Condition.AND); + + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.STARTS_WITH, "Sales.sample_table")); + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.ENDS_WITH, "@cl1")); + filterCriteria.setCriterion(lstCriterion); + + SearchParameters params = getSearchParameters(HIVE_TABLE_TYPE, filterCriteria, 20); + SearchContext context = new SearchContext(params, typeRegistry, graph, indexer.getVertexIndexKeys()); + EntitySearchProcessor processor = new EntitySearchProcessor(context); + List vertices = processor.execute(); + + assertEquals(vertices.size(), 1); + } + + @Test + public void searchTablesByLongQualifiedNameBeginswithAndEndswith() throws AtlasBaseException { + SearchParameters.FilterCriteria filterCriteria = new SearchParameters.FilterCriteria(); + filterCriteria.setCondition(SearchParameters.FilterCriteria.Condition.AND); + List lstCriterion = new ArrayList<>(); + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.STARTS_WITH, "Sales.rltdvhrxhocivajyqojaxulwzhgzgzpkfolziacfnndzncjkthzeaeykdhhrjqdeibhdgiepwqkinvqzqxevushydtwjaabzgbfjmzvcbsoxewruhyhciyjefzsnokxvbeiiowzbhlkmujcnwilslgeswobzwwvkugyupsemqxsbdcmgrlpxmeuljvxyddvpccvcloupjorziwhogwnjvsdrwksvrbxcxjlcrcmrvvmbdmenafmvgrqzcaqbgpnhxiqbvxcbnudafsmjzvlzzzzpqmjkngbximmbjbijrqfb")); + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.ENDS_WITH, "@cl1")); + filterCriteria.setCriterion(lstCriterion); + + SearchParameters params = getSearchParameters(HIVE_TABLE_TYPE, filterCriteria, 20); + SearchContext context = new SearchContext(params, typeRegistry, graph, indexer.getVertexIndexKeys()); + EntitySearchProcessor processor = new EntitySearchProcessor(context); + List vertices = processor.execute(); + + assertEquals(vertices.size(), 1); + } + + @Test + public void searchColumnsByQualifiedNameBeginswithAndEndswith() throws AtlasBaseException { + SearchParameters.FilterCriteria filterCriteria = new SearchParameters.FilterCriteria(); + filterCriteria.setCondition(SearchParameters.FilterCriteria.Condition.AND); + List lstCriterion = new ArrayList<>(); + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.STARTS_WITH, "Sales.sample_table.")); + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.ENDS_WITH, "@cl1")); + filterCriteria.setCriterion(lstCriterion); + + SearchParameters params = getSearchParameters(HIVE_COLUMN_TYPE, filterCriteria, 20); + SearchContext context = new SearchContext(params, typeRegistry, graph, indexer.getVertexIndexKeys()); + EntitySearchProcessor processor = new EntitySearchProcessor(context); + List vertices = processor.execute(); + + assertEquals(vertices.size(), 6); + } + + @Test + public void searchColumnsByLongQualifiedNameBeginswithAndEndswith() throws AtlasBaseException { + SearchParameters.FilterCriteria filterCriteria = new SearchParameters.FilterCriteria(); + filterCriteria.setCondition(SearchParameters.FilterCriteria.Condition.AND); + List lstCriterion = new ArrayList<>(); + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.STARTS_WITH, "Sales.rltdvhrxhocivajyqojaxulwzhgzgzpkfolziacfnndzncjkthzeaeykdhhrjqdeibhdgiepwqkinvqzqxevushydtwjaabzgbfjmzvcbsoxewruhyhciyjefzsnokxvbeiiowzbhlkmujcnwilslgeswobzwwvkugyupsemqxsbdcmgrlpxmeuljvxyddvpccvcloupjorziwhogwnjvsdrwksvrbxcxjlcrcmrvvmbdmenafmvgrqzcaqbgpnhxiqbvxcbnudafsmjzvlzzzzpqmjkngbximmbjbijrqfb.")); + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.ENDS_WITH, "@cl1")); + filterCriteria.setCriterion(lstCriterion); + + SearchParameters params = getSearchParameters(HIVE_COLUMN_TYPE, filterCriteria, 20); + SearchContext context = new SearchContext(params, typeRegistry, graph, indexer.getVertexIndexKeys()); + EntitySearchProcessor processor = new EntitySearchProcessor(context); + List vertices = processor.execute(); + + assertEquals(vertices.size(), 5); + } + + @Test + public void searchTablesByLongTokenizedQualifiedNameBeginswithAndEndswith() throws AtlasBaseException { + SearchParameters.FilterCriteria filterCriteria = new SearchParameters.FilterCriteria(); + filterCriteria.setCondition(SearchParameters.FilterCriteria.Condition.AND); + List lstCriterion = new ArrayList<>(); + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.STARTS_WITH, "Sales.rrrrtokenizeeeeivajaxulwzhgzgzpkfoianndzncjkthzeaeykdhhrjqdeibhdgiepwqkinvqzqxevushydtwjaabzgbfjmzvcbsoxewruhyhciyjefzsnokxvbeiiowzbhlkmujcnwilslgeswobzwwvkugyupsemqxsbdcmgrlpxmeuljvxyddvpccvcloupjogrqzcaqbgpnhxiqbvxcbnudafsmaajzvlzzzzpqmjkngbximmbjbijrq1")); + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.ENDS_WITH, "@cl1")); + filterCriteria.setCriterion(lstCriterion); + + SearchParameters params = getSearchParameters(HIVE_TABLE_TYPE, filterCriteria, 20); + SearchContext context = new SearchContext(params, typeRegistry, graph, indexer.getVertexIndexKeys()); + EntitySearchProcessor processor = new EntitySearchProcessor(context); + List vertices = processor.execute(); + + assertEquals(vertices.size(), 1); + } + + @Test + public void searchTablesByQualifiedNameContainsAndEndswith() throws AtlasBaseException { + SearchParameters.FilterCriteria filterCriteria = new SearchParameters.FilterCriteria(); + List lstCriterion = new ArrayList<>(); + + filterCriteria.setCondition(SearchParameters.FilterCriteria.Condition.AND); + + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.CONTAINS, ".sample_table")); + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.ENDS_WITH, "@cl1")); + filterCriteria.setCriterion(lstCriterion); + + SearchParameters params = getSearchParameters(HIVE_TABLE_TYPE, filterCriteria, 20); + SearchContext context = new SearchContext(params, typeRegistry, graph, indexer.getVertexIndexKeys()); + EntitySearchProcessor processor = new EntitySearchProcessor(context); + List vertices = processor.execute(); + + assertEquals(vertices.size(), 1); + } + + @Test + public void searchTableByLongQualifiedNameContainsAndEndswith() throws AtlasBaseException { + SearchParameters.FilterCriteria filterCriteria = new SearchParameters.FilterCriteria(); + List lstCriterion = new ArrayList<>(); + + filterCriteria.setCondition(SearchParameters.FilterCriteria.Condition.AND); + + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.CONTAINS, ".rltdvhrxhocivajyqojaxulwzhgzgzpkfolziacfnndzncjkthzeaeykdhhrjqdeibhdgiepwqkinvqzqxevushydtwjaabzgbfjmzvcbsoxewruhyhciyjefzsnokxvbeiiowzbhlkmujcnwilslgeswobzwwvkugyupsemqxsbdcmgrlpxmeuljvxyddvpccvcloupjorziwhogwnjvsdrwksvrbxcxjlcrcmrvvmbdmenafmvgrqzcaqbgpnhxiqbvxcbnudafsmjzvlzzzzpqmjkngbximmbjbijrqfb")); + lstCriterion.add(getSingleFilterCriteria(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, SearchParameters.Operator.ENDS_WITH, "@cl1")); + filterCriteria.setCriterion(lstCriterion); + + SearchParameters params = getSearchParameters(HIVE_TABLE_TYPE, filterCriteria, 20); + SearchContext context = new SearchContext(params, typeRegistry, graph, indexer.getVertexIndexKeys()); + EntitySearchProcessor processor = new EntitySearchProcessor(context); + List vertices = processor.execute(); + + assertEquals(vertices.size(), 1); + } + private static SearchParameters.FilterCriteria filtercriteriaDateRange(String attributeValue, AtlasTypeRegistry typeRegistry, AtlasGraph graph) throws AtlasBaseException { SearchParameters.FilterCriteria filterCriteria = new SearchParameters.FilterCriteria(); SearchParameters params = new SearchParameters(); @@ -857,6 +994,78 @@ public void testEntitySearchApproxCountForAllLimits(int limit) throws AtlasBaseE SearchContext context = new SearchContext(params, typeRegistry, graph, Collections.emptySet()); EntitySearchProcessor processor = new EntitySearchProcessor(context); - assertEquals(processor.getResultCount(), 11); + assertEquals(processor.getResultCount(), 14); + } + + private void createLongQualifiedNameTestEntities() throws AtlasBaseException { + AtlasEntityType entityType = typeRegistry.getEntityTypeByName(DATABASE_TYPE); + AtlasEntity salesDB = entityStore.getByUniqueAttributes(entityType, + Collections.singletonMap(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, "qualified:Sales")).getEntity(); + + AtlasEntity sd = storageDescriptor("hdfs://host:8000/apps/warehouse/sales", "TextInputFormat", "TextOutputFormat", true, + ImmutableList.of(column("time_id", "int", "time id"))); + + List entities = new ArrayList<>(); + entities.add(sd); + + List sampleColumns = ImmutableList.of(column("sm_time_id", "int", "time id"), + column("sm_product_id", "int", "product id"), + column("sm_customer_id", "int", "customer id"), + column("sm_sales", "double", "product id"), + column("sm_test", "int", "test 1"), + column("sm_test_limit", "int", "test limit 1")); + + entities.addAll(sampleColumns); + entities.add(createTableWithClusterQualifiedName("sample_table", "sample table", salesDB, sd, "Dev 1", "Managed", sampleColumns)); + + List longTableNameColumns = ImmutableList.of(column("l_id", "int", "time id"), + column("l_product_id", "int", "product id"), + column("l_customer_id", "int", "customer id"), + column("l_sales", "double", "product id"), + column("l_test", "int", "test 1")); + + entities.addAll(longTableNameColumns); + entities.add(createTableWithClusterQualifiedName(LONG_TABLE_NAME, "table name length 300", salesDB, sd, "Dev 2", "Managed", longTableNameColumns)); + + List longTokenizeTableNameColumns = ImmutableList.of(column("l_tknz_id", "int", "time id"), + column("l_tknz_product_id", "int", "product id"), + column("l_tknz_sales", "double", "product id"), + column("l_tknz_test", "int", "test 1")); + + entities.addAll(longTokenizeTableNameColumns); + entities.add(createTableWithClusterQualifiedName(LONG_TOKENIZED_TABLE_NAME, "table name length 300, Tokenized", salesDB, sd, "Dev 3", "Managed", longTokenizeTableNameColumns)); + + entityStore.createOrUpdate(new AtlasEntityStream(new AtlasEntitiesWithExtInfo(entities)), false); + } + + private AtlasEntity createTableWithClusterQualifiedName(String name, String description, AtlasEntity db, AtlasEntity sd, + String owner, String tableType, List columns, String... traitNames) { + AtlasEntity table = table(name, description, db, sd, owner, tableType, columns, traitNames); + String dbName = db.getAttribute(AtlasClient.NAME).toString(); + String clusterName = db.getAttribute("clusterName").toString(); + + table.setAttribute(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, dbName + "." + name + "@" + clusterName); + + return table; + } + + private SearchParameters.FilterCriteria getSingleFilterCriteria(String attName, SearchParameters.Operator op, String attrValue) { + SearchParameters.FilterCriteria filterCriteria = new SearchParameters.FilterCriteria(); + filterCriteria.setAttributeName(attName); + filterCriteria.setOperator(op); + filterCriteria.setAttributeValue(attrValue); + + return filterCriteria; + } + + private SearchParameters getSearchParameters(String typeName, SearchParameters.FilterCriteria entityFilter, int limit) { + SearchParameters params = new SearchParameters(); + params.setTypeName(typeName); + if (entityFilter != null) { + params.setEntityFilters(entityFilter); + } + params.setLimit(limit); + + return params; } }