package adql.db; /* * 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,2015 - UDS/Centre de DonnĂ©es astronomiques de Strasbourg (CDS) * Astronomisches Rechen Institut (ARI) */ import java.util.ArrayList; import java.util.Collection; import adql.query.IdentifierField; import adql.query.from.ADQLTable; import cds.utils.TextualSearchList; /** * <p>A list of {@link DBTable} elements ordered by their ADQL name in an ascending manner.</p> * * <p> * In addition to an ADQL name, {@link DBTable} elements can be searched by specifying their schema and catalog. * These last information will be used only if the ADQL table name is ambiguous, otherwise all matching elements are returned. * </p> * * @author Grégory Mantelet (CDS;ARI) * @version 1.4 (08/2015) */ public class SearchTableList extends TextualSearchList<DBTable> { private static final long serialVersionUID = 1L; /** Indicates whether multiple occurrences are allowed. */ private boolean distinct = false; /* ************ */ /* CONSTRUCTORS */ /* ************ */ /** * Void constructor. */ public SearchTableList(){ super(new DBTableKeyExtractor()); } /** * Constructor by copy: all the elements of the given collection of {@link DBTable} are copied ordered into this list. * * @param collection Collection of {@link DBTable} to copy. */ public SearchTableList(final Collection<? extends DBTable> collection){ super(collection, new DBTableKeyExtractor()); } /** * Constructor with the initial capacity. * * @param initialCapacity Initial capacity of this list. */ public SearchTableList(final int initialCapacity){ super(initialCapacity, new DBTableKeyExtractor()); } /* ******* */ /* GETTERS */ /* ******* */ /** * Tells whether multiple occurrences are allowed. * * @return <i>true</i> means that multiple occurrences are allowed, <i>false</i> otherwise. */ public final boolean isDistinct(){ return distinct; } /** * Lets indicating that multiple occurrences are allowed. * * @param distinct <i>true</i> means that multiple occurrences are allowed, <i>false</i> otherwise. */ public final void setDistinct(final boolean distinct){ this.distinct = distinct; } /* ************** */ /* SEARCH METHODS */ /* ************** */ /** * Searches all {@link DBTable} elements which has the given name (case insensitive). * * @param tableName ADQL name of {@link DBTable} to search for. * * @return The corresponding {@link DBTable} elements. * * @see TextualSearchList#get(String) */ public ArrayList<DBTable> search(final String tableName){ return get(tableName); } /** * Searches all {@link DBTable} elements which have the given catalog, schema, and table name (case insensitive). * * @param catalog Catalog name. * @param schema Schema name. * @param table Table name. * * @return The list of all matching {@link DBTable} elements. * * @see #search(String, String, String, byte) */ public final ArrayList<DBTable> search(final String catalog, final String schema, final String table){ return search(catalog, schema, table, (byte)0); } /** * Searches all {@link DBTable} elements corresponding to the given {@link ADQLTable} (case insensitive). * * @param table An {@link ADQLTable}. * * @return The list of all corresponding {@link DBTable} elements. * * @see #search(String, String, String, byte) */ public ArrayList<DBTable> search(final ADQLTable table){ return search(table.getCatalogName(), table.getSchemaName(), table.getTableName(), table.getCaseSensitive()); } /** * Searches all {@link DBTable} elements which have the given catalog, schema, and table name, with the specified case sensitivity. * * @param catalog Catalog name. * @param schema Schema name. * @param table Table name. * @param caseSensitivity Case sensitivity for each table parts (one bit by part ; 0=sensitive,1=insensitive ; see {@link IdentifierField} for more details). * * @return The list of all matching {@link DBTable} elements. * * @see IdentifierField */ public ArrayList<DBTable> search(final String catalog, final String schema, final String table, final byte caseSensitivity){ ArrayList<DBTable> tmpResult = get(table, IdentifierField.TABLE.isCaseSensitive(caseSensitivity)); if (schema != null){ ArrayList<DBTable> result = new ArrayList<DBTable>(); for(DBTable match : tmpResult){ // No schema name (<=> no schema), then this table can not be a good match: if (match.getADQLSchemaName() == null) continue; if (IdentifierField.SCHEMA.isCaseSensitive(caseSensitivity)){ if (!match.getADQLSchemaName().equals(schema)) continue; }else{ if (!match.getADQLSchemaName().equalsIgnoreCase(schema)) continue; } if (catalog != null){ // No catalog name (<=> no catalog), then this table can not be a good match: if (match.getADQLCatalogName() == null) continue; if (IdentifierField.CATALOG.isCaseSensitive(caseSensitivity)){ if (!match.getADQLCatalogName().equals(catalog)) continue; }else{ if (!match.getADQLCatalogName().equalsIgnoreCase(catalog)) continue; } } result.add(match); } return result; }else return tmpResult; } /* ***************** */ /* INHERITED METHODS */ /* ***************** */ @Override public boolean add(final DBTable item){ if (distinct && contains(item)) return false; else return super.add(item); } /** * Lets extracting a key to associate with a given {@link DBTable} instance. * * @author Grégory Mantelet (CDS) * @version 09/2011 */ private static class DBTableKeyExtractor implements KeyExtractor<DBTable> { @Override public String getKey(DBTable obj){ return obj.getADQLName(); } } }