/* * eXist Open Source Native XML Database * Copyright (C) 2001-04 The eXist Team * * http://exist-db.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id$ */ package org.exist.storage; import java.util.Arrays; import org.exist.dom.QName; import org.exist.xquery.value.Type; public abstract class RangeIndexSpec { /* * Constants to define the type of the index. * These constants are used to encode the * index type in the storage pointer. */ /** No index specified **/ public static final int NO_INDEX = 0; public static final int STRING = 1; public static final int INTEGER = 2; public static final int DOUBLE = 3; public static final int FLOAT = 4; public static final int BOOLEAN = 5; public static final int DATE_TIME = 6; public static final int DATE = 7; /** * Indicates that the node has a qname-value index defined * on it. */ public static final int QNAME_INDEX = 0x10; public static final int TEXT_MIXED_CONTENT = 0x20; /** * Bit is set if the node has mixed content. */ public static final int MIXED_CONTENT = 0x40; /** * Bit is set if the node is fulltext indexed. */ public static final int TEXT = 0x80; /** * Bit mask to extract the type of the range index. */ public static final int RANGE_INDEX_MASK = 0x0F; public static final int HAS_VALUE_INDEX_MASK = 0x1F; public static final int HAS_VALUE_OR_MIXED_INDEX_MASK = 0x3F; private static final int[] xpathTypes = { Type.ITEM, Type.STRING, Type.INTEGER, Type.DOUBLE, Type.FLOAT, Type.BOOLEAN, Type.DATE_TIME, Type.DATE }; protected static final int[] indexTypes = new int[64]; static { Arrays.fill(indexTypes, NO_INDEX); indexTypes[Type.STRING] = STRING; indexTypes[Type.INTEGER] = INTEGER; indexTypes[Type.DOUBLE] = DOUBLE; indexTypes[Type.FLOAT] = FLOAT; indexTypes[Type.BOOLEAN] = BOOLEAN; indexTypes[Type.DATE_TIME] = DATE_TIME; indexTypes[Type.DATE] = DATE; } /** * For a given index type bit, return the corresponding * atomic XPath type (as defined in {@link org.exist.xquery.value.Type}). * * @param type a bit set indicating the type * @return atomic XPath type */ public static final int indexTypeToXPath(int type) { return xpathTypes[type & RANGE_INDEX_MASK]; } /** * Returns true if the index type specifier has the fulltext index flag * set. * * @param type a bit set indicating the type * @return true if the index type specifier has the fulltext index flag set. */ public static final boolean hasFulltextIndex(int type) { return (type & TEXT) != 0; } /** * Returns true if the index type specifier has the mixed content * flag set. * * @param type a bit set indicating the type * @return true if the index type specifier has the mixed content * flag set. */ public static final boolean hasMixedContent(int type) { return (type & MIXED_CONTENT) != 0; } /** * Returns the index type bit mask corresponding to a given * XPath type (as defined in {@link org.exist.xquery.value.Type}). * * @param type XPath type * @return the index type bit mask */ public static final int xpathTypeToIndex(int type) { return indexTypes[type]; } /** * Returns true if the index type bit mask has a range index * bit set. * * @param type a bit set indicating the type * @return True if the index type bit mask has a range index bit set. */ public static final boolean hasRangeIndex(int type) { return (type & RANGE_INDEX_MASK) > 0 && !hasQNameIndex(type); } public static final boolean hasQNameIndex(int type) { return (type & QNAME_INDEX) != 0; } public static final boolean hasQNameOrValueIndex(int type) { return (type & HAS_VALUE_OR_MIXED_INDEX_MASK) > 0; } public static final boolean hasMixedTextIndex(int type) { return (type & TEXT_MIXED_CONTENT) > 0; } protected int type; protected RangeIndexSpec() { } /** * Returns the XPath type code for this index * (as defined in {@link org.exist.xquery.value.Type}). * * @return XPath type code */ public int getType() { return type; } /** * Returns the index type for this index, corresponding * to the constants defined in this class. * * @return index type */ public int getIndexType() { return indexTypes[type]; } /** * Returns the QName for which this index is created. Might be * null if it is a generic index. * * @return qname */ public QName getQName() { return null; } }