package adql.query; /* * This file is part of ADQLLibrary. * * ADQLLibrary 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 3 of the License, or * (at your option) any later version. * * ADQLLibrary 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 ADQLLibrary. If not, see <http://www.gnu.org/licenses/>. * * Copyright 2012 - UDS/Centre de DonnĂ©es astronomiques de Strasbourg (CDS) */ import adql.query.from.ADQLTable; import adql.query.operand.ADQLColumn; /** * <p> * Lets getting or setting the case sensitivity of an identifier (column, table, schema, catalog or alias) * of an {@link ADQLColumn} or an {@link ADQLTable}. * </p> * <p> * The case sensitivity of an ADQL identifier is defined in a single attribute of type 'byte'. Each bit is designed to * indicate the case sensitivity of a particular identifier part (from right to left): * </p> * <ul> * <li>1st bit = column</li> * <li>2nd bit = table</li> * <li>3rd bit = schema</li> * <li>4th bit = catalog</li> * <li>5th bit = alias</li> * </ul> * * <p> * Consequently to manage the case sensitivity of an identifier, you can use the following methods: * </p> * <ul> * <li>{@link #isCaseSensitive(byte)}: to know whether an identifier part is case sensitive or not in the given byte</li> * <li>{@link #setCaseSensitive(byte, boolean)}: to modify the given byte so that setting the case sensitivity of an identifier part</li> * </ul> * * <p><i><u>Example:</u> In {@link ADQLColumn}, the attribute 'caseSensitivity' lets managing the case sensitivity of all parts of the column identifier.</i></p> * <pre> * public class ADQLColumn implements ADQLOperand { * ... * private byte caseSensitivity = 0; * ... * public final boolean isCaseSensitive(IdentifierField field){ * return field.isCaseSensitive(caseSensitivity); * } * * public final void setCaseSensitive(IdentifierField field, boolean sensitive){ * caseSensitivity = field.setCaseSensitive(caseSensitivity, sensitive); * } * ... * } * * ADQLColumn column = new ADQLColumn("myCat.mySchema.myTable.colName"); * column.setCaseSensitive(IdentifierField.TABLE, true); * System.out.println("Is column name case sensitive ? "+column.isCaseSensitive(IdentifierField.COLUMN)); * </pre> * * @author Grégory Mantelet (CDS) * @version 08/2011 * * @see ADQLTable * @see ADQLColumn */ public enum IdentifierField{ COLUMN(0), TABLE(1), SCHEMA(2), CATALOG(3), ALIAS(4); private final byte nbShift; private IdentifierField(int b){ nbShift = (byte)b; } /** * Tells whether this field is case sensitive in the given global case sensitivity definition. * * @param caseSensitivity Definition of the case sensitivity of a whole ADQL identifier. * * @return <i>true</i> if this field is case sensitive, <i>false</i> otherwise. */ public final boolean isCaseSensitive(final byte caseSensitivity){ return ((caseSensitivity >> nbShift) & 0x01) == 1; } /** * Sets the case sensitivity of this identifier part in the given global case sensitivity definition. * * @param caseSensitivity Definition of the case sensitivity of a whole ADQL identifier. * @param sensitive <i>true</i> for case sensitive, <i>false</i> otherwise. * * @return The modified case sensitivity definition. */ public final byte setCaseSensitive(final byte caseSensitivity, final boolean sensitive){ byte mask = (byte)(0x01 << nbShift); if (sensitive) return (byte)(caseSensitivity | mask); else return (byte)(caseSensitivity & ~mask); } /** * Tells whether all identifier parts are case sensitive in the given global case sensitivity definition. * * @param caseSensitivity Definition of the case sensitivity of a whole ADQL identifier. * * @return <i>true</i> if all identifier parts are case sensitive, <i>false</i> otherwise. */ public static final boolean isFullCaseSensitive(final byte caseSensitivity){ return caseSensitivity == 0x1F; } /** * Gets a byte in which all identifier parts are case sensitive or not. * * @param sensitive <i>true</i> to set all identifier parts case sensitive, <i>false</i> otherwise. * * @return A byte with all identifier parts case sensitive if <i>sensitive</i> is <i>true</i>, <i>false</i> otherwise. */ public static final byte getFullCaseSensitive(final boolean sensitive){ if (sensitive) return 0x1F; else return 0; } }