/** * 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.sp.inmemory.BaseTest; import org.xcmis.spi.BaseContentStream; import org.xcmis.spi.ContentStream; import org.xcmis.spi.DocumentData; import org.xcmis.spi.FolderData; import org.xcmis.spi.ItemsIterator; import org.xcmis.spi.ObjectData; import org.xcmis.spi.model.BaseType; import org.xcmis.spi.model.ContentStreamAllowed; import org.xcmis.spi.model.PropertyDefinition; import org.xcmis.spi.model.PropertyType; import org.xcmis.spi.model.TypeDefinition; import org.xcmis.spi.model.Updatability; import org.xcmis.spi.query.Query; import org.xcmis.spi.query.Result; import org.xcmis.spi.utils.Logger; import org.xcmis.spi.utils.MimeType; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * Created by The eXo Platform SAS. <br/> * Date: * * @author <a href="karpenko.sergiy@gmail.com">Karpenko Sergiy</a> * @version $Id: BaseQueryTest.java 2 2010-02-04 17:21:49Z andrew00x $ */ public abstract class BaseQueryTest extends BaseTest { private static final Logger LOG = Logger.getLogger(BaseQueryTest.class.getName()); protected final static String NASA_DOCUMENT = "cmis:nasa-mission"; protected final static String PROPERTY_BOOSTER = "cmis:booster-name"; protected final static String PROPERTY_COMMANDER = "cmis:commander"; protected final static String PROPERTY_COMMAND_MODULE_PILOT = "cmis:command-module-pilot"; protected final static String PROPERTY_LUNAR_MODULE_PILOT = "cmis:lunar-module-pilot"; protected final static String PROPERTY_BOOSTER_MASS = "cmis:booster-mass"; protected final static String PROPERTY_SAMPLE_RETURNED = "cmis:sample-returned"; protected final static String PROPERTY_STATUS = "cmis:status"; protected TypeDefinition nasaDocumentTypeDefinition; protected TypeDefinition folderTypeDefinition; /** * @see org.xcmis.sp.inmemory.BaseTest#setUp() */ @Override public void setUp() throws Exception { super.setUp(); Map<String, PropertyDefinition<?>> propertyDefinitions = new HashMap<String, PropertyDefinition<?>>(); propertyDefinitions.put("cmis:booster-name", new PropertyDefinition<String>("cmis:booster-name", "cmis:booster-name", "cmis:booster-name", null, "cmis:booster-name", "cmis:booster-name", PropertyType.STRING, Updatability.READWRITE, true, false, false, false, false, true, null, null)); propertyDefinitions.put("cmis:commander", new PropertyDefinition<String>("cmis:commander", "cmis:commander", "cmis:commander", null, "cmis:commander", "cmis:commander", PropertyType.STRING, Updatability.READWRITE, true, false, false, false, false, true, null, null)); propertyDefinitions.put("cmis:command-module-pilot", new PropertyDefinition<String>("cmis:command-module-pilot", "cmis:command-module-pilot", "cmis:command-module-pilot", null, "cmis:command-module-pilot", "cmis:command-module-pilot", PropertyType.STRING, Updatability.READWRITE, true, false, false, false, false, true, null, null)); propertyDefinitions.put("cmis:lunar-module-pilot", new PropertyDefinition<String>("cmis:lunar-module-pilot", "cmis:lunar-module-pilot", "cmis:lunar-module-pilot", null, "cmis:lunar-module-pilot", "cmis:lunar-module-pilot", PropertyType.STRING, Updatability.READWRITE, true, false, false, false, false, true, null, null)); propertyDefinitions.put("cmis:booster-mass", new PropertyDefinition<String>("cmis:booster-mass", "cmis:booster-mass", "cmis:booster-mass", null, "cmis:booster-mass", "cmis:booster-mass", PropertyType.DECIMAL, Updatability.READWRITE, true, false, false, false, false, true, null, null)); propertyDefinitions.put("cmis:sample-returned", new PropertyDefinition<String>("cmis:sample-returned", "cmis:sample-returned", "cmis:sample-returned", null, "cmis:sample-returned", "cmis:sample-returned", PropertyType.DECIMAL, Updatability.READWRITE, true, false, false, false, false, true, null, null)); propertyDefinitions.put("cmis:status", new PropertyDefinition<String>("cmis:status", "cmis:status", "cmis:status", null, "cmis:status", "cmis:status", PropertyType.BOOLEAN, Updatability.READWRITE, true, false, false, false, false, true, null, null)); storage.addType(new TypeDefinition("cmis:nasa-mission", BaseType.DOCUMENT, "cmis:nasa-mission", "cmis:nasa-mission", "", "cmis:document", "cmis:nasa-mission", "Cmis Document Type", true, true, true, true, true, true, true, true, null, null, ContentStreamAllowed.ALLOWED, propertyDefinitions)); storage.addType(new TypeDefinition("cmis:article", BaseType.DOCUMENT, "cmis:article", "cmis:article", "", "cmis:document", "cmis:article", "Cmis article", true, true, true, true, true, true, true, true, null, null, ContentStreamAllowed.ALLOWED, new HashMap<String, PropertyDefinition<?>>())); storage.addType(new TypeDefinition("cmis:article-sports", BaseType.DOCUMENT, "cmis:article-sports", "cmis:article-sports", "", "cmis:article", "cmis:article-sports", "Cmis cmis:article-sports", true, true, true, true, true, true, true, true, null, null, ContentStreamAllowed.ALLOWED, new HashMap<String, PropertyDefinition<?>>())); storage.addType(new TypeDefinition("cmis:article-animals", BaseType.DOCUMENT, "cmis:article-animals", "cmis:article-animals", "", "cmis:article", "cmis:article-animals", "Cmis cmis:article-animals", true, true, true, true, true, true, true, true, null, null, ContentStreamAllowed.ALLOWED, new HashMap<String, PropertyDefinition<?>>())); folderTypeDefinition = storage.getTypeDefinition("cmis:folder", true); nasaDocumentTypeDefinition = storage.getTypeDefinition("cmis:nasa-mission", true); } protected DocumentData createDocument(FolderData folder, String name, TypeDefinition typeDefinition, byte[] content, MimeType mimeType) throws Exception { ContentStream cs = new BaseContentStream(content, null, mimeType); return createDocument(folder, name, typeDefinition, cs, null); } // protected DocumentData createDocument(FolderData folder, String name, TypeDefinition typeDefinition, // ContentStream content, VersioningState versioningState) // { // PropertyDefinition<?> def = PropertyDefinitions.getPropertyDefinition("cmis:document", CmisConstants.NAME); // Map<String, Property<?>> properties = new HashMap<String, Property<?>>(); // properties.put(CmisConstants.NAME, new StringProperty(def.getId(), def.getQueryName(), def.getLocalName(), def // .getDisplayName(), name)); // // DocumentData document = // storage.createDocument(folder, typeDefinition, properties, content, null, null, versioningState == null // ? VersioningState.MAJOR : versioningState); // return document; // } // protected FolderData createFolder(FolderData folder, String name) // { // PropertyDefinition<?> def = PropertyDefinitions.getPropertyDefinition("cmis:folder", CmisConstants.NAME); // Map<String, Property<?>> properties = new HashMap<String, Property<?>>(); // properties.put(CmisConstants.NAME, new StringProperty(def.getId(), def.getQueryName(), def.getLocalName(), def // .getDisplayName(), name)); // // FolderData newFolder = storage.createFolder(folder, folderTypeDefinition, properties, null, null); // return newFolder; // } /** * // * Test NOT IN constraint. // * * <p> * // * Initial data: // * * <ul> * // * * <li>doc1: <b>Title</b> - node1 <b>long</b> - 3 // * * <li>doc2: <b>Title</b> - node2 <b>long</b> - 15 // * * </ul> * // * * <p> * // * Query : Select all documents where long property not in set {15 , * 20}. // * * <p> * // * Expected result: doc1 // * // * @throws Exception if an unexpected * error occurs // */ // public void testNotINConstraint() throws Exception // { // // // create data // String name = "fileCS2.doc"; // String name2 = "fileCS3.doc"; // String contentType = "text/plain"; // // Document doc1 = createDocument(testRoot, name, new byte[0], contentType); // doc1.setDecimal("long", new BigDecimal(3)); // // Document doc2 = createDocument(folder.getObjectId(), name2, new byte[0], contentType); // doc2.setDecimal("long", new BigDecimal(15)); // // String statement = "SELECT * FROM " + NASA_DOCUMENT + " WHERE long NOT IN (15, 20)"; // // Query query = new Query(statement, true); // ItemsIterator<Result> result = storage.query(query); // // checkResult(result, new Document[]{doc1}); // } protected void checkResult(ItemsIterator<Result> result, String[] columns, String[][] expectedResults) throws Exception { // expected Set<String> expectedPaths = new HashSet<String>(); if (LOG.isDebugEnabled()) { LOG.debug("expected:"); } for (int i = 0; i < expectedResults.length; i++) { String newRow = ""; for (int j = 0; j < expectedResults[i].length; j++) { newRow += "|" + expectedResults[i][j]; } expectedPaths.add(newRow); if (LOG.isDebugEnabled()) { LOG.debug(newRow); } } // actual Set<String> resultPaths = new HashSet<String>(); if (LOG.isDebugEnabled()) { LOG.debug("result:"); } while (result.hasNext()) { String objectId = result.next().getObjectId(); String resultRow = ""; for (String column : columns) { resultRow += "|" + getProperty(objectId, column); } resultPaths.add(resultRow); if (LOG.isDebugEnabled()) { LOG.debug(resultRow); } } checkResults(expectedPaths, resultPaths); } protected void checkResult(ItemsIterator<Result> result, ObjectData[] nodes) { // collect rows Set<String> expectedPaths = new HashSet<String>(); if (LOG.isDebugEnabled()) { LOG.debug("expected:"); } for (ObjectData node : nodes) { expectedPaths.add(node.getObjectId()); if (LOG.isDebugEnabled()) { LOG.debug(node.getObjectId()); } } Set<String> resultPaths = new HashSet<String>(); if (LOG.isDebugEnabled()) { LOG.debug("result:"); } while (result.hasNext()) { Result next = result.next(); String id = next.getObjectId(); resultPaths.add(id); //LOG.debug("id:=" + id + " path:=" + object.getParent().getPath() + "/" + object.getName()); } checkResults(expectedPaths, resultPaths); } protected void checkResult(String statement, ObjectData[] nodes) { Query query = new Query(statement, true); ItemsIterator<Result> result = storage.query(query); checkResult(result, nodes); } protected void checkResultOrder(ItemsIterator<Result> result, ObjectData[] nodes) { // collect rows String expectedPaths = ""; if (LOG.isDebugEnabled()) { LOG.debug("expected:"); } for (ObjectData node : nodes) { expectedPaths += ":" + node.getObjectId(); if (LOG.isDebugEnabled()) { LOG.debug(node.getObjectId()); } } String resultPaths = ""; if (LOG.isDebugEnabled()) { LOG.debug("result:"); } while (result.hasNext()) { String id = result.next().getObjectId(); resultPaths += ":" + id; if (LOG.isDebugEnabled()) { LOG.debug(id); } } assertEquals(expectedPaths, resultPaths); } private void checkResults(Set<String> expectedRowResults, Set<String> actualRowResults) { // check if all expected are in result for (String path : expectedRowResults) { assertTrue(path + " is not part of the result set " + actualRowResults, actualRowResults.contains(path)); } // check result does not contain more than expected for (String path : actualRowResults) { assertTrue(path + " is not expected to be part of the result set", expectedRowResults.contains(path)); } } private String getProperty(String objectId, String propertyId) throws Exception { ObjectData entry = storage.getObjectById(objectId); return entry.getProperty(propertyId).toString(); } }