/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.exoplatform.services.jcr.impl.core.query.lucene;
import org.apache.lucene.index.FieldInfos;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.util.ReaderUtil;
/**
* This class indicates the lucene index format that is used.
* <ul>
* <li><b>Version 1</b> is the initial index format, which is used for Jackrabbit
* releases 1.0 to 1.3.x. Unless a re-index happens upgraded Jackrabbit
* instances will still use this version.</li>
* <li><b>Version 2</b> is the index format introduced with Jackrabbit 1.4.x. It
* adds a <code>PROPERTIES_SET</code> field which contains all property names of
* a node. This speeds up queries that check the existence of a property.</li>
* <li><b>Version 3</b> is the index format introduced with Jackrabbit 1.5.x. It
* adds support for length and local name queries using the newly added
* fields <code>PROPERTY_LENGTHS</code>, <code>LOCAL_NAME</code> and
* <code>NAMESPACE_URI</code>. Furthermore a Payload is added to
* <code>PROPERTIES</code> fields to indicate the property type.</li>
* </ul>
* Please note that existing indexes are not automatically upgraded to a newer
* version! If you want to take advantage of a certain 'feature' in an index
* format version you need to re-index the repository.
*/
public class IndexFormatVersion {
/**
* V1 is the index format for Jackrabbit releases 1.0 to 1.3.x.
*/
public static final IndexFormatVersion V1 = new IndexFormatVersion(1);
/**
* V2 is the index format for Jackrabbit releases 1.4.x
*/
public static final IndexFormatVersion V2 = new IndexFormatVersion(2);
/**
* V3 is the index format for Jackrabbit releases 1.5.x
*/
public static final IndexFormatVersion V3 = new IndexFormatVersion(3);
/**
* V4 is the index format for Jackrabbit releases {@literal >=} 1.6
*/
public static final IndexFormatVersion V4 = new IndexFormatVersion(4);
/**
* The used version of the index format
*/
private final int version;
/**
* Creates a index format version.
*
* @param version The version of the index.
*/
private IndexFormatVersion(int version) {
this.version = version;
}
/**
* Returns the index format version
* @return the index format version.
*/
public int getVersion() {
return version;
}
/**
* 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();
}
/**
* @return a string representation of this index format version.
*/
public String toString() {
return String.valueOf(getVersion());
}
/**
* @return the index format version of the index used by the given
* index reader.
*/
public static IndexFormatVersion getVersion(IndexReader indexReader) {
FieldInfos fields = ReaderUtil.getMergedFieldInfos(indexReader);
if ((fields.fieldInfo(FieldNames.INDEX) != null && fields.fieldInfo(FieldNames.PATH) != null)
|| indexReader.numDocs() == 0) {
return IndexFormatVersion.V4;
} else if (fields.fieldInfo(FieldNames.LOCAL_NAME) != null) {
return IndexFormatVersion.V3;
} else if (fields.fieldInfo(FieldNames.PROPERTIES_SET) != null) {
return IndexFormatVersion.V2;
} else {
return IndexFormatVersion.V1;
}
}
}