summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2018-06-19 14:41:47 +0200
committerGitHub <noreply@github.com>2018-06-19 14:41:47 +0200
commit887801af0973693728272b2cbeb2475e490d1c23 (patch)
tree3ac0d6c3dafadb69573e4cfd0feb3a58faf2aaf8 /config-model
parentb772f0565d7db9da3787a28b749377fad3d5e396 (diff)
parent66764d55be0aff4224b0171d4ab6450007e1e4cb (diff)
Merge pull request #6235 from vespa-engine/geirst/support-attribute-settings-for-struct-field-attributes
Support attribute settings (etc. fast-search) for struct field attrib…
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/AttributeOperation.java16
-rw-r--r--config-model/src/main/javacc/SDParser.jj4
-rw-r--r--config-model/src/test/derived/array_of_struct_attribute/attributes.cfg2
-rw-r--r--config-model/src/test/derived/array_of_struct_attribute/test.sd1
-rw-r--r--config-model/src/test/derived/map_attribute/attributes.cfg2
-rw-r--r--config-model/src/test/derived/map_attribute/test.sd1
-rw-r--r--config-model/src/test/derived/map_of_struct_attribute/attributes.cfg4
-rw-r--r--config-model/src/test/derived/map_of_struct_attribute/test.sd2
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/derived/AttributeListTestCase.java25
9 files changed, 36 insertions, 21 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/AttributeOperation.java b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/AttributeOperation.java
index 28abbe43968..46ac3cc1691 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/AttributeOperation.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/fieldoperation/AttributeOperation.java
@@ -122,10 +122,16 @@ public class AttributeOperation implements FieldOperation, FieldOperationContain
}
public void apply(SDField field) {
- Attribute attribute = field.getAttributes().get(name);
+ Attribute attribute = null;
+ if (attributeIsSuffixOfStructField(field.getName())) {
+ attribute = field.getAttributes().get(field.getName());
+ }
if (attribute == null) {
- attribute = new Attribute(name, field.getDataType());
- field.addAttribute(attribute);
+ attribute = field.getAttributes().get(name);
+ if (attribute == null) {
+ attribute = new Attribute(name, field.getDataType());
+ field.addAttribute(attribute);
+ }
}
if (huge != null) {
@@ -154,4 +160,8 @@ public class AttributeOperation implements FieldOperation, FieldOperationContain
}
}
+ private boolean attributeIsSuffixOfStructField(String fieldName) {
+ return ((fieldName.indexOf('.') != -1) && fieldName.endsWith(name));
+ }
+
}
diff --git a/config-model/src/main/javacc/SDParser.jj b/config-model/src/main/javacc/SDParser.jj
index c4c1a04da0b..1bf87754ce0 100644
--- a/config-model/src/main/javacc/SDParser.jj
+++ b/config-model/src/main/javacc/SDParser.jj
@@ -979,8 +979,7 @@ String fieldBody(SDField field, Search search, SDDocumentType document) : { }
/**
* This rule consumes a single element of a struct subfield body block.
- * Only elements that make sense for streaming search are allowed,
- * since only streaming search supports structs for now.
+ * Only elements that are supported in streaming search and indexed search (with complex attributes) are allowed.
*
* @param field The field being built.
* @param search The search object to add content to.
@@ -991,6 +990,7 @@ String structFieldBody(FieldOperationContainer field, Search search, SDDocumentT
{
( summaryInField(field) |
indexing(field) |
+ attribute(field) |
match(field) |
queryCommand(field) |
structField(field, search, document) |
diff --git a/config-model/src/test/derived/array_of_struct_attribute/attributes.cfg b/config-model/src/test/derived/array_of_struct_attribute/attributes.cfg
index 9e6b5cea55e..d42ed223045 100644
--- a/config-model/src/test/derived/array_of_struct_attribute/attributes.cfg
+++ b/config-model/src/test/derived/array_of_struct_attribute/attributes.cfg
@@ -3,7 +3,7 @@ attribute[].datatype STRING
attribute[].collectiontype ARRAY
attribute[].removeifzero false
attribute[].createifnonexistent false
-attribute[].fastsearch false
+attribute[].fastsearch true
attribute[].huge false
attribute[].sortascending true
attribute[].sortfunction UCA
diff --git a/config-model/src/test/derived/array_of_struct_attribute/test.sd b/config-model/src/test/derived/array_of_struct_attribute/test.sd
index 5b2d50cbdba..3678c2942b5 100644
--- a/config-model/src/test/derived/array_of_struct_attribute/test.sd
+++ b/config-model/src/test/derived/array_of_struct_attribute/test.sd
@@ -8,6 +8,7 @@ search test {
indexing: summary
struct-field name {
indexing: attribute
+ attribute: fast-search
}
struct-field weight {
indexing: attribute
diff --git a/config-model/src/test/derived/map_attribute/attributes.cfg b/config-model/src/test/derived/map_attribute/attributes.cfg
index cdd929a1818..4e0c3d60338 100644
--- a/config-model/src/test/derived/map_attribute/attributes.cfg
+++ b/config-model/src/test/derived/map_attribute/attributes.cfg
@@ -3,7 +3,7 @@ attribute[].datatype STRING
attribute[].collectiontype ARRAY
attribute[].removeifzero false
attribute[].createifnonexistent false
-attribute[].fastsearch false
+attribute[].fastsearch true
attribute[].huge false
attribute[].sortascending true
attribute[].sortfunction UCA
diff --git a/config-model/src/test/derived/map_attribute/test.sd b/config-model/src/test/derived/map_attribute/test.sd
index da31f575396..87fc13d48ed 100644
--- a/config-model/src/test/derived/map_attribute/test.sd
+++ b/config-model/src/test/derived/map_attribute/test.sd
@@ -4,6 +4,7 @@ search test {
indexing: summary
struct-field key {
indexing: attribute
+ attribute: fast-search
}
struct-field value {
indexing: attribute
diff --git a/config-model/src/test/derived/map_of_struct_attribute/attributes.cfg b/config-model/src/test/derived/map_of_struct_attribute/attributes.cfg
index 95cf8f761a0..7e38ba06f74 100644
--- a/config-model/src/test/derived/map_of_struct_attribute/attributes.cfg
+++ b/config-model/src/test/derived/map_of_struct_attribute/attributes.cfg
@@ -3,7 +3,7 @@ attribute[].datatype STRING
attribute[].collectiontype ARRAY
attribute[].removeifzero false
attribute[].createifnonexistent false
-attribute[].fastsearch false
+attribute[].fastsearch true
attribute[].huge false
attribute[].sortascending true
attribute[].sortfunction UCA
@@ -83,7 +83,7 @@ attribute[].datatype STRING
attribute[].collectiontype ARRAY
attribute[].removeifzero false
attribute[].createifnonexistent false
-attribute[].fastsearch false
+attribute[].fastsearch true
attribute[].huge false
attribute[].sortascending true
attribute[].sortfunction UCA
diff --git a/config-model/src/test/derived/map_of_struct_attribute/test.sd b/config-model/src/test/derived/map_of_struct_attribute/test.sd
index e139a7f8168..929fa8dcbbe 100644
--- a/config-model/src/test/derived/map_of_struct_attribute/test.sd
+++ b/config-model/src/test/derived/map_of_struct_attribute/test.sd
@@ -8,6 +8,7 @@ search test {
indexing: summary
struct-field key {
indexing: attribute
+ attribute: fast-search
}
struct-field value.name {
indexing: attribute
@@ -23,6 +24,7 @@ search test {
}
struct-field value.name {
indexing: attribute
+ attribute: fast-search
}
}
}
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/derived/AttributeListTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/derived/AttributeListTestCase.java
index bd762c64c00..da28dd56694 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/derived/AttributeListTestCase.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/derived/AttributeListTestCase.java
@@ -74,8 +74,8 @@ public class AttributeListTestCase extends SearchDefinitionTestCase {
Search search = SearchBuilder.buildFromFile("src/test/derived/array_of_struct_attribute/test.sd");
Iterator<Attribute> attributes = new AttributeFields(search).attributeIterator();
- assertAttribute("elem_array.name", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, attributes.next());
- assertAttribute("elem_array.weight", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, attributes.next());
+ assertAttribute("elem_array.name", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, true, attributes.next());
+ assertAttribute("elem_array.weight", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, false, attributes.next());
assertTrue(!attributes.hasNext());
}
@@ -84,18 +84,19 @@ public class AttributeListTestCase extends SearchDefinitionTestCase {
Search search = SearchBuilder.buildFromFile("src/test/derived/map_of_struct_attribute/test.sd");
Iterator<Attribute> attributes = new AttributeFields(search).attributeIterator();
- assertAttribute("str_elem_map.key", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, attributes.next());
- assertAttribute("str_elem_map.value.name", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, attributes.next());
- assertAttribute("str_elem_map.value.weight", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, attributes.next());
- assertAttribute("int_elem_map.key", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, attributes.next());
- assertAttribute("int_elem_map.value.name", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, attributes.next());
+ assertAttribute("str_elem_map.key", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, true, attributes.next());
+ assertAttribute("str_elem_map.value.name", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, false, attributes.next());
+ assertAttribute("str_elem_map.value.weight", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, false, attributes.next());
+ assertAttribute("int_elem_map.key", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, false, attributes.next());
+ assertAttribute("int_elem_map.value.name", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, true, attributes.next());
assertTrue(!attributes.hasNext());
}
- private static void assertAttribute(String name, Attribute.Type type, Attribute.CollectionType collection, Attribute attr) {
+ private static void assertAttribute(String name, Attribute.Type type, Attribute.CollectionType collection, boolean isFastSearch, Attribute attr) {
assertEquals(name, attr.getName());
assertEquals(type, attr.getType());
assertEquals(collection, attr.getCollectionType());
+ assertEquals(isFastSearch, attr.isFastSearch());
}
@Test
@@ -110,7 +111,7 @@ public class AttributeListTestCase extends SearchDefinitionTestCase {
"}")).getSearch();
Iterator<Attribute> attributes = new AttributeFields(search).attributeIterator();
- assertAttribute("pos_array_zcurve", Attribute.Type.LONG, Attribute.CollectionType.ARRAY, attributes.next());
+ assertAttribute("pos_array_zcurve", Attribute.Type.LONG, Attribute.CollectionType.ARRAY, true, attributes.next());
assertTrue(!attributes.hasNext());
}
@@ -119,9 +120,9 @@ public class AttributeListTestCase extends SearchDefinitionTestCase {
Search search = SearchBuilder.buildFromFile("src/test/derived/map_attribute/test.sd");
Iterator<Attribute> attributes = new AttributeFields(search).attributeIterator();
- assertAttribute("str_map.key", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, attributes.next());
- assertAttribute("str_map.value", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, attributes.next());
- assertAttribute("int_map.key", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, attributes.next());
+ assertAttribute("str_map.key", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, true, attributes.next());
+ assertAttribute("str_map.value", Attribute.Type.STRING, Attribute.CollectionType.ARRAY, false, attributes.next());
+ assertAttribute("int_map.key", Attribute.Type.INTEGER, Attribute.CollectionType.ARRAY, false, attributes.next());
assertTrue(!attributes.hasNext());
}