private boolean indexFacets(D doc, PropertyState property, String pname, PropertyDefinition pd) { int tag = property.getType().tag(); int idxDefinedTag = pd.getType(); // Try converting type to the defined type in the index definition if (tag != idxDefinedTag) { log.debug("[{}] Facet property defined with type {} differs from property {} with type {} in " + "path {}", getIndexName(), Type.fromTag(idxDefinedTag, false), property.toString(), Type.fromTag(tag, false), path); tag = idxDefinedTag; } return indexFacetProperty(doc, tag, property, pname); }
@Override protected void indexAnalyzedProperty(Document doc, String pname, String value, PropertyDefinition pd) { String analyzedPropName = constructAnalyzedPropertyName(pname); doc.add(newPropertyField(analyzedPropName, value, !pd.skipTokenization(pname), pd.stored)); }
public PropertyDefinition(IndexingRule idxDefn, String nodeName, NodeState defn) { this.isRegexp = getOptionalValue(defn, PROP_IS_REGEX, false); this.name = getName(defn, nodeName); this.relative = isRelativeProperty(name); this.boost = getOptionalValue(defn, FIELD_BOOST, DEFAULT_BOOST); this.weight = getOptionalValue(defn, PROP_WEIGHT, DEFAULT_PROPERTY_WEIGHT); this.stored = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_USE_IN_EXCERPT, false); this.nodeScopeIndex = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_NODE_SCOPE_INDEX, false); this.analyzed = true; } else { this.analyzed = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_ANALYZED, false); this.ordered = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_ORDERED, false); this.includedPropertyTypes = IndexDefinition.getSupportedTypes(defn, FulltextIndexConstants.PROP_INCLUDED_TYPE, IndexDefinition.TYPES_ALLOW_ALL); this.propertyType = getPropertyType(idxDefn, nodeName, defn); this.useInSuggest = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_USE_IN_SUGGEST, false); this.useInSpellcheck = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_USE_IN_SPELLCHECK, false); this.useInSimilarity = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_USE_IN_SIMILARITY, false); this.similarityRerank = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_SIMILARITY_RERANK, true); this.nullCheckEnabled = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_NULL_CHECK_ENABLED, false); this.notNullCheckEnabled = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_NOT_NULL_CHECK_ENABLED, false); this.excludeFromAggregate = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_EXCLUDE_FROM_AGGREGATE, false); this.nonRelativeName = determineNonRelativeName(); this.ancestors = computeAncestors(name); this.facet = getOptionalValueIfIndexed(defn, FulltextIndexConstants.PROP_FACETS, false); this.function = FunctionIndexProcessor.convertToPolishNotation(
protected static int getPropertyType(PropertyDefinition defn, String name, int defaultVal) { if (defn.isTypeDefined()) { return defn.getType(); } return defaultVal; }
dirty = true; } else { if (pd.propertyIndex && pd.includePropertyType(property.getType().tag())) { dirty |= addTypedFields(doc, property, pname, pd); if (pd.fulltextEnabled() && includeTypeForFullText) { for (String value : property.getValue(Type.STRINGS)) { if (pd.analyzed && pd.includePropertyType(property.getType().tag())) { indexAnalyzedProperty(doc, pname, value, pd);
private static PropertyDefinition createNodeTypeDefinition(IndexingRule rule, String name, boolean sync) { NodeBuilder builder = EMPTY_NODE.builder(); //A nodetype index just required propertyIndex and sync flags to be set builder.setProperty(FulltextIndexConstants.PROP_PROPERTY_INDEX, true); if (sync) { builder.setProperty(FulltextIndexConstants.PROP_SYNC, sync); } builder.setProperty(FulltextIndexConstants.PROP_NAME, name); return new PropertyDefinition(rule, name, builder.getNodeState()); }
private boolean hasAnyFullTextEnabledProperty() { for (PropertyDefinition pd : propConfigs.values()){ if (pd.fulltextEnabled()){ return true; } } for (NamePattern np : namePatterns){ if (np.getConfig().fulltextEnabled()){ return true; } } return false; }
NodeState propDefnNode = propNode.getChildNode(propName); if (propDefnNode.exists() && !propDefns.containsKey(propName)) { PropertyDefinition pd = new PropertyDefinition(this, propName, propDefnNode); if (pd.function != null) { functionRestrictions.add(pd); for (String p : properties) { if (PathUtils.getDepth(p) > 1) { PropertyDefinition pd2 = new PropertyDefinition(this, p, propDefnNode); propAggregate.add(new Aggregate.PropertyInclude(pd2));
private boolean addTypedOrderedFields(D doc, PropertyState property, String pname, PropertyDefinition pd) { // Ignore and warn if property multi-valued as not supported if (property.getType().isArray()) { log.warn( "[{}] Ignoring ordered property {} of type {} for path {} as multivalued ordered property not supported", getIndexName(), pname, Type.fromTag(property.getType().tag(), true), path); return false; } int tag = property.getType().tag(); int idxDefinedTag = pd.getType(); // Try converting type to the defined type in the index definition if (tag != idxDefinedTag) { log.debug( "[{}] Ordered property defined with type {} differs from property {} with type {} in " + "path {}", getIndexName(), Type.fromTag(idxDefinedTag, false), property.toString(), Type.fromTag(tag, false), path); tag = idxDefinedTag; } return indexTypeOrderedFields(doc, pname, tag, property, pd); }
@Override protected void indexAnalyzedProperty(Document doc, String pname, String value, PropertyDefinition pd) { String analyzedPropName = constructAnalyzedPropertyName(pname); doc.add(newPropertyField(analyzedPropName, value, !pd.skipTokenization(pname), pd.stored)); }
@Test public void propertyDefinition() throws Exception{ builder.child(PROP_NODE).child("foo").setProperty(FulltextIndexConstants.PROP_TYPE, PropertyType.TYPENAME_DATE); builder.setProperty(createProperty(INCLUDE_PROPERTY_NAMES, of("foo" , "bar"), STRINGS)); IndexDefinition idxDefn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexDefinition.IndexingRule rule = idxDefn.getApplicableIndexingRule(NT_BASE); assertTrue(rule.isIndexed("foo")); assertTrue(rule.isIndexed("bar")); assertEquals(PropertyType.DATE, rule.getConfig("foo").getType()); }
@Test public void fullTextEnabled() throws Exception{ IndexDefinition idxDefn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexDefinition.IndexingRule rule = idxDefn.getApplicableIndexingRule(NT_BASE); assertTrue("By default fulltext is enabled", idxDefn.isFullTextEnabled()); assertTrue("By default everything is indexed", rule.isIndexed("foo")); assertTrue("Property types need to be defined", rule.includePropertyType(PropertyType.DATE)); assertTrue("For fulltext storage is enabled", rule.getConfig("foo").stored); assertFalse(rule.getConfig("foo").skipTokenization("foo")); assertTrue(rule.getConfig("jcr:uuid").skipTokenization("jcr:uuid")); }
@Test public void propertyDefinition() throws Exception{ builder.child(PROP_NODE).child("foo").setProperty(FulltextIndexConstants.PROP_TYPE, PropertyType.TYPENAME_DATE); builder.setProperty(createProperty(INCLUDE_PROPERTY_NAMES, of("foo" , "bar"), STRINGS)); LuceneIndexDefinition idxDefn = new LuceneIndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule = idxDefn.getApplicableIndexingRule(NT_BASE); assertTrue(rule.isIndexed("foo")); assertTrue(rule.isIndexed("bar")); assertEquals(PropertyType.DATE, rule.getConfig("foo").getType()); }
@Test public void fullTextEnabled() throws Exception{ LuceneIndexDefinition idxDefn = new LuceneIndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule = idxDefn.getApplicableIndexingRule(NT_BASE); assertTrue("By default fulltext is enabled", idxDefn.isFullTextEnabled()); assertTrue("By default everything is indexed", rule.isIndexed("foo")); assertTrue("Property types need to be defined", rule.includePropertyType(PropertyType.DATE)); assertTrue("For fulltext storage is enabled", rule.getConfig("foo").stored); assertFalse(rule.getConfig("foo").skipTokenization("foo")); assertTrue(rule.getConfig("jcr:uuid").skipTokenization("jcr:uuid")); }
@Test public void relativePropertyConfig() throws Exception{ builder.child(PROP_NODE).child("foo1").child("bar").setProperty(FulltextIndexConstants.PROP_TYPE, PropertyType.TYPENAME_DATE); builder.child(PROP_NODE).child("foo2").child("bar2").child("baz").setProperty(FulltextIndexConstants.PROP_TYPE, PropertyType.TYPENAME_LONG); builder.setProperty(createProperty(INCLUDE_PROPERTY_NAMES, of("foo", "foo1/bar", "foo2/bar2/baz"), STRINGS)); LuceneIndexDefinition defn = new LuceneIndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule = defn.getApplicableIndexingRule(asState(newNode("nt:folder"))); assertNotNull(rule.getConfig("foo1/bar")); assertEquals(PropertyType.DATE, rule.getConfig("foo1/bar").getType()); assertEquals(PropertyType.LONG, rule.getConfig("foo2/bar2/baz").getType()); assertTrue(rule.getConfig("foo1/bar").relative); assertArrayEquals(new String[]{"foo2", "bar2"}, rule.getConfig("foo2/bar2/baz").ancestors); }
@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 propertyDefinitionWithExcludes() throws Exception{ builder.child(PROP_NODE).child("foo").setProperty(FulltextIndexConstants.PROP_TYPE, PropertyType.TYPENAME_DATE); LuceneIndexDefinition idxDefn = new LuceneIndexDefinition(root, builder.getNodeState(), "/foo"); IndexingRule rule = idxDefn.getApplicableIndexingRule(NT_BASE); assertTrue(rule.isIndexed("foo")); assertTrue(rule.isIndexed("bar")); assertEquals(PropertyType.DATE, rule.getConfig("foo").getType()); }
@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); LuceneIndexDefinition defn = new LuceneIndexDefinition(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 propertyDefinitionWithExcludes() throws Exception{ builder.child(PROP_NODE).child("foo").setProperty(FulltextIndexConstants.PROP_TYPE, PropertyType.TYPENAME_DATE); IndexDefinition idxDefn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexDefinition.IndexingRule rule = idxDefn.getApplicableIndexingRule(NT_BASE); assertTrue(rule.isIndexed("foo")); assertTrue(rule.isIndexed("bar")); assertEquals(PropertyType.DATE, rule.getConfig("foo").getType()); }
@Test public void propertyTypes() throws Exception{ builder.setProperty(createProperty(INCLUDE_PROPERTY_TYPES, of(TYPENAME_LONG), STRINGS)); builder.setProperty(createProperty(INCLUDE_PROPERTY_NAMES, of("foo" , "bar"), STRINGS)); builder.setProperty(FulltextIndexConstants.FULL_TEXT_ENABLED, false); IndexDefinition idxDefn = new IndexDefinition(root, builder.getNodeState(), "/foo"); IndexDefinition.IndexingRule rule = idxDefn.getApplicableIndexingRule(NT_BASE); assertFalse(idxDefn.isFullTextEnabled()); assertFalse("If fulltext disabled then nothing stored", rule.getConfig("foo").stored); assertTrue(rule.includePropertyType(PropertyType.LONG)); assertFalse(rule.includePropertyType(PropertyType.STRING)); assertTrue(rule.isIndexed("foo")); assertTrue(rule.isIndexed("bar")); assertFalse(rule.isIndexed("baz")); assertTrue(rule.getConfig("foo").skipTokenization("foo")); }