/** * Returns <code>true</code> if this version is at least as high as the * given <code>version</code>. * * @param version the other version to compare. * @return <code>true</code> if this version is at least as high as the * provided; <code>false</code> otherwise. */ public boolean isAtLeast(IndexFormatVersion version) { return this.version >= version.getVersion(); }
private static IndexFormatVersion versionFrom(PropertyState ps){ return IndexFormatVersion.getVersion(Ints.checkedCast(ps.getValue(Type.LONG))); }
private void createFullTextIndex(Session s) throws RepositoryException { String indexPath = "/oak:index/lucene"; Node lucene = JcrUtils.getOrCreateByPath(indexPath, JcrConstants.NT_UNSTRUCTURED, "oak:QueryIndexDefinition", s, false); lucene.setProperty("async", "async"); lucene.setProperty(IndexConstants.TYPE_PROPERTY_NAME, "lucene"); lucene.setProperty(FulltextIndexConstants.EVALUATE_PATH_RESTRICTION, true); lucene.setProperty(LuceneIndexConstants.INDEX_PATH, indexPath); lucene.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); Node indexRules = lucene.addNode(FulltextIndexConstants.INDEX_RULES, JcrConstants.NT_UNSTRUCTURED); Node ntBaseRule = indexRules.addNode(JcrConstants.NT_BASE); //Fulltext index only includes property of type String and Binary ntBaseRule.setProperty(FulltextIndexConstants.INCLUDE_PROPERTY_TYPES, new String[] {PropertyType.TYPENAME_BINARY, PropertyType.TYPENAME_STRING}); Node propNode = ntBaseRule.addNode(FulltextIndexConstants.PROP_NODE); Node allPropNode = propNode.addNode("allProps"); allPropNode.setProperty(FulltextIndexConstants.PROP_ANALYZED, true); allPropNode.setProperty(FulltextIndexConstants.PROP_NODE_SCOPE_INDEX, true); allPropNode.setProperty(FulltextIndexConstants.PROP_NAME, FulltextIndexConstants.REGEX_ALL_PROPS); allPropNode.setProperty(FulltextIndexConstants.PROP_IS_REGEX, true); allPropNode.setProperty(FulltextIndexConstants.PROP_USE_IN_SPELLCHECK, true); //Create aggregates for nt:file Node aggNode = lucene.addNode(FulltextIndexConstants.AGGREGATES); Node aggFile = aggNode.addNode(JcrConstants.NT_FILE); aggFile.addNode("include0").setProperty(FulltextIndexConstants.AGG_PATH, JcrConstants.JCR_CONTENT); log.info("Created fulltext index definition at {}", indexPath); }
private void createSuggestIndex(Node rootNode, String name, String indexedNodeType, String indexedPropertyName) throws Exception { Node def = JcrUtils.getOrAddNode(rootNode, INDEX_DEFINITIONS_NAME) .addNode(name, INDEX_DEFINITIONS_NODE_TYPE); def.setProperty(TYPE_PROPERTY_NAME, LuceneIndexConstants.TYPE_LUCENE); def.setProperty(REINDEX_PROPERTY_NAME, true); def.setProperty("name", name); def.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); def.setProperty(EVALUATE_PATH_RESTRICTION, true); Node propertyIdxDef = def.addNode(INDEX_RULES, JcrConstants.NT_UNSTRUCTURED) .addNode(indexedNodeType, JcrConstants.NT_UNSTRUCTURED) .addNode(FulltextIndexConstants.PROP_NODE, JcrConstants.NT_UNSTRUCTURED) .addNode("indexedProperty", JcrConstants.NT_UNSTRUCTURED); propertyIdxDef.setProperty("analyzed", true); propertyIdxDef.setProperty(PROP_USE_IN_SPELLCHECK, true); propertyIdxDef.setProperty("name", indexedPropertyName); }
private void createSuggestIndex(Node rootNode, String name, String indexedNodeType, String indexedPropertyName) throws Exception { Node def = JcrUtils.getOrAddNode(rootNode, INDEX_DEFINITIONS_NAME) .addNode(name, INDEX_DEFINITIONS_NODE_TYPE); def.setProperty(TYPE_PROPERTY_NAME, LuceneIndexConstants.TYPE_LUCENE); def.setProperty(REINDEX_PROPERTY_NAME, true); def.setProperty("name", name); def.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); def.setProperty(EVALUATE_PATH_RESTRICTION, true); Node propertyIdxDef = def.addNode(INDEX_RULES, JcrConstants.NT_UNSTRUCTURED) .addNode(indexedNodeType, JcrConstants.NT_UNSTRUCTURED) .addNode(FulltextIndexConstants.PROP_NODE, JcrConstants.NT_UNSTRUCTURED) .addNode("indexedProperty", JcrConstants.NT_UNSTRUCTURED); propertyIdxDef.setProperty("analyzed", true); propertyIdxDef.setProperty(PROP_USE_IN_SUGGEST, true); propertyIdxDef.setProperty("name", indexedPropertyName); }
private void createSuggestIndex(String name, String indexedNodeType, String indexedPropertyName, boolean addFullText, boolean suggestAnalyzed) throws Exception { Node def = root.getNode(INDEX_DEFINITIONS_NAME) .addNode(name, INDEX_DEFINITIONS_NODE_TYPE); def.setProperty(TYPE_PROPERTY_NAME, LuceneIndexConstants.TYPE_LUCENE); def.setProperty(REINDEX_PROPERTY_NAME, true); def.setProperty("name", name); def.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); if (suggestAnalyzed) { def.addNode(FulltextIndexConstants.SUGGESTION_CONFIG).setProperty("suggestAnalyzed", suggestAnalyzed); } Node propertyIdxDef = def.addNode(INDEX_RULES, JcrConstants.NT_UNSTRUCTURED) .addNode(indexedNodeType, JcrConstants.NT_UNSTRUCTURED) .addNode(FulltextIndexConstants.PROP_NODE, JcrConstants.NT_UNSTRUCTURED) .addNode("indexedProperty", JcrConstants.NT_UNSTRUCTURED); propertyIdxDef.setProperty("propertyIndex", true); propertyIdxDef.setProperty("analyzed", true); propertyIdxDef.setProperty("useInSuggest", true); if (addFullText) { propertyIdxDef.setProperty("nodeScopeIndex", true); } propertyIdxDef.setProperty("name", indexedPropertyName); }
public void testResultSizeLuceneV1() throws Exception { Session session = superuser; Node index = session.getRootNode().getNode("oak:index"); Node luceneGlobal = index.getNode("luceneGlobal"); luceneGlobal.setProperty("type", "disabled"); Node luceneV1 = index.addNode("luceneV1", "oak:QueryIndexDefinition"); luceneV1.setProperty("type", "lucene"); luceneV1.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V1.getVersion()); session.save(); try { doTestResultSize(true); } finally { luceneV1.remove(); luceneGlobal.setProperty("type", "lucene"); luceneGlobal.setProperty("reindex", true); session.save(); } }
static void useV2(Tree idxTree) { if (!IndexFormatVersion.getDefault().isAtLeast(IndexFormatVersion.V2)) { idxTree.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); } }
static void useV2(NodeBuilder idxNb) { if (!IndexFormatVersion.getDefault().isAtLeast(IndexFormatVersion.V2)) { idxNb.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); } }
static void useV2(NodeBuilder idxNb) { if (!IndexFormatVersion.getDefault().isAtLeast(IndexFormatVersion.V2)) { idxNb.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); } }
static void useV2(Tree idxTree) { if (!IndexFormatVersion.getDefault().isAtLeast(IndexFormatVersion.V2)) { idxTree.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); } }
public static NodeBuilder updateDefinition(NodeBuilder indexDefn, String indexPath){ NodeState defn = indexDefn.getBaseState(); if (!hasIndexingRules(defn)){ NodeState rulesState = createIndexRules(defn).getNodeState(); indexDefn.setChildNode(FulltextIndexConstants.INDEX_RULES, rulesState); indexDefn.setProperty(INDEX_VERSION, determineIndexFormatVersion(defn).getVersion()); indexDefn.removeProperty(DECLARING_NODE_TYPES); indexDefn.removeProperty(INCLUDE_PROPERTY_NAMES); indexDefn.removeProperty(EXCLUDE_PROPERTY_NAMES); indexDefn.removeProperty(ORDERED_PROP_NAMES); indexDefn.removeProperty(FULL_TEXT_ENABLED); indexDefn.child(PROP_NODE).remove(); log.info("Updated index definition for {}", indexPath); } return indexDefn; }
@Test public void versionFreshCompateMode() throws Exception{ NodeBuilder defnb = newLuceneIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "lucene", of(TYPENAME_STRING)); defnb.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V1.getVersion()); LuceneIndexDefinition defn = new LuceneIndexDefinition(root, defnb.getNodeState(), "/foo"); assertEquals(IndexFormatVersion.V1, defn.getVersion()); }
/** * Update index definition based on base or latest builder state * @param useStateFromBuilder whether to use the latest builder state * @return the up to date index definition */ public IndexDefinition apply(boolean useStateFromBuilder) { IndexFormatVersion version = IndexDefinition.determineVersionForFreshIndex(definitionBuilder); definitionBuilder.setProperty(IndexDefinition.INDEX_VERSION, version.getVersion()); //Avoid obtaining the latest NodeState from builder as that would force purge of current transient state //as index definition does not get modified as part of IndexUpdate run in most case we rely on base state //For case where index definition is rewritten there we get fresh state NodeState defnState = useStateFromBuilder ? definitionBuilder.getNodeState() : definitionBuilder.getBaseState(); if (!IndexDefinition.isDisableStoredIndexDefinition()) { definitionBuilder.setChildNode(INDEX_DEFINITION_NODE, NodeStateCloner.cloneVisibleState(defnState)); } String uid = configureUniqueId(definitionBuilder); //Refresh the index definition based on update builder state return indexDefBuilder .root(root) .defn(defnState) .indexPath(indexPath) .version(version) .uid(uid) .reindex() .build(); } }
private Tree createSuggestIndex(String indexedNodeType) throws Exception { String indexName = "lucene-suggest"; Tree def = root.getTree("/" + INDEX_DEFINITIONS_NAME) .addChild(indexName); def.setProperty(JcrConstants.JCR_PRIMARYTYPE, INDEX_DEFINITIONS_NODE_TYPE); def.setProperty(TYPE_PROPERTY_NAME, LuceneIndexConstants.TYPE_LUCENE); def.setProperty(REINDEX_PROPERTY_NAME, true); def.setProperty("name", indexName); def.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); Tree propertyIdxDef = def.addChild(FulltextIndexConstants.INDEX_RULES) .addChild(indexedNodeType) .addChild(FulltextIndexConstants.PROP_NODE) .addChild("indexedProperty"); propertyIdxDef.setProperty("propertyIndex", true); propertyIdxDef.setProperty("analyzed", true); propertyIdxDef.setProperty("useInSuggest", true); propertyIdxDef.setProperty("name", FulltextIndexConstants.PROPDEF_PROP_NODE_NAME); return def; }
@Test public void testLuceneV1NonExistentProperty() throws Exception { NodeBuilder index = builder.child(INDEX_DEFINITIONS_NAME); NodeBuilder defn = newLuceneIndexDefinition(index, "lucene", ImmutableSet.of("String")); defn.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V1.getVersion()); NodeState before = builder.getNodeState(); builder.setProperty("foo", "value-with-dash"); NodeState after = builder.getNodeState(); NodeState indexed = HOOK.processCommit(before, after, CommitInfo.EMPTY); tracker = new IndexTracker(); tracker.update(indexed); AdvancedQueryIndex queryIndex = new LuceneIndex(tracker, null); FilterImpl filter = createFilter(NT_BASE); filter.restrictPath("/", Filter.PathRestriction.EXACT); filter.setFullTextConstraint(FullTextParser.parse("foo", "value-with*")); List<IndexPlan> plans = queryIndex.getPlans(filter, null, builder.getNodeState()); Cursor cursor = queryIndex.query(plans.get(0), indexed); assertTrue(cursor.hasNext()); assertEquals("/", cursor.next().getPath()); assertFalse(cursor.hasNext()); //Now perform a query against a field which does not exist FilterImpl filter2 = createFilter(NT_BASE); filter2.restrictPath("/", Filter.PathRestriction.EXACT); filter2.setFullTextConstraint(FullTextParser.parse("baz", "value-with*")); List<IndexPlan> plans2 = queryIndex.getPlans(filter2, null, builder.getNodeState()); Cursor cursor2 = queryIndex.query(plans2.get(0), indexed); assertFalse(cursor2.hasNext()); }
private Tree createFullTextIndex(Tree index, String name) throws CommitFailedException { Tree def = index.addChild(INDEX_DEFINITIONS_NAME).addChild(name); def.setProperty(JcrConstants.JCR_PRIMARYTYPE, INDEX_DEFINITIONS_NODE_TYPE, Type.NAME); def.setProperty(TYPE_PROPERTY_NAME, LuceneIndexConstants.TYPE_LUCENE); def.setProperty(REINDEX_PROPERTY_NAME, true); def.setProperty(FulltextIndexConstants.EVALUATE_PATH_RESTRICTION, true); def.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); Tree props = def.addChild(FulltextIndexConstants.INDEX_RULES) .addChild("nt:base") .addChild(FulltextIndexConstants.PROP_NODE) .addChild("allProps"); props.setProperty(FulltextIndexConstants.PROP_ANALYZED, true); props.setProperty(FulltextIndexConstants.PROP_NODE_SCOPE_INDEX, true); props.setProperty(FulltextIndexConstants.PROP_USE_IN_EXCERPT, true); props.setProperty(FulltextIndexConstants.PROP_NAME, FulltextIndexConstants.REGEX_ALL_PROPS); props.setProperty(FulltextIndexConstants.PROP_IS_REGEX, true); return def; }
@Test public void indexVersionSwitchOnReindex() throws Exception{ NodeBuilder index = builder.child(INDEX_DEFINITIONS_NAME); NodeBuilder nb = newLuceneIndexDefinition(index, "lucene", of(TYPENAME_STRING)); //1. Trigger a index so that next index step does not see it as a fresh index NodeState indexed = HOOK.processCommit(EMPTY_NODE, builder.getNodeState(), CommitInfo.EMPTY); builder = indexed.builder(); //By default logic would use current version. To simulate upgrade we forcefully set //version to V1 builder.child(INDEX_DEFINITIONS_NAME).child("lucene").setProperty(IndexDefinition.INDEX_VERSION, IndexFormatVersion.V1.getVersion()); NodeState before = builder.getNodeState(); builder.child("test").setProperty("foo", "fox is jumping"); NodeState after = builder.getNodeState(); indexed = HOOK.processCommit(before, after, CommitInfo.EMPTY); assertEquals(IndexFormatVersion.V1, new IndexDefinition(root, indexed.getChildNode(INDEX_DEFINITIONS_NAME).getChildNode("lucene"), "/foo").getVersion()); //3. Trigger a reindex and version should switch to current builder = indexed.builder(); before = indexed; builder.child(INDEX_DEFINITIONS_NAME).child("lucene").setProperty(IndexConstants.REINDEX_PROPERTY_NAME, true); after = builder.getNodeState(); indexed = HOOK.processCommit(before, after, CommitInfo.EMPTY); assertEquals(IndexFormatVersion.getDefault(), new IndexDefinition(root, indexed.getChildNode(INDEX_DEFINITIONS_NAME).getChildNode("lucene"), "/foo").getVersion()); }
@Before public void setup() throws Exception { //named so that it gets called after super.before :-/ Tree rootTree = root.getTree("/"); Tree def = rootTree.addChild(INDEX_DEFINITIONS_NAME).addChild("testExcerpt"); def.setProperty(JcrConstants.JCR_PRIMARYTYPE, INDEX_DEFINITIONS_NODE_TYPE, Type.NAME); def.setProperty(TYPE_PROPERTY_NAME, LuceneIndexConstants.TYPE_LUCENE); def.setProperty(REINDEX_PROPERTY_NAME, true); def.setProperty(FulltextIndexConstants.EVALUATE_PATH_RESTRICTION, true); def.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); Tree properties = def.addChild(FulltextIndexConstants.INDEX_RULES) .addChild("nt:base") .addChild(FulltextIndexConstants.PROP_NODE); Tree notIndexedProp = properties.addChild("baz"); notIndexedProp.setProperty(FulltextIndexConstants.PROP_NODE_SCOPE_INDEX, true); Tree relativeProp = properties.addChild("relative-baz"); relativeProp.setProperty(FulltextIndexConstants.PROP_ANALYZED, true); relativeProp.setProperty(FulltextIndexConstants.PROP_USE_IN_EXCERPT, true); relativeProp.setProperty(FulltextIndexConstants.PROP_NAME, "relative/baz"); Tree allProps = properties.addChild("allProps"); allProps.setProperty(FulltextIndexConstants.PROP_ANALYZED, true); allProps.setProperty(FulltextIndexConstants.PROP_NODE_SCOPE_INDEX, true); allProps.setProperty(FulltextIndexConstants.PROP_USE_IN_EXCERPT, true); allProps.setProperty(FulltextIndexConstants.PROP_NAME, FulltextIndexConstants.REGEX_ALL_PROPS); allProps.setProperty(FulltextIndexConstants.PROP_IS_REGEX, true); root.commit(); }