private static IndexingRule getRule(IndexDefinition defn, String typeName){ return defn.getApplicableIndexingRule(asState(newNode(typeName))); }
@Test public void indexRuleMixinInheritance() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); rules.child("mix:mimeType"); TestUtil.child(rules, "mix:mimeType/properties/jcr:mimeType") .setProperty(FulltextIndexConstants.FIELD_BOOST, 3.0); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); assertNotNull(defn.getApplicableIndexingRule(asState(newNode("nt:folder", "mix:mimeType")))); assertNull(defn.getApplicableIndexingRule(asState(newNode("nt:folder")))); //nt:resource > mix:mimeType assertNotNull(defn.getApplicableIndexingRule(asState(newNode("nt:resource")))); }
@Test public void indexRuleInheritance() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); builder.setProperty(PROP_NAME, "testIndex"); rules.child("nt:hierarchyNode").setProperty(FulltextIndexConstants.FIELD_BOOST, 2.0); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); assertNull(defn.getApplicableIndexingRule(asState(newNode("nt:base")))); assertNotNull(defn.getApplicableIndexingRule(asState(newNode("nt:hierarchyNode")))); assertNotNull(defn.getApplicableIndexingRule(asState(newNode("nt:folder")))); }
@Test public void indexRuleInheritanceDisabled() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); builder.setProperty(PROP_NAME, "testIndex"); rules.child("nt:hierarchyNode") .setProperty(FulltextIndexConstants.FIELD_BOOST, 2.0) .setProperty(FulltextIndexConstants.RULE_INHERITED, false); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); assertNull(defn.getApplicableIndexingRule(asState(newNode("nt:base")))); assertNotNull(defn.getApplicableIndexingRule(asState(newNode("nt:hierarchyNode")))); assertNull("nt:folder should not be index as rule is not inheritable", defn.getApplicableIndexingRule(asState(newNode("nt:folder")))); }
@Test public void indexRuleMixin() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); rules.child("mix:title"); TestUtil.child(rules, "mix:title/properties/jcr:title") .setProperty(FulltextIndexConstants.FIELD_BOOST, 3.0); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); assertNotNull(defn.getApplicableIndexingRule(asState(newNode("nt:folder", "mix:title")))); assertNull(defn.getApplicableIndexingRule(asState(newNode("nt:folder")))); }
@Test public void propertyRegExAndRelativeProperty() throws Exception{ NodeBuilder defnb = newFTIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "foo", "lucene", of(TYPENAME_STRING), of("foo"), "async"); IndexDefinition defn = new IndexDefinition(root, defnb.getNodeState(), "/foo"); assertTrue(defn.isOfOldFormat()); NodeBuilder updated = IndexDefinition.updateDefinition(defnb.getNodeState().builder()); IndexDefinition defn2 = new IndexDefinition(root, updated.getNodeState(), "/foo"); IndexingRule rule = defn2.getApplicableIndexingRule(asState(newNode("nt:base"))); assertNotNull(rule.getConfig("foo")); assertNull("Property regex used should not allow relative properties", rule.getConfig("foo/bar")); }
@Test public void formatUpdate() throws Exception{ NodeBuilder defnb = newFTIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "foo", "lucene", of(TYPENAME_STRING), of("foo", "Bar"), "async"); IndexDefinition defn = new IndexDefinition(root, defnb.getNodeState(), "/foo"); assertTrue(defn.isOfOldFormat()); NodeBuilder updated = IndexDefinition.updateDefinition(defnb.getNodeState().builder()); IndexDefinition defn2 = new IndexDefinition(root, updated.getNodeState(), "/foo"); assertFalse(defn2.isOfOldFormat()); IndexingRule rule = defn2.getApplicableIndexingRule(asState(newNode("nt:base"))); assertNotNull(rule); assertFalse(rule.getConfig("foo").index); assertFalse(rule.getConfig("Bar").index); }
@Test public void nodeFullTextIndexed_Simple() throws Exception { NodeBuilder rules = builder.child(INDEX_RULES); rules.child("nt:folder"); TestUtil.child(rules, "nt:folder/properties/prop1") .setProperty(PROP_NAME, "foo") .setProperty(FulltextIndexConstants.PROP_ANALYZED, true); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertNotNull(rule); assertFalse(rule.isNodeFullTextIndexed()); TestUtil.child(rules, "nt:folder/properties/prop1") .setProperty(FulltextIndexConstants.PROP_NODE_SCOPE_INDEX, true); defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); rule = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertTrue(rule.isNodeFullTextIndexed()); assertTrue(rule.indexesAllNodesOfMatchingType()); }
@Test public void indexRuleSanity() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); rules.child("nt:folder").setProperty(FulltextIndexConstants.FIELD_BOOST, 2.0); TestUtil.child(rules, "nt:folder/properties/prop1") .setProperty(FulltextIndexConstants.FIELD_BOOST, 3.0) .setProperty(FulltextIndexConstants.PROP_TYPE, PropertyType.TYPENAME_BOOLEAN); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); assertNull(defn.getApplicableIndexingRule(asState(newNode("nt:base")))); IndexingRule rule1 = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertNotNull(rule1); assertEquals(2.0f, rule1.boost, 0); assertTrue(rule1.isIndexed("prop1")); assertFalse(rule1.isIndexed("prop2")); PropertyDefinition pd = rule1.getConfig("prop1"); assertEquals(3.0f, pd.boost, 0); assertEquals(PropertyType.BOOLEAN, pd.getType()); }
@Test public void nodeFullTextIndexed_Regex() throws Exception { NodeBuilder rules = builder.child(INDEX_RULES); rules.child("nt:folder"); TestUtil.child(rules, "nt:folder/properties/prop1") .setProperty(PROP_NAME, ".*") .setProperty(FulltextIndexConstants.PROP_ANALYZED, true) .setProperty(FulltextIndexConstants.PROP_IS_REGEX, true); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertNotNull(rule); assertFalse(rule.isNodeFullTextIndexed()); TestUtil.child(rules, "nt:folder/properties/prop1") .setProperty(FulltextIndexConstants.PROP_NODE_SCOPE_INDEX, true); defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); rule = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertTrue(rule.isNodeFullTextIndexed()); assertTrue(rule.indexesAllNodesOfMatchingType()); }
@Test public void skipTokenization() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); rules.child("nt:folder"); TestUtil.child(rules, "nt:folder/properties/prop2") .setProperty(PROP_NAME, ".*") .setProperty(FulltextIndexConstants.PROP_IS_REGEX, true) .setProperty(FulltextIndexConstants.PROP_ANALYZED, true); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertFalse(rule.getConfig("foo").skipTokenization("foo")); assertTrue(rule.getConfig(JcrConstants.JCR_UUID).skipTokenization(JcrConstants.JCR_UUID)); }
@Test public void indexRuleWithPropertyOrdering() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); rules.child("nt:folder"); TestUtil.child(rules, "nt:folder/properties/prop1") .setProperty(PROP_NAME, "foo.*") .setProperty(FulltextIndexConstants.PROP_IS_REGEX, true) .setProperty(FulltextIndexConstants.FIELD_BOOST, 3.0); TestUtil.child(rules, "nt:folder/properties/prop2") .setProperty(PROP_NAME, ".*") .setProperty(FulltextIndexConstants.PROP_IS_REGEX, true) .setProperty(FulltextIndexConstants.FIELD_BOOST, 4.0); rules.child("nt:folder").child(PROP_NODE).setProperty(OAK_CHILD_ORDER, ImmutableList.of("prop2", "prop1"), NAMES); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule1 = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertNotNull(rule1); assertTrue(rule1.isIndexed("prop1")); assertTrue(rule1.isIndexed("fooProp")); assertEquals(4.0f, rule1.getConfig("bazProp2").boost, 0); //As prop2 is ordered before prop1 its regEx is evaluated first //hence even with a specific regex of foo.* the defn used is from .* assertEquals(4.0f, rule1.getConfig("fooProp").boost, 0); //Order it correctly to get expected result rules.child("nt:folder").child(PROP_NODE).setProperty(OAK_CHILD_ORDER, ImmutableList.of("prop1", "prop2"), NAMES); defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); rule1 = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertEquals(3.0f, rule1.getConfig("fooProp").boost, 0); }
@Test public void analyzedEnabledForBoostedField() throws Exception { NodeBuilder rules = builder.child(INDEX_RULES); rules.child("nt:folder"); TestUtil.child(rules, "nt:folder/properties/prop1") .setProperty(FulltextIndexConstants.FIELD_BOOST, 3.0) .setProperty(FulltextIndexConstants.PROP_NODE_SCOPE_INDEX, true); TestUtil.child(rules, "nt:folder/properties/prop2") .setProperty(FulltextIndexConstants.PROP_ANALYZED, true) .setProperty(FulltextIndexConstants.PROP_NODE_SCOPE_INDEX, true); TestUtil.child(rules, "nt:folder/properties/prop3") .setProperty(FulltextIndexConstants.PROP_PROPERTY_INDEX, true) .setProperty(FulltextIndexConstants.PROP_NODE_SCOPE_INDEX, true); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule1 = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertNotNull(rule1); PropertyDefinition pd = rule1.getConfig("prop1"); assertEquals(3.0f, pd.boost, 0); assertTrue("Analyzed should be assumed to be true for boosted fields", pd.analyzed); assertFalse(rule1.getConfig("prop3").analyzed); assertEquals(2, rule1.getNodeScopeAnalyzedProps().size()); }
@Test public void nodeFullTextIndexed_Aggregates() throws Exception { NodeBuilder rules = builder.child(INDEX_RULES); rules.child("nt:folder"); TestUtil.child(rules, "nt:folder/properties/prop1") .setProperty(PROP_NAME, "foo") .setProperty(FulltextIndexConstants.PROP_ANALYZED, true); NodeBuilder aggregates = builder.child(FulltextIndexConstants.AGGREGATES); NodeBuilder aggFolder = aggregates.child("nt:folder"); aggFolder.child("i1").setProperty(FulltextIndexConstants.AGG_PATH, "*"); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertNotNull(rule); assertTrue(rule.isNodeFullTextIndexed()); assertTrue(rule.indexesAllNodesOfMatchingType()); }
@Test public void indexRuleWithPropertyRegEx() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); rules.child("nt:folder"); TestUtil.child(rules, "nt:folder/properties/prop1") .setProperty(FulltextIndexConstants.FIELD_BOOST, 3.0); TestUtil.child(rules, "nt:folder/properties/prop2") .setProperty(PROP_NAME, "foo.*") .setProperty(FulltextIndexConstants.PROP_IS_REGEX, true) .setProperty(FulltextIndexConstants.FIELD_BOOST, 4.0); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule1 = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertNotNull(rule1); assertTrue(rule1.isIndexed("prop1")); assertFalse(rule1.isIndexed("prop2")); assertTrue(rule1.isIndexed("fooProp")); PropertyDefinition pd = rule1.getConfig("fooProp2"); assertEquals(4.0f, pd.boost, 0); }
@Test public void propertyConfigCaseInsensitive() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); rules.child("nt:folder"); TestUtil.child(rules, "nt:folder/properties/foo") .setProperty(PROP_NAME, "Foo") .setProperty(FulltextIndexConstants.PROP_PROPERTY_INDEX, true); TestUtil.child(rules, "nt:folder/properties/bar") .setProperty(PROP_NAME, "BAR") .setProperty(FulltextIndexConstants.PROP_PROPERTY_INDEX, true); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule1 = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertNotNull(rule1); assertTrue(rule1.isIndexed("Foo")); assertTrue(rule1.isIndexed("foo")); assertTrue(rule1.isIndexed("fOO")); assertTrue(rule1.isIndexed("bar")); assertFalse(rule1.isIndexed("baz")); }
@Test public void indexRuleWithPropertyRegEx2() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); rules.child("nt:folder"); TestUtil.child(rules, "nt:folder/properties/prop1") .setProperty(PROP_NAME, ".*") .setProperty(FulltextIndexConstants.PROP_IS_REGEX, true); TestUtil.child(rules, "nt:folder/properties/prop2") .setProperty(PROP_NAME, "metadata/.*") .setProperty(FulltextIndexConstants.PROP_IS_REGEX, true) .setProperty(FulltextIndexConstants.FIELD_BOOST, 4.0); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule1 = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertNotNull(rule1); assertTrue(rule1.isIndexed("prop1")); assertTrue(rule1.isIndexed("prop2")); assertFalse(rule1.isIndexed("jcr:content/prop1")); assertTrue(rule1.isIndexed("metadata/foo")); assertFalse(rule1.isIndexed("metadata/foo/bar")); }
@Test public void nonIndexPropShouldHaveAllOtherConfigDisabled() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); rules.child("nt:folder"); TestUtil.child(rules, "nt:folder/properties/prop1") .setProperty(PROP_NAME, "foo") .setProperty(FulltextIndexConstants.PROP_INDEX, false) .setProperty(FulltextIndexConstants.PROP_USE_IN_SUGGEST, true) .setProperty(FulltextIndexConstants.PROP_USE_IN_SPELLCHECK, true) .setProperty(FulltextIndexConstants.PROP_NULL_CHECK_ENABLED, true) .setProperty(FulltextIndexConstants.PROP_NOT_NULL_CHECK_ENABLED, true) .setProperty(FulltextIndexConstants.PROP_USE_IN_EXCERPT, true) .setProperty(FulltextIndexConstants.PROP_NODE_SCOPE_INDEX, true) .setProperty(FulltextIndexConstants.PROP_ORDERED, true) .setProperty(FulltextIndexConstants.PROP_ANALYZED, true); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertNotNull(rule); PropertyDefinition pd = rule.getConfig("foo"); //Assert that all other config is false if the index=false for any property assertFalse(pd.index); assertFalse(pd.nodeScopeIndex); assertFalse(pd.useInSuggest); assertFalse(pd.useInSpellcheck); assertFalse(pd.nullCheckEnabled); assertFalse(pd.notNullCheckEnabled); assertFalse(pd.stored); assertFalse(pd.ordered); assertFalse(pd.analyzed); }