This is an automated email from the ASF dual-hosted git repository.
madhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/master by this push:
new 0c1c390dd ATLAS-5073: ensure propertyKey is created before using it
(#401)
0c1c390dd is described below
commit 0c1c390dd94b6aed05b0386f80c43fb5de5d4566
Author: Madhan Neethiraj <[email protected]>
AuthorDate: Wed Jul 16 08:39:22 2025 -0700
ATLAS-5073: ensure propertyKey is created before using it (#401)
---
addons/kafka-bridge/pom.xml | 6 --
.../repository/graph/GraphBackedSearchIndexer.java | 24 ++++++++
.../store/graph/v2/AtlasAbstractDefStoreV2.java | 8 +++
.../store/graph/v2/AtlasEnumDefStoreV2.java | 55 ++++++++++++++---
.../store/graph/v2/AtlasStructDefStoreV2.java | 71 ++++++++++++++++------
.../resources/solr/core-template/solrconfig.xml | 2 +-
6 files changed, 133 insertions(+), 33 deletions(-)
diff --git a/addons/kafka-bridge/pom.xml b/addons/kafka-bridge/pom.xml
index 1f0f54eab..ba4923000 100644
--- a/addons/kafka-bridge/pom.xml
+++ b/addons/kafka-bridge/pom.xml
@@ -342,12 +342,6 @@
</resources>
</configuration>
</execution>
- </executions>
- </plugin>
-
- <plugin>
- <artifactId>maven-resources-plugin</artifactId>
- <executions>
<execution>
<id>copy-solr-resources</id>
<goals>
diff --git
a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
index 4512ac63d..3abb3db3f 100755
---
a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
+++
b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
@@ -90,6 +90,8 @@ import static
org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_INT;
import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_LONG;
import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_SHORT;
import static
org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_STRING;
+import static
org.apache.atlas.repository.Constants.ATTRIBUTE_INDEX_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.ATTRIBUTE_KEY_PROPERTY_KEY;
import static org.apache.atlas.repository.Constants.BACKING_INDEX;
import static
org.apache.atlas.repository.Constants.CLASSIFICATION_EDGE_IS_PROPAGATED_PROPERTY_KEY;
import static
org.apache.atlas.repository.Constants.CLASSIFICATION_EDGE_NAME_PROPERTY_KEY;
@@ -121,6 +123,11 @@ import static
org.apache.atlas.repository.Constants.PROPAGATED_TRAIT_NAMES_PROPE
import static
org.apache.atlas.repository.Constants.PROPERTY_KEY_AUDIT_REDUCTION_NAME;
import static
org.apache.atlas.repository.Constants.PROPERTY_KEY_INDEX_RECOVERY_NAME;
import static org.apache.atlas.repository.Constants.PROVENANCE_TYPE_KEY;
+import static
org.apache.atlas.repository.Constants.RELATIONSHIPTYPE_CATEGORY_KEY;
+import static org.apache.atlas.repository.Constants.RELATIONSHIPTYPE_END1_KEY;
+import static org.apache.atlas.repository.Constants.RELATIONSHIPTYPE_END2_KEY;
+import static org.apache.atlas.repository.Constants.RELATIONSHIPTYPE_LABEL_KEY;
+import static
org.apache.atlas.repository.Constants.RELATIONSHIPTYPE_TAG_PROPAGATION_KEY;
import static
org.apache.atlas.repository.Constants.RELATIONSHIP_GUID_PROPERTY_KEY;
import static
org.apache.atlas.repository.Constants.RELATIONSHIP_TYPE_PROPERTY_KEY;
import static org.apache.atlas.repository.Constants.STATE_PROPERTY_KEY;
@@ -131,8 +138,13 @@ import static
org.apache.atlas.repository.Constants.TASK_STATUS;
import static org.apache.atlas.repository.Constants.TASK_TYPE_PROPERTY_KEY;
import static org.apache.atlas.repository.Constants.TIMESTAMP_PROPERTY_KEY;
import static org.apache.atlas.repository.Constants.TRAIT_NAMES_PROPERTY_KEY;
+import static
org.apache.atlas.repository.Constants.TYPEDESCRIPTION_PROPERTY_KEY;
import static org.apache.atlas.repository.Constants.TYPENAME_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.TYPEOPTIONS_PROPERTY_KEY;
import static
org.apache.atlas.repository.Constants.TYPESERVICETYPE_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.TYPEVERSION_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.TYPE_CATEGORY_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.VERSION_PROPERTY_KEY;
import static org.apache.atlas.repository.Constants.VERTEX_INDEX;
import static org.apache.atlas.repository.Constants.VERTEX_TYPE_PROPERTY_KEY;
import static org.apache.atlas.repository.graphdb.AtlasCardinality.LIST;
@@ -631,9 +643,21 @@ public class GraphBackedSearchIndexer implements
SearchIndexer, ActiveStateChang
// create fulltext indexes
createFullTextIndex(management, ENTITY_TEXT_PROPERTY_KEY,
String.class, SINGLE);
+ createPropertyKey(management, TYPE_CATEGORY_PROPERTY_KEY,
String.class, SINGLE);
+ createPropertyKey(management, TYPEDESCRIPTION_PROPERTY_KEY,
String.class, SINGLE);
+ createPropertyKey(management, TYPEVERSION_PROPERTY_KEY,
String.class, SINGLE);
+ createPropertyKey(management, VERSION_PROPERTY_KEY, Long.class,
SINGLE);
+ createPropertyKey(management, TYPEOPTIONS_PROPERTY_KEY,
String.class, SINGLE);
createPropertyKey(management, IS_PROXY_KEY, Boolean.class, SINGLE);
createPropertyKey(management, PROVENANCE_TYPE_KEY, Integer.class,
SINGLE);
createPropertyKey(management, HOME_ID_KEY, String.class, SINGLE);
+ createPropertyKey(management, ATTRIBUTE_INDEX_PROPERTY_KEY,
Integer.class, SINGLE);
+ createPropertyKey(management, ATTRIBUTE_KEY_PROPERTY_KEY,
String.class, SINGLE);
+ createPropertyKey(management, RELATIONSHIPTYPE_END1_KEY,
String.class, SINGLE);
+ createPropertyKey(management, RELATIONSHIPTYPE_END2_KEY,
String.class, SINGLE);
+ createPropertyKey(management, RELATIONSHIPTYPE_CATEGORY_KEY,
String.class, SINGLE);
+ createPropertyKey(management, RELATIONSHIPTYPE_LABEL_KEY,
String.class, SINGLE);
+ createPropertyKey(management,
RELATIONSHIPTYPE_TAG_PROPAGATION_KEY, String.class, SINGLE);
commit(management);
diff --git
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java
index e98d60efb..1d61aa978 100644
---
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java
+++
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasAbstractDefStoreV2.java
@@ -27,6 +27,8 @@ import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
import org.apache.atlas.model.typedef.AtlasStructDef;
import org.apache.atlas.query.AtlasDSL;
+import org.apache.atlas.repository.graphdb.AtlasCardinality;
+import org.apache.atlas.repository.graphdb.AtlasGraphManagement;
import org.apache.atlas.repository.graphdb.AtlasVertex;
import org.apache.atlas.repository.store.graph.AtlasDefStore;
import org.apache.atlas.type.AtlasType;
@@ -169,4 +171,10 @@ abstract class AtlasAbstractDefStoreV2<T extends
AtlasBaseTypeDef> implements At
public boolean isInvalidTypeDefName(String typeName) {
return INVALID_TYPEDEF_NAMES_LIST.contains(typeName);
}
+
+ protected static void createPropertyKey(String propertyKey, Class<?> clz,
AtlasCardinality cardinality, AtlasGraphManagement management) {
+ if (!management.containsPropertyKey(propertyKey)) {
+ management.makePropertyKey(propertyKey, clz, cardinality);
+ }
+ }
}
diff --git
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEnumDefStoreV2.java
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEnumDefStoreV2.java
index 7cca4e2a7..6977b737f 100644
---
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEnumDefStoreV2.java
+++
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEnumDefStoreV2.java
@@ -25,6 +25,9 @@ import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.typedef.AtlasEnumDef;
import org.apache.atlas.model.typedef.AtlasEnumDef.AtlasEnumElementDef;
import org.apache.atlas.repository.Constants;
+import org.apache.atlas.repository.IndexException;
+import org.apache.atlas.repository.graphdb.AtlasCardinality;
+import org.apache.atlas.repository.graphdb.AtlasGraphManagement;
import org.apache.atlas.repository.graphdb.AtlasVertex;
import org.apache.atlas.type.AtlasTypeRegistry;
import org.apache.atlas.typesystem.types.DataTypes.TypeCategory;
@@ -37,6 +40,8 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import static
org.apache.atlas.repository.store.graph.v2.AtlasGraphUtilsV2.encodePropertyKey;
+
/**
* EnumDef store in v2 format.
*/
@@ -239,14 +244,11 @@ class AtlasEnumDefStoreV2 extends
AtlasAbstractDefStoreV2<AtlasEnumDef> {
throw new
AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE,
enumDef.getName(), "values");
}
+ createPropertyKeys(enumDef);
+
List<String> values = new ArrayList<>(enumDef.getElementDefs().size());
for (AtlasEnumElementDef element : enumDef.getElementDefs()) {
- // Validate the enum element
- if (StringUtils.isEmpty(element.getValue()) || null ==
element.getOrdinal()) {
- throw new
AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE,
enumDef.getName(), "elementValue");
- }
-
String elemKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef,
element.getValue());
AtlasGraphUtilsV2.setProperty(vertex, elemKey,
element.getOrdinal());
@@ -259,10 +261,9 @@ class AtlasEnumDefStoreV2 extends
AtlasAbstractDefStoreV2<AtlasEnumDef> {
values.add(element.getValue());
}
- AtlasGraphUtilsV2.setProperty(vertex,
AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef), values);
- String defaultValueKey =
AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef, "defaultValue");
- AtlasGraphUtilsV2.setProperty(vertex, defaultValueKey,
enumDef.getDefaultValue());
+ AtlasGraphUtilsV2.setProperty(vertex,
AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef), values);
+ AtlasGraphUtilsV2.setProperty(vertex,
AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef, "defaultValue"),
enumDef.getDefaultValue());
}
private AtlasEnumDef toEnumDef(AtlasVertex vertex) {
@@ -281,7 +282,13 @@ class AtlasEnumDefStoreV2 extends
AtlasAbstractDefStoreV2<AtlasEnumDef> {
typeDefStore.vertexToTypeDef(vertex, ret);
List<AtlasEnumElementDef> elements = new ArrayList<>();
- List<String> elemValues =
vertex.getProperty(AtlasGraphUtilsV2.getTypeDefPropertyKey(ret), List.class);
+ Object names =
vertex.getProperty(AtlasGraphUtilsV2.getTypeDefPropertyKey(ret), Object.class);
+ List<String> elemValues = names instanceof List ?
(List<String>) names : new ArrayList<>();
+
+ if (names == null) {
+ LOG.warn("failed to load element names for enum {}",
ret.getName());
+ }
+
for (String elemValue : elemValues) {
String elemKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(ret,
elemValue);
String descKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(elemKey,
"description");
@@ -299,4 +306,34 @@ class AtlasEnumDefStoreV2 extends
AtlasAbstractDefStoreV2<AtlasEnumDef> {
return ret;
}
+
+ private void createPropertyKeys(AtlasEnumDef enumDef) throws
AtlasBaseException {
+ AtlasGraphManagement management =
typeDefStore.atlasGraph.getManagementSystem();
+
+ // create property keys first
+ for (AtlasEnumElementDef element : enumDef.getElementDefs()) {
+ // Validate the enum element
+ if (StringUtils.isEmpty(element.getValue()) || null ==
element.getOrdinal()) {
+ throw new
AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE,
enumDef.getName(), "elementValue");
+ }
+
+ String elemKey = AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef,
element.getValue());
+
+ createPropertyKey(encodePropertyKey(elemKey), Integer.class,
AtlasCardinality.SINGLE, management);
+ }
+
+ String typeDefKey =
AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef);
+ String defaultValueKey =
AtlasGraphUtilsV2.getTypeDefPropertyKey(enumDef, "defaultValue");
+
+ createPropertyKey(encodePropertyKey(typeDefKey), Object.class,
AtlasCardinality.SINGLE, management);
+ createPropertyKey(encodePropertyKey(defaultValueKey), String.class,
AtlasCardinality.SINGLE, management);
+
+ try {
+ management.commit();
+ } catch (Exception e) {
+ LOG.error("PropertyKey creation failed", e);
+
+ throw new AtlasBaseException(new IndexException("Index commit
failed", e));
+ }
+ }
}
diff --git
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasStructDefStoreV2.java
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasStructDefStoreV2.java
index b5ef5ab51..3c891bbcb 100644
---
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasStructDefStoreV2.java
+++
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasStructDefStoreV2.java
@@ -28,6 +28,9 @@ import org.apache.atlas.model.typedef.AtlasStructDef;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef;
import org.apache.atlas.repository.Constants;
+import org.apache.atlas.repository.IndexException;
+import org.apache.atlas.repository.graphdb.AtlasCardinality;
+import org.apache.atlas.repository.graphdb.AtlasGraphManagement;
import org.apache.atlas.repository.graphdb.AtlasVertex;
import org.apache.atlas.type.AtlasRelationshipType;
import org.apache.atlas.type.AtlasStructType;
@@ -64,28 +67,19 @@ public class AtlasStructDefStoreV2 extends
AtlasAbstractDefStoreV2<AtlasStructDe
public static void updateVertexPreCreate(AtlasStructDef structDef,
AtlasStructType structType, AtlasVertex vertex, AtlasTypeDefGraphStoreV2
typeDefStore) throws AtlasBaseException {
List<String> attrNames = new
ArrayList<>(structDef.getAttributeDefs().size());
- for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
- // Validate the mandatory features of an attribute (compatibility
with legacy type system)
- if (StringUtils.isEmpty(attributeDef.getName())) {
- throw new
AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE,
structDef.getName(), "name");
- }
-
- if (StringUtils.isEmpty(attributeDef.getTypeName())) {
- throw new
AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE,
structDef.getName(), "typeName");
- }
+ createPropertyKeys(structDef, typeDefStore);
- String propertyKey =
AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef, attributeDef.getName());
- String encodedPropertyKey =
AtlasGraphUtilsV2.encodePropertyKey(propertyKey);
+ for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
+ String propertyKey =
AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef, attributeDef.getName());
- vertex.setProperty(encodedPropertyKey,
toJsonFromAttribute(structType.getAttribute(attributeDef.getName())));
+
vertex.setProperty(AtlasGraphUtilsV2.encodePropertyKey(propertyKey),
toJsonFromAttribute(structType.getAttribute(attributeDef.getName())));
attrNames.add(attributeDef.getName());
}
- String typeNamePropertyKey =
AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef);
- String encodedtypeNamePropertyKey =
AtlasGraphUtilsV2.encodePropertyKey(typeNamePropertyKey);
+ String typeNamePropertyKey =
AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef);
- vertex.setProperty(encodedtypeNamePropertyKey, attrNames);
+
vertex.setProperty(AtlasGraphUtilsV2.encodePropertyKey(typeNamePropertyKey),
attrNames);
}
public static void updateVertexPreUpdate(AtlasStructDef structDef,
AtlasStructType structType, AtlasVertex vertex, AtlasTypeDefGraphStoreV2
typeDefStore) throws AtlasBaseException {
@@ -99,12 +93,15 @@ public class AtlasStructDefStoreV2 extends
AtlasAbstractDefStoreV2<AtlasStructDe
String structDefPropertyKey =
AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef);
String encodedStructDefPropertyKey =
encodePropertyKey(structDefPropertyKey);
- List<String> currAttrNames =
vertex.getProperty(encodedStructDefPropertyKey, List.class);
+ Object names =
vertex.getProperty(encodedStructDefPropertyKey, Object.class);
+ List<String> currAttrNames = names instanceof List ?
(List<String>) names : new ArrayList<>();
// delete attributes that are not present in updated structDef
if (CollectionUtils.isNotEmpty(currAttrNames)) {
List<String> removedAttributes = null;
+ createPropertyKeys(structDef, typeDefStore);
+
for (String currAttrName : currAttrNames) {
if (!attrNames.contains(currAttrName)) {
if (RequestContext.get().isInTypePatching()) {
@@ -136,6 +133,10 @@ public class AtlasStructDefStoreV2 extends
AtlasAbstractDefStoreV2<AtlasStructDe
vertex.removeProperty(propertyKey);
}
}
+ } else {
+ if (names == null) {
+ LOG.warn("failed to load attribute names for type {}",
structDef.getName());
+ }
}
typeDefStore.updateTypeVertex(structDef, vertex);
@@ -207,7 +208,8 @@ public class AtlasStructDefStoreV2 extends
AtlasAbstractDefStoreV2<AtlasStructDe
List<AtlasAttributeDef> attributeDefs = new ArrayList<>();
String typePropertyKey =
AtlasGraphUtilsV2.getTypeDefPropertyKey(ret);
String encodedTypePropertyKey =
AtlasGraphUtilsV2.encodePropertyKey(typePropertyKey);
- List<String> attrNames =
vertex.getProperty(encodedTypePropertyKey, List.class);
+ Object names =
vertex.getProperty(encodedTypePropertyKey, Object.class);
+ List<String> attrNames = names instanceof List
? (List<String>) names : new ArrayList<>();
if (CollectionUtils.isNotEmpty(attrNames)) {
for (String attrName : attrNames) {
@@ -223,6 +225,10 @@ public class AtlasStructDefStoreV2 extends
AtlasAbstractDefStoreV2<AtlasStructDe
attributeDefs.add(toAttributeDefFromJson(structDef,
AtlasType.fromJson(attrJson, Map.class), typeDefStore));
}
+ } else {
+ if (names == null) {
+ LOG.warn("failed to load attribute names for type {}",
structDef);
+ }
}
ret.setAttributeDefs(attributeDefs);
@@ -638,4 +644,35 @@ public class AtlasStructDefStoreV2 extends
AtlasAbstractDefStoreV2<AtlasStructDe
}
}
}
+
+ private static void createPropertyKeys(AtlasStructDef structDef,
AtlasTypeDefGraphStoreV2 typeDefStore) throws AtlasBaseException {
+ AtlasGraphManagement management =
typeDefStore.atlasGraph.getManagementSystem();
+
+ for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
+ // Validate the mandatory features of an attribute (compatibility
with legacy type system)
+ if (StringUtils.isEmpty(attributeDef.getName())) {
+ throw new
AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE,
structDef.getName(), "name");
+ }
+
+ if (StringUtils.isEmpty(attributeDef.getTypeName())) {
+ throw new
AtlasBaseException(AtlasErrorCode.MISSING_MANDATORY_ATTRIBUTE,
structDef.getName(), "typeName");
+ }
+
+ String propertyKey =
AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef, attributeDef.getName());
+
+
createPropertyKey(AtlasGraphUtilsV2.encodePropertyKey(propertyKey),
String.class, AtlasCardinality.SINGLE, management);
+ }
+
+ String typeNamePropertyKey =
AtlasGraphUtilsV2.getTypeDefPropertyKey(structDef);
+
+
createPropertyKey(AtlasGraphUtilsV2.encodePropertyKey(typeNamePropertyKey),
Object.class, AtlasCardinality.SINGLE, management);
+
+ try {
+ management.commit();
+ } catch (Exception e) {
+ LOG.error("PropertyKey creation failed", e);
+
+ throw new AtlasBaseException(new IndexException("Index commit
failed", e));
+ }
+ }
}
diff --git a/test-tools/src/main/resources/solr/core-template/solrconfig.xml
b/test-tools/src/main/resources/solr/core-template/solrconfig.xml
index c7ee388c7..e39ca9e81 100644
--- a/test-tools/src/main/resources/solr/core-template/solrconfig.xml
+++ b/test-tools/src/main/resources/solr/core-template/solrconfig.xml
@@ -445,7 +445,7 @@
-->
<lst name="defaults">
<str name="defType">edismax</str>
- <str name="qf">35x_t 5j9_t 7wl_t a9x_t but_t dfp_l f0l_t i6d_l
iyt_l jr9_t kjp_s lc5_t m4l_s mx1_t ohx_t xz9_i 1151_t 12px_t 14at_l 15vp_t
1891_t 19tx_t 1bet_t 1czp_t 1ekl_t 1gxx_t 1iit_l 1k3p_t 1lol_t 1o1x_t 1qf9_t
1ssl_t 1v5x_t 1wqt_t 1z45_t 20p1_t 4ttx_t 56h1_s 54w5_s 52it_s 50xx_s 543p_t
5c05_t 581x_t 59mt_l 5af9_t 5gqt_t 5f5x_t 5ibp_t 5pfp_t 5uyt_t 5zph_t 5xc5_t
5y4l_t 5wjp_t 6611_t 658l_t 6d51_l 6epx_l 66th_t 6ccl_t 6net_l 6ozp_l 6ltx_t
6k91_t 6qkl_t 6gat_t 6h39_t 6io5_ [...]
+ <str name="qf">35x_t 5j9_t 7wl_t a9x_t but_t dfp_l f0l_t i6d_l
iyt_l jr9_t kjp_s lc5_t m4l_s mx1_t ohx_t xz9_i 1151_t 12px_t 14at_l 15vp_t
1891_t 19tx_t 1bet_t 1czp_t 1ekl_t 1gxx_t 1iit_l 1k3p_t 1lol_t 1o1x_t 1qf9_t
1ssl_t 1v5x_t 1wqt_t 1z45_t 20p1_t 4wzp_t 59mt_s 581x_s 55ol_s 543p_s 579h_t
5f5x_t 5b7p_t 5csl_l 5dl1_t 5jwl_t 5ibp_t 5lhh_t 5slh_t 5y4l_t 62v9_t 60hx_t
61ad_t 5zph_t 696t_t 68ed_t 6gat_l 6hvp_l 69z9_t 6fid_t 6qkl_l 6s5h_l 6ozp_t
6net_t 6tqd_t 6jgl_t 6k91_t 6ltx_ [...]
<str name="hl.fl">*</str>
<bool name="hl.requireFieldMatch">true</bool>
<bool name="lowercaseOperators">true</bool>