@Test public void indexRuleInheritanceOrdering2() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); rules.setProperty(OAK_CHILD_ORDER, ImmutableList.of("nt:base", "nt:hierarchyNode"),NAMES); rules.child("nt:hierarchyNode").setProperty(FulltextIndexConstants.FIELD_BOOST, 2.0); rules.child("nt:base").setProperty(FulltextIndexConstants.FIELD_BOOST, 3.0); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); //As nt:base is defined earlier it would supercede everything assertEquals(3.0, getRule(defn, "nt:base").boost, 0); assertEquals(3.0, getRule(defn, "nt:hierarchyNode").boost, 0); assertEquals(3.0, getRule(defn, "nt:file").boost, 0); }
@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 indexRuleInheritanceOrdering() throws Exception{ NodeBuilder rules = builder.child(INDEX_RULES); rules.setProperty(OAK_CHILD_ORDER, ImmutableList.of("nt:hierarchyNode", "nt:base"),NAMES); rules.child("nt:hierarchyNode").setProperty(FulltextIndexConstants.FIELD_BOOST, 2.0); rules.child("nt:base").setProperty(FulltextIndexConstants.FIELD_BOOST, 3.0); IndexDefinition defn = new IndexDefinition(root, builder.getNodeState(), "/foo"); assertEquals(3.0, getRule(defn, "nt:base").boost, 0); assertEquals(2.0, getRule(defn, "nt:hierarchyNode").boost, 0); assertEquals(3.0, getRule(defn, "nt:query").boost, 0); } @Test
@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 nodeTypeIndex_mixin() throws Exception{ TestUtil.registerNodeType(builder, testNodeTypeDefn); root = builder.getNodeState(); IndexDefinitionBuilder defnb = new IndexDefinitionBuilder(); defnb.nodeTypeIndex(); defnb.indexRule("oak:TestMixA"); IndexDefinition defn = IndexDefinition.newBuilder(root, defnb.build(), "/foo").build(); assertFalse(defn.hasSyncPropertyDefinitions()); assertNotNull(getRule(defn, "oak:TestTypeB")); assertTrue(getRule(defn, "oak:TestTypeB").indexesAllNodesOfMatchingType()); assertNotNull(getRule(defn, "oak:TestMixA")); assertTrue(getRule(defn, "oak:TestMixA").indexesAllNodesOfMatchingType()); assertNull(getRule(defn, "oak:TestTypeA")); assertNull(getRule(defn, "oak:TestSuperType")); }
@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 nodeTypeIndexed() throws Exception{ TestUtil.registerNodeType(builder, testNodeTypeDefn); root = builder.getNodeState(); IndexDefinitionBuilder defnb = new IndexDefinitionBuilder(); defnb.nodeTypeIndex(); defnb.indexRule("oak:TestSuperType"); IndexDefinition defn = IndexDefinition.newBuilder(root, defnb.build(), "/foo").build(); assertFalse(defn.hasSyncPropertyDefinitions()); IndexingRule ruleSuper = getRule(defn, "oak:TestSuperType"); assertNotNull(ruleSuper); assertTrue(defn.isPureNodeTypeIndex()); assertTrue(ruleSuper.getConfig(JcrConstants.JCR_PRIMARYTYPE).propertyIndex); assertTrue(ruleSuper.getConfig(JcrConstants.JCR_MIXINTYPES).propertyIndex); assertTrue(ruleSuper.indexesAllNodesOfMatchingType()); assertNotNull(getRule(defn, "oak:TestTypeA")); assertTrue(getRule(defn, "oak:TestTypeA").indexesAllNodesOfMatchingType()); assertNotNull(getRule(defn, "oak:TestTypeB")); assertNull(getRule(defn, "oak:TestMixA")); }
@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 mixinAndPrimaryType() throws Exception{ TestUtil.registerNodeType(builder, testNodeTypeDefn); root = builder.getNodeState(); IndexDefinitionBuilder defnb = new IndexDefinitionBuilder(); defnb.indexRule("oak:TestMixA").property(JcrConstants.JCR_PRIMARYTYPE).propertyIndex(); defnb.indexRule("oak:TestSuperType").property(JcrConstants.JCR_PRIMARYTYPE).propertyIndex().sync(); IndexDefinition defn = IndexDefinition.newBuilder(root, defnb.build(), "/foo").build(); IndexingRule a = getRule(defn, "oak:TestMixA"); assertNotNull(a.getConfig(JcrConstants.JCR_PRIMARYTYPE)); assertNotNull(a.getConfig(JcrConstants.JCR_MIXINTYPES)); assertFalse(a.getConfig(JcrConstants.JCR_MIXINTYPES).sync); IndexingRule b = getRule(defn, "oak:TestSuperType"); assertNotNull(b.getConfig(JcrConstants.JCR_PRIMARYTYPE)); assertNotNull(b.getConfig(JcrConstants.JCR_MIXINTYPES)); assertTrue(b.getConfig(JcrConstants.JCR_PRIMARYTYPE).sync); assertTrue(b.getConfig(JcrConstants.JCR_MIXINTYPES).sync); }
@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 nodeTypeIndexed_IgnoreAggregates() throws Exception{ TestUtil.registerNodeType(builder, testNodeTypeDefn); root = builder.getNodeState(); IndexDefinitionBuilder defnb = new IndexDefinitionBuilder(); defnb.nodeTypeIndex(); defnb.indexRule("oak:TestSuperType").sync(); defnb.aggregateRule("oak:TestSuperType").include("*"); IndexDefinition defn = IndexDefinition.newBuilder(root, defnb.build(), "/foo").build(); IndexingRule ruleSuper = getRule(defn, "oak:TestSuperType"); assertNotNull(ruleSuper); assertNull(ruleSuper.getConfig("foo")); assertTrue(ruleSuper.getAggregate().getIncludes().isEmpty()); assertNotNull(ruleSuper.getConfig(JcrConstants.JCR_PRIMARYTYPE)); assertNotNull(ruleSuper.getConfig(JcrConstants.JCR_MIXINTYPES)); }
@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 nodeTypeIndexed_IgnoreOtherProps() throws Exception{ TestUtil.registerNodeType(builder, testNodeTypeDefn); root = builder.getNodeState(); IndexDefinitionBuilder defnb = new IndexDefinitionBuilder(); defnb.nodeTypeIndex(); defnb.indexRule("oak:TestSuperType").sync(); defnb.indexRule("oak:TestSuperType").property("foo").propertyIndex(); IndexDefinition defn = IndexDefinition.newBuilder(root, defnb.build(), "/foo").build(); IndexingRule ruleSuper = getRule(defn, "oak:TestSuperType"); assertNotNull(ruleSuper); assertNull(ruleSuper.getConfig("foo")); assertNotNull(ruleSuper.getConfig(JcrConstants.JCR_PRIMARYTYPE)); assertNotNull(ruleSuper.getConfig(JcrConstants.JCR_MIXINTYPES)); }
@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 nodeTypeIndexedSync() throws Exception{ TestUtil.registerNodeType(builder, testNodeTypeDefn); root = builder.getNodeState(); IndexDefinitionBuilder defnb = new IndexDefinitionBuilder(); defnb.nodeTypeIndex(); defnb.indexRule("oak:TestSuperType").sync(); IndexDefinition defn = IndexDefinition.newBuilder(root, defnb.build(), "/foo").build(); assertTrue(defn.hasSyncPropertyDefinitions()); IndexingRule ruleSuper = getRule(defn, "oak:TestSuperType"); assertNotNull(ruleSuper); assertTrue(defn.isPureNodeTypeIndex()); assertTrue(ruleSuper.getConfig(JcrConstants.JCR_PRIMARYTYPE).propertyIndex); assertTrue(ruleSuper.getConfig(JcrConstants.JCR_PRIMARYTYPE).sync); assertTrue(ruleSuper.getConfig(JcrConstants.JCR_MIXINTYPES).propertyIndex); assertTrue(ruleSuper.getConfig(JcrConstants.JCR_MIXINTYPES).sync); assertTrue(ruleSuper.indexesAllNodesOfMatchingType()); }
@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 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 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 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()); }