diff options
author | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2017-03-23 15:57:49 +0100 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2017-03-23 15:57:56 +0100 |
commit | abd4c314b68d02ef389537af4b6b25164955233e (patch) | |
tree | 6deab4bdede2d1acc26b122bc4f920c3210e08a4 /config-model | |
parent | d16f535b772202432c8d805a5333ae6830286825 (diff) |
Forbid self references in documents
Diffstat (limited to 'config-model')
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 {", |