summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@yahoo-inc.com>2017-03-23 15:57:49 +0100
committerBjørn Christian Seime <bjorncs@yahoo-inc.com>2017-03-23 15:57:56 +0100
commitabd4c314b68d02ef389537af4b6b25164955233e (patch)
tree6deab4bdede2d1acc26b122bc4f920c3210e08a4 /config-model
parentd16f535b772202432c8d805a5333ae6830286825 (diff)
Forbid self references in documents
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/DocumentGraphValidator.java20
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/DocumentGraphValidatorTest.java4
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsTestCase.java13
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/documentmodel/DocumentModelBuilderReferenceTypeTestCase.java11
4 files changed, 10 insertions, 38 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/DocumentGraphValidator.java b/config-model/src/main/java/com/yahoo/searchdefinition/DocumentGraphValidator.java
index 71b9fb30648..05e74456aa5 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/DocumentGraphValidator.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/DocumentGraphValidator.java
@@ -31,17 +31,15 @@ public class DocumentGraphValidator {
try {
currentDocument.getDocumentReferences().get()
.forEach(entry -> {
- DocumentReference documentReference = entry.getValue();
- if (!isSelfReference(documentReference, currentDocument)) {
- SDDocumentType referencedDocument = entry.getValue().targetSearch().getDocument();
- validateDocument(root, referencedDocument);
+ SDDocumentType referencedDocument = entry.getValue().targetSearch().getDocument();
+ validateDocument(root, referencedDocument);
+ });
+ currentDocument.getInheritedTypes()
+ .forEach(inheritedDocument -> {
+ if (!isRootDocument(inheritedDocument)) {
+ validateDocument(root, inheritedDocument);
}
});
- currentDocument.getInheritedTypes().forEach(inheritedDocument -> {
- if (!isRootDocument(inheritedDocument)) {
- validateDocument(root, inheritedDocument);
- }
- });
} catch (DocumentGraphException e) {
e.addParentDocument(currentDocument);
throw e;
@@ -59,10 +57,6 @@ public class DocumentGraphValidator {
return doc.getName().equals("document");
}
- private static boolean isSelfReference(DocumentReference documentReference, SDDocumentType document) {
- return documentReference.targetSearch().getDocument().equals(document);
- }
-
public static class DocumentGraphException extends IllegalArgumentException {
private final Deque<SDDocumentType> deque = new ArrayDeque<>();
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/DocumentGraphValidatorTest.java b/config-model/src/test/java/com/yahoo/searchdefinition/DocumentGraphValidatorTest.java
index 0eb3e9e0153..96c734edd01 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/DocumentGraphValidatorTest.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/DocumentGraphValidatorTest.java
@@ -107,11 +107,13 @@ public class DocumentGraphValidatorTest {
}
@Test
- public void self_reference_is_allowed() {
+ public void self_reference_is_forbidden() {
Search adSearch = createSearchWithName("ad");
createDocumentReference(adSearch, adSearch, "ad_ref");
DocumentGraphValidator validator = new DocumentGraphValidator();
+ exceptionRule.expect(DocumentGraphValidator.DocumentGraphException.class);
+ exceptionRule.expectMessage("Document dependency cycle detected: ad->ad.");
validator.validateDocumentGraph(documentListOf(adSearch));
}
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsTestCase.java
index 00ea49a9025..245ca57e7e7 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsTestCase.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/processing/ImportedFieldsTestCase.java
@@ -34,19 +34,6 @@ public class ImportedFieldsTestCase {
assertSearchContainsImportedField("my_name", "person_ref", "person", "name", search);
}
- @Test
- public void field_can_be_imported_from_self_reference() throws ParseException {
- Search search = buildAdSearch(joinLines("search ad {",
- " document ad {",
- " field title type string { indexing: attribute }",
- " field self_ref type reference<ad> { indexing: attribute }",
- " }",
- " import field self_ref.title as my_title {}",
- "}"));
- assertEquals(1, search.importedFields().get().fields().size());
- assertSearchContainsImportedField("my_title", "self_ref", "ad", "title", search);
- }
-
@Rule
public ExpectedException exception = ExpectedException.none();
diff --git a/config-model/src/test/java/com/yahoo/vespa/documentmodel/DocumentModelBuilderReferenceTypeTestCase.java b/config-model/src/test/java/com/yahoo/vespa/documentmodel/DocumentModelBuilderReferenceTypeTestCase.java
index f9b15343f8e..f72d7332383 100644
--- a/config-model/src/test/java/com/yahoo/vespa/documentmodel/DocumentModelBuilderReferenceTypeTestCase.java
+++ b/config-model/src/test/java/com/yahoo/vespa/documentmodel/DocumentModelBuilderReferenceTypeTestCase.java
@@ -46,17 +46,6 @@ public class DocumentModelBuilderReferenceTypeTestCase extends SearchDefinitionT
}
@Test
- public void reference_field_can_reference_self_document_type() throws ParseException, IOException {
- assertDocumentConfigs(new TestDocumentModelBuilder().build(joinLines(
- "search ad {",
- " document ad {",
- " field self_ref type reference<ad> { indexing: attribute }",
- " }",
- "}")),
- "ref_to_self_type");
- }
-
- @Test
public void reference_data_type_has_a_concrete_target_type() throws ParseException {
DocumentModel model = new TestDocumentModelBuilder().addCampaign().build(joinLines(
"search ad {",