/* * Copyright (C) 2010 eXo Platform SAS. * * This 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.1 of * the License, or (at your option) any later version. * * This software 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 software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.xcmis.sp.inmemory.query; import org.xcmis.search.InvalidQueryException; import org.xcmis.search.content.Schema.Column; import org.xcmis.search.content.Schema.Table; import org.xcmis.search.model.constraint.Operator; import org.xcmis.search.model.source.SelectorName; import org.xcmis.search.query.QueryExecutionException; import org.xcmis.spi.InvalidArgumentException; import org.xcmis.spi.ItemsIterator; import org.xcmis.spi.QueryNameTypeManager; import org.xcmis.spi.query.Result; import java.util.ArrayList; import java.util.List; /** * @author <a href="mailto:Sergey.Kabashnyuk@exoplatform.org">Sergey Kabashnyuk</a> * @version $Id: AvailableQueryOperatorsTest.java 34360 2009-07-22 23:58:59Z ksm $ * */ public class AvailableQueryOperatorsTest extends BaseQueryTest { private CmisSchema cmisSchema; @Override public void setUp() throws Exception { super.setUp(); cmisSchema = new CmisSchema(new QueryNameTypeManager(storage)); } public void testCmisDocument() throws Exception { checkCmisType("cmis:document"); } public void testCmisFolder() throws Exception { checkCmisType("cmis:folder"); } public void testCmisRelationship() throws Exception { checkCmisType("cmis:relationship"); } public void testCmisPolicy() throws Exception { checkCmisType("cmis:policy"); } /** * @param documentType * @throws QueryExecutionException * @throws InvalidQueryException */ private void checkCmisType(final String documentType) throws QueryExecutionException, InvalidQueryException { Table table = cmisSchema.getTable(new SelectorName(documentType)); for (Column column : table.getColumns()) { checkValid(documentType, column); checkInValid(documentType, column); } } /** * Check invalid operator's * @param column * @throws QueryExecutionException */ private void checkInValid(String tableName, Column column) throws QueryExecutionException { Operator[] unAvailableQueryOperators = getUnAvailableQueryOperators(column.getAvailableQueryOperators()); for (Operator operator : unAvailableQueryOperators) { StringBuffer query = new StringBuffer(); query.append("SELECT ").append(tableName).append(".*"); query.append(" FROM ").append(tableName); query.append(" WHERE "); query.append(tableName).append(".").append(column.getName()); switch (operator) { case EQUAL_TO : query.append("= 1"); break; case GREATER_THAN : query.append("> 1"); break; case GREATER_THAN_OR_EQUAL_TO : query.append(">= 1"); break; case LESS_THAN : query.append("< 1"); break; case LESS_THAN_OR_EQUAL_TO : query.append("<= 1"); break; case LIKE : query.append(" LIKE 'mooo' "); break; case NOT_EQUAL_TO : query.append(" <> 1"); break; default : fail("unknown operator " + operator); break; } try { org.xcmis.spi.query.Query cmisQuery = new org.xcmis.spi.query.Query(query.toString(), true); ItemsIterator<Result> result = storage.query(cmisQuery); fail("InvalidArgumentException should be thrown for invalid operator " + operator + " for columnt ='" + column.getName() + "'"); } catch (InvalidArgumentException e) { //ok } } } /** * Check valid operator's * * @param column * @throws InvalidQueryException * @throws QueryExecutionException */ private void checkValid(String tableName, Column column) throws QueryExecutionException, InvalidQueryException { for (Operator operator : column.getAvailableQueryOperators()) { StringBuffer query = new StringBuffer(); query.append("SELECT ").append(tableName).append(".*"); query.append(" FROM ").append(tableName); query.append(" WHERE "); query.append(tableName).append(".").append(column.getName()); switch (operator) { case EQUAL_TO : query.append("= 1"); break; case GREATER_THAN : query.append("> 1"); break; case GREATER_THAN_OR_EQUAL_TO : query.append(">= 1"); break; case LESS_THAN : query.append("< 1"); break; case LESS_THAN_OR_EQUAL_TO : query.append("<= 1"); break; case LIKE : query.append(" LIKE 'mooo' "); break; case NOT_EQUAL_TO : query.append(" <> 1"); break; default : fail("unknown operator " + operator); break; } org.xcmis.spi.query.Query cmisQuery = new org.xcmis.spi.query.Query(query.toString(), true); ItemsIterator<Result> result = storage.query(cmisQuery); } } /** * Return the array of unAvailableQueryOperators * @param availableQueryOperators * @return */ private Operator[] getUnAvailableQueryOperators(Operator[] availableQueryOperators) { List<Operator> result = new ArrayList<Operator>(); for (Operator operator : Operator.ALL) { boolean isValid = false; for (int i = 0; i < availableQueryOperators.length; i++) { if (operator.equals(availableQueryOperators[i])) { isValid = true; break; } } if (!isValid) { result.add(operator); } } return result.toArray(new Operator[result.size()]); } }