static void useV2(Tree idxTree) { if (!IndexFormatVersion.getDefault().isAtLeast(IndexFormatVersion.V2)) { idxTree.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); } }
private static IndexFormatVersion determineVersionForFreshIndex(PropertyState fulltext, PropertyState compat, PropertyState version){ if (compat != null){ return versionFrom(compat); } IndexFormatVersion defaultToUse = IndexFormatVersion.getDefault(); IndexFormatVersion existing = version != null ? versionFrom(version) : null; //As per OAK-2290 current might be less than current used version. So //set to current only if it is greater than existing //Per setting use default configured IndexFormatVersion result = defaultToUse; //If default configured is lesser than existing then prefer existing if (existing != null){ result = IndexFormatVersion.max(result,existing); } //Check if fulltext is false which indicates its a property index and //hence confirm to V2 or above if (fulltext != null && !fulltext.getValue(Type.BOOLEAN)){ return IndexFormatVersion.max(result, IndexFormatVersion.V2); } return result; }
/** * 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(); }
@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()); }
private String constructAnalyzedPropertyName(String pname) { if (definition.getVersion().isAtLeast(IndexFormatVersion.V2)){ return FieldNames.createAnalyzedFieldName(pname); } return pname; }
@Test public void versionFreshIsCurrent() throws Exception{ NodeBuilder defnb = newLuceneIndexDefinition(builder.child(INDEX_DEFINITIONS_NAME), "lucene", of(TYPENAME_STRING)); LuceneIndexDefinition defn = new LuceneIndexDefinition(root, defnb.getNodeState(), "/foo"); assertEquals(IndexFormatVersion.getDefault(), defn.getVersion()); }
private static IndexFormatVersion versionFrom(PropertyState ps){ return IndexFormatVersion.getVersion(Ints.checkedCast(ps.getValue(Type.LONG))); }
private String constructAnalyzedPropertyName(String pname) { if (definition.getVersion().isAtLeast(IndexFormatVersion.V2)){ return FieldNames.createAnalyzedFieldName(pname); } return pname; }
static void useV2(NodeBuilder idxNb) { if (!IndexFormatVersion.getDefault().isAtLeast(IndexFormatVersion.V2)) { idxNb.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); } }
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); }
if (!definition.getVersion().isAtLeast(IndexFormatVersion.V2)){ log.trace("Index is old format. Not supported"); return null;
static void useV2(NodeBuilder idxNb) { if (!IndexFormatVersion.getDefault().isAtLeast(IndexFormatVersion.V2)) { idxNb.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); } }
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); }
static void useV2(Tree idxTree) { if (!IndexFormatVersion.getDefault().isAtLeast(IndexFormatVersion.V2)) { idxTree.setProperty(FulltextIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion()); } }
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(); } }
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(); } }