/**
* 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.spi.BaseContentStream;
import org.xcmis.spi.CmisConstants;
import org.xcmis.spi.ContentStream;
import org.xcmis.spi.DocumentData;
import org.xcmis.spi.FolderData;
import org.xcmis.spi.ItemsIterator;
import org.xcmis.spi.model.CapabilityJoin;
import org.xcmis.spi.model.CapabilityQuery;
import org.xcmis.spi.model.RepositoryCapabilities;
import org.xcmis.spi.model.TypeDefinition;
import org.xcmis.spi.model.UnfileObject;
import org.xcmis.spi.model.impl.BooleanProperty;
import org.xcmis.spi.model.impl.DecimalProperty;
import org.xcmis.spi.model.impl.StringProperty;
import org.xcmis.spi.query.Query;
import org.xcmis.spi.query.Result;
import org.xcmis.spi.utils.MimeType;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by The eXo Platform SAS. <br/>
* Date:
*
* @author <a href="karpenko.sergiy@gmail.com">Karpenko Sergiy</a>
* @version $Id: QueryUsecasesTest.java 27 2010-02-08 07:49:20Z andrew00x $
*/
public class QueryUsecasesTest extends BaseQueryTest
{
private final static String NASA_DOCUMENT = "cmis:nasa-mission";
private final static String PROPERTY_BOOSTER = "cmis:booster-name";
private final static String PROPERTY_COMMANDER = "cmis:commander";
private final static String PROPERTY_COMMAND_MODULE_PILOT = "cmis:command-module-pilot";
private final static String PROPERTY_LUNAR_MODULE_PILOT = "cmis:lunar-module-pilot";
private final static String PROPERTY_BOOSTER_MASS = "cmis:booster-mass";
private final static String PROPERTY_SAMPLE_RETURNED = "cmis:sample-returned";
private final static String PROPERTY_STATUS = "cmis:status";
private FolderData testRoot;
@Override
public void setUp() throws Exception
{
super.setUp();
testRoot = createFolder(rootFolder, "QueryUsecasesTest");
// create data
}
public void testSearchCapabilities() throws Exception
{
RepositoryCapabilities repCapabilities = storage.getRepositoryInfo().getCapabilities();
assertEquals(CapabilityQuery.BOTHCOMBINED, repCapabilities.getCapabilityQuery());
assertEquals(CapabilityJoin.NONE, repCapabilities.getCapabilityJoin());
assertFalse(repCapabilities.isCapabilityPWCSearchable());
assertFalse(repCapabilities.isCapabilityAllVersionsSearchable());
}
/**
* Test query with one 'and' two or' constraints.
* <p>
* Initial data:
* <ul>
* <li>document1: <b>Title</b> - Apollo 7 <b>exo:Booster</b> - Saturn 1B
* <b>exo:Commander</b> - Walter M. Schirra</li>
* <li>document2: <b>Title</b> - Apollo 8 <b>exo:Booster</b> - Saturn V
* <b>exo:Commander</b> - Frank F. Borman, II</li>
* <li>document3: <b>Title</b> - Apollo 13<b> exo:Booster</b> - Saturn V
* <b>exo:Commander</b> - James A. Lovell, Jr.</li>
* </ul>
* <p>
* Query : Select all documents where exo:Booster is 'Saturn V' and
* exo:Commander is Frank F. Borman, II or James A. Lovell, Jr.
* <p>
* Expected result: document2 and document3
*
* @throws Exception if an unexpected error occurs
*/
public void testAndOrConstraint() throws Exception
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
StringBuffer sql = new StringBuffer();
sql.append("SELECT * ");
sql.append("FROM ");
sql.append(NASA_DOCUMENT);
sql.append(" WHERE ");
sql.append(PROPERTY_BOOSTER + " = " + "'Saturn V'");
sql.append(" AND ( " + PROPERTY_COMMANDER + " = 'Frank F. Borman, II' ");
sql.append(" OR " + PROPERTY_COMMANDER + " = 'James A. Lovell, Jr.' )");
Query query = new Query(sql.toString(), true);
ItemsIterator<Result> result = storage.query(query);
// check results
checkResult(result, new DocumentData[]{appolloContent.get(1), appolloContent.get(2)});
}
/**
* Test IN_FOLDER constraint.
* <p>
* Initial data:
* <ul>
* <li>folder1:
* <li>doc1: <b>Title</b> - node1
* <li>folder2
* <li>doc2: <b>Title</b> - node2
* </ul>
* <p>
* Query : Select all documents that are in folder1.
* <p>
* Expected result: doc1
*
* @throws Exception if an unexpected error occurs
*/
public void testDocumentInFolderConstrain() throws Exception
{
// create data
FolderData testRoot1 = createFolder(testRoot, "testDocumentInFolderConstrain1");
FolderData testRoot2 = createFolder(testRoot, "testDocumentInFolderConstrain2");
List<DocumentData> appolloContent = createNasaContent(testRoot1);
List<DocumentData> appolloContent2 = createNasaContent(testRoot2);
String statement = "SELECT * FROM " + NASA_DOCUMENT + " WHERE IN_FOLDER( '" + testRoot2.getObjectId() + "')";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
// check results
checkResult(result, appolloContent2.toArray(new DocumentData[appolloContent2.size()]));
}
/**
* Test IN_FOLDER constraint.
* <p>
* Initial data:
* <p>
* folder1:
* <p>
* -doc1: <b>Title</b> - node1
* <p>
* folder2:
* <p>
* -doc2: <b>Title</b> - node2
* <p>
* -folder3:
* <p>
* --folder4 </ul>
* <p>
* Query : Select all folders that are in folder1.
* <p>
* Expected result: folder3
*
* @throws Exception if an unexpected error occurs
*/
public void testFolderInFolderConstrain() throws Exception
{
// create data
FolderData folder1 = createFolder(testRoot, "folder1");
DocumentData doc1 =
createDocument(folder1, "node1", nasaDocumentTypeDefinition, "hello world".getBytes(), MimeType
.fromString("text/plain"));
FolderData folder2 = createFolder(testRoot, "folder2");
DocumentData doc2 =
createDocument(folder2, "node2", nasaDocumentTypeDefinition, "hello world".getBytes(), MimeType
.fromString("text/plain"));
FolderData folder3 = createFolder(folder1, "folder3");
DocumentData doc3 =
createDocument(folder3, "node3", nasaDocumentTypeDefinition, "hello world".getBytes(), MimeType
.fromString("text/plain"));
FolderData folder4 = createFolder(folder3, "folder4");
String statement = "SELECT * FROM cmis:folder WHERE IN_FOLDER( '" + folder1.getObjectId() + "')";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
// check results
checkResult(result, new FolderData[]{folder3});
}
//
// /**
// * Constraints with multi-valued properties is not supported.
// *
// * @throws Exception
// */
// // XXX temporary excluded
// public void _testAnyInConstraint() throws Exception
// {
// // create data
// String name = "fileCS2.doc";
// String name2 = "fileCS3.doc";
// String contentType = "text/plain";
//
// Document folder = createFolder(root, "CASETest");
//
// Document doc1 = createDocument(folder.getObjectId(), name, new byte[0], contentType);
// doc1.setDecimals("multivalueLong", new BigDecimal[]{new BigDecimal(3), new BigDecimal(5), new BigDecimal(10)});
// doc1.setStrings("multivalueString", new String[]{"bla-bla"});
// doc1.save();
//
// Document doc2 = createDocument(folder.getObjectId(), name2, new byte[0], contentType);
// doc2.setDecimals("multivalueLong", new BigDecimal[]{new BigDecimal(15), new BigDecimal(10)});
// doc2.setStrings("multivalueString", new String[]{"bla-bla"});
// doc2.save();
//
// String statement =
// "SELECT * FROM " + NASA_DOCUMENT + " WHERE ANY multivalueLong IN ( 3 , 5, 6 ) ";
//
// Query query = new Query(statement, true);
//
// ItemsIterator<Result> result = storage.query(query);
//
// // check results
// checkResult(result, new Document[]{doc1});
// }
//
/**
* Test fulltext constraint.
* <p>
* Initial data:
* <p>
* see createApolloContent()
* <p>
* Query : Select all documents where data contains "moon" word.
* <p>
* Expected result: document1 and document2
*
* @throws Exception if an unexpected error occurs
*/
public void testFulltextConstraint() throws Exception
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
String statement1 = "SELECT * FROM " + NASA_DOCUMENT + " WHERE CONTAINS(\"moon\")";
Query query = new Query(statement1, true);
ItemsIterator<Result> result = storage.query(query);
assertEquals(2, result.size());
checkResult(result, new DocumentData[]{appolloContent.get(1), appolloContent.get(2)});
String statement2 = "SELECT * FROM " + NASA_DOCUMENT + " WHERE CONTAINS(\"Moon\")";
query = new Query(statement2, true);
ItemsIterator<Result> result2 = storage.query(query);
assertEquals(2, result2.size());
checkResult(result2, new DocumentData[]{appolloContent.get(1), appolloContent.get(2)});
}
/**
* Test 'IN' constraint.
* <p>
* Initial data:
* <ul>
* <li>document1: <b>Title</b> - node1 <b>name</b> - supervisor
* <li>document2: <b>Title</b> - node2 <b>name</b> - anyname
* </ul>
* <p>
* Query : Select all documents where name is in set {'admin' , 'supervisor'
* , 'Vasya' }.
* <p>
* Expected result: document2 and document3
*
* @throws Exception if an unexpected error occurs
*/
public void testINConstraint() throws Exception
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
String statement =
"SELECT * FROM " + NASA_DOCUMENT + " WHERE " + PROPERTY_COMMANDER
+ " IN ('Virgil I. Grissom', 'Frank F. Borman, II', 'Charles Conrad, Jr.')";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
assertEquals(1, result.size());
checkResult(result, new DocumentData[]{appolloContent.get(1)});
}
//
// /**
// * Test JOIN with condition constraint.
// * <p>
// * Initial data:
// * <ul>
// * <li>folder1: <b>folderName</b> - folderOne
// * <li>doc1: <b>Title</b> - node1 <b>parentFolderName</b> - folderOne
// * <li>folder2: b>folderName</b> - folderTwo
// * <li>doc2: <b>Title</b> - node2 <b>parentFolderName</b> - folderThree
// * </ul>
// * <p>
// * Query : Select all documents and folders where folders folderName equal to
// * document parentFolderName.
// * <p>
// * Expected result: doc1 and folder1
// *
// * @throws Exception if an unexpected error occurs
// */
// // XXX temporary excluded
// public void _testJoinWithCondition() throws Exception
// {
// // create data
// Document folder1 = this.createFolder(root, "folder1");
// folder1.setString("folderName", "folderOne");
//
// Document doc1 = createDocument(folder1.getObjectId(), "node1", "hello world".getBytes(), "text/plain");
// doc1.setString("parentFolderName", "folderOne");
//
// Document folder2 = this.createFolder(root, "folder2");
// folder2.setString("folderName", "folderTwo");
//
// Document doc2 = createDocument(folder2.getObjectId(), "node1", "hello world".getBytes(), "text/plain");
// doc2.setString("parentFolderName", "folderThree");
//
// String statement =
// "SELECT doc.* FROM " + NASA_DOCUMENT + " AS doc LEFT JOIN " + JcrCMIS.NT_FOLDER
// + " AS folder ON (doc.parentFolderName = folder.folderName)";
//
// Query query = new Query(statement, true);
// ItemsIterator<Result> result = storage.query(query);
//
// assertEquals(1, result.size());
// // TODO check results - must doc1 and folder1
// }
//
/**
* Test LIKE constraint.
* <p>
* Initial data:
* <ul>
* <li>doc1: <b>Title</b> - node1 <b>prop</b> - administrator
* <li>doc2: <b>Title</b> - node2 <b>prop</b> - admin
* <li>doc3: <b>Title</b> - node2 <b>prop</b> - radmin
* </ul>
* <p>
* Query : Select all documents where prop begins with "ad".
* <p>
* Expected result: doc1, doc2
*
* @throws Exception if an unexpected error occurs
*/
public void testLIKEConstraint() throws Exception
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
String statement = "SELECT * FROM " + NASA_DOCUMENT + " AS doc WHERE " + PROPERTY_COMMANDER + " LIKE 'James%'";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
// check results
assertEquals(1, result.size());
checkResult(result, new DocumentData[]{appolloContent.get(2)});
}
/**
* Test LIKE constraint with escape symbols.
* <p>
* Initial data:
* <ul>
* <li>doc1: <b>Title</b> - node1 <b>prop</b> - ad%min master
* <li>doc2: <b>Title</b> - node2 <b>prop</b> - admin operator
* <li>doc3: <b>Title</b> - node2 <b>prop</b> - radmin
* </ul>
* <p>
* Query : Select all documents where prop like 'ad\\%min%'.
* <p>
* Expected result: doc1
*
* @throws Exception if an unexpected error occurs
*/
public void testLIKEConstraintEscapeSymbols() throws Exception
{
DocumentData doc1 =
createDocument(testRoot, "node1", nasaDocumentTypeDefinition, "hello world".getBytes(), MimeType
.fromString("text/plain"));
doc1.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "ad%min master"));
DocumentData doc2 =
createDocument(testRoot, "node2", nasaDocumentTypeDefinition, "hello world".getBytes(), MimeType
.fromString("text/plain"));
doc2.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "admin operator"));
DocumentData doc3 =
createDocument(testRoot, "node3", nasaDocumentTypeDefinition, "hello world".getBytes(), MimeType
.fromString("text/plain"));
doc3.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "radmin"));
String statement =
"SELECT * FROM " + NASA_DOCUMENT + " AS doc WHERE " + PROPERTY_COMMANDER + " LIKE 'ad\\%min%'";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
// check results
assertEquals(1, result.size());
checkResult(result, new DocumentData[]{doc1});
}
/**
* Test NOT constraint.
* <p>
* Initial data:
* <ul>
* <li>doc1: <b>Title</b> - node1 <b>content</b> - hello world
* <li>doc2: <b>Title</b> - node2 <b>content</b> - hello
* </ul>
* <p>
* Query : Select all documents that not contains "world" word.
* <p>
* Expected result: doc2
*
* @throws Exception if an unexpected error occurs
*/
public void testNOTConstraint() throws Exception
{
Map<String, String> parameters = new HashMap<String, String>();
parameters.put(CmisConstants.CHARSET, "UTF-8");
DocumentData doc1 =
createDocument(testRoot, "node1", nasaDocumentTypeDefinition, "hello world".getBytes(),
new MimeType("text", "plain", parameters));
FolderData folder2 = createFolder(testRoot, "folder2");
DocumentData doc2 =
createDocument(folder2, "node2", nasaDocumentTypeDefinition, "hello".getBytes(),
new MimeType("text", "plain", parameters));
String statement = "SELECT * FROM " + NASA_DOCUMENT + " WHERE NOT CONTAINS(\"world\")";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{doc2});
}
/**
* 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
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
String statement =
"SELECT * FROM " + NASA_DOCUMENT + " WHERE " + PROPERTY_COMMANDER
+ " NOT IN ('Walter M. Schirra', 'James A. Lovell, Jr.')";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{appolloContent.get(1), appolloContent.get(3)});
}
/**
* Test NOT NOT (not counteraction).
* <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 in set {15 , 20} (NOT NOT
* IN).
* <p>
* Expected result: doc2
*
* @throws Exception if an unexpected error occurs
*/
public void testNotNotINConstraint() throws Exception
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
String statement =
"SELECT * FROM " + NASA_DOCUMENT + " WHERE NOT (" + PROPERTY_COMMANDER + " NOT IN ('James A. Lovell, Jr.'))";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{appolloContent.get(2)});
}
/**
* Test Order By desc.
* <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 : Order by exo:Commander property value
* <p>
* Expected result: doc2
*
* @throws Exception if an unexpected error occurs
*/
public void testOrderByFieldDesc() throws Exception
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
StringBuffer sql = new StringBuffer();
sql.append("SELECT ");
sql.append(CmisConstants.LAST_MODIFIED_BY + " as last , ");
sql.append(CmisConstants.OBJECT_ID + " , ");
sql.append(CmisConstants.LAST_MODIFICATION_DATE);
sql.append(" FROM ");
sql.append(NASA_DOCUMENT);
sql.append(" ORDER BY ");
sql.append(PROPERTY_COMMANDER);
sql.append(" DESC");
String statement = sql.toString();
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
// Walter M. Schirra (0)
// James A. Lovell, Jr. (2)
// Frank F. Borman, II (1)
//Eugene A. Cernan (3)
checkResultOrder(result, new DocumentData[]{appolloContent.get(0), appolloContent.get(2), appolloContent.get(1),
appolloContent.get(3)});
}
/**
* Test ORDER BY ASC.
* <p>
* Initial data: see createApolloContent
* <p>
* Query : Select all documents and order by propertyComander values
* ascending.
* <p>
* Expected result: doc2, doc3, doc1
*
* @throws Exception if an unexpected error occurs
*/
public void testOrderByFieldAsk() throws Exception
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
StringBuffer sql = new StringBuffer();
sql.append("SELECT ");
sql.append(CmisConstants.LAST_MODIFIED_BY + ", ");
sql.append(CmisConstants.OBJECT_ID + ", ");
sql.append(CmisConstants.LAST_MODIFICATION_DATE);
sql.append(" FROM ");
sql.append(NASA_DOCUMENT);
sql.append(" ORDER BY ");
sql.append(PROPERTY_COMMANDER);
String statement = sql.toString();
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
//Eugene A. Cernan (3)
// Frank F. Borman, II (1)
// James A. Lovell, Jr. (2)
// Walter M. Schirra (0)
checkResultOrder(result, new DocumentData[]{appolloContent.get(3), appolloContent.get(1), appolloContent.get(2),
appolloContent.get(0)});
}
/**
* Test ORDER BY default.
* <p>
* Initial data: see createApolloContent
* <p>
* Query : Select all documents and order by propertyComander values
* ascending.
* <p>
* Expected result: doc3, doc1, doc2
*
* @throws Exception if an unexpected error occurs
*/
public void testOrderByDefault() throws Exception
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
StringBuffer sql = new StringBuffer();
sql.append("SELECT ");
sql.append(CmisConstants.LAST_MODIFIED_BY + ", ");
sql.append(CmisConstants.OBJECT_ID + ", ");
sql.append(CmisConstants.LAST_MODIFICATION_DATE);
sql.append(" FROM ");
sql.append(NASA_DOCUMENT);
String statement = sql.toString();
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
// Apollo 13 (2)
// Apollo 17 (3)
// Apollo 7 (0)
// Apollo 8 (1)
checkResultOrder(result, new DocumentData[]{appolloContent.get(2), appolloContent.get(3), appolloContent.get(0),
appolloContent.get(1)});
}
/**
* Test ORDER BY SCORE().
* <p>
* Initial data: see createApolloContent
* <p>
* Query : Select all documents and order by propertyComander values
* ascending.
* <p>
* Expected result: doc3, doc1, doc2
*
* @throws Exception if an unexpected error occurs
*/
public void testOrderByScore() throws Exception
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
StringBuffer sql = new StringBuffer();
sql.append("SELECT ");
sql.append(" SCORE() AS scoreCol, ");
sql.append(CmisConstants.LAST_MODIFIED_BY + ", ");
sql.append(CmisConstants.OBJECT_ID + ", ");
sql.append(CmisConstants.LAST_MODIFICATION_DATE);
sql.append(" FROM ");
sql.append(NASA_DOCUMENT);
sql.append(" WHERE CONTAINS(\"moon\") ");
sql.append(" ORDER BY SCORE() ");
String statement = sql.toString();
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
// Apollo 8 (1)
// Apollo 13 (2)
checkResultOrder(result, new DocumentData[]{appolloContent.get(1), appolloContent.get(2)});
}
//
/**
* Test property existence constraint (IS [NOT] NULL) .
* <p>
* Initial data:
* <ul>
* <li>doc1: <b>Title</b> - node1 <b>prop</b> - test string
* <li>doc2: <b>Title</b> - node2
* </ul>
* <p>
* Query : Select all documents that has "prop" property (IS NOT NULL).
* <p>
* Expected result: doc1
*
* @throws Exception if an unexpected error occurs
*/
public void testPropertyExistence() throws Exception
{
// Document folder1 = createFolder(root, "CASETest");
DocumentData doc1 =
createDocument(testRoot, "node1", nasaDocumentTypeDefinition, "hello world".getBytes(), MimeType
.fromString("text/plain"));
doc1.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "James A. Lovell, Jr."));
DocumentData doc2 =
createDocument(testRoot, "node2", nasaDocumentTypeDefinition, "hello".getBytes(), MimeType
.fromString("text/plain"));
String statement = "SELECT * FROM " + NASA_DOCUMENT + " WHERE " + PROPERTY_COMMANDER + " IS NOT NULL";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{doc1});
}
/**
* Test SCORE as column.
* <p>
* Initial data:
* <ul>
* <li>doc1: <b>Title</b> - node1 <b>content</b> - hello world
* <li>doc2: <b>Title</b> - node2 <b>content</b> - hello
* </ul>
* <p>
* Query : Select all documents that contains hello or world words, and show
* search score .
* <p>
* Expected result: doc1 and doc2 score numbers.
*
* @throws Exception if an unexpected error occurs
*/
public void testScoreAsColumn() throws Exception
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
String statement =
"SELECT SCORE() AS scoreCol , " + CmisConstants.NAME + " AS id FROM " + NASA_DOCUMENT
+ " WHERE CONTAINS(\"hello OR world\") ORDER BY SCORE()";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
// check result
while (result.hasNext())
{
Result next = result.next();
assertTrue(next.getScore().getScoreValue().doubleValue() > 0);
}
}
/**
* Test IN_TREE constraint.
* <p>
* Initial data:
* <p>
* folder1
* <p>
* - document doc1
* <p>
* - folder2
* <p>
* -- document doc2
* <p>
* Query : Select all documents that are in tree of folder1.
* <p>
* Expected result: doc1,doc2.
*
* @throws Exception if an unexpected error occurs
*/
public void testTreeConstrain() throws Exception
{
// create data
FolderData folder1 = createFolder(testRoot, "folder1");
DocumentData doc1 =
createDocument(folder1, "node1", nasaDocumentTypeDefinition, "hello world".getBytes(), MimeType
.fromString("text/plain"));
FolderData subfolder1 = createFolder(folder1, "folder2");
DocumentData doc2 =
createDocument(subfolder1, "node1", nasaDocumentTypeDefinition, "hello world".getBytes(), MimeType
.fromString("text/plain"));
String statement = "SELECT * FROM " + NASA_DOCUMENT + " WHERE IN_TREE('" + folder1.getObjectId() + "')";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{doc1, doc2});
}
/**
* Test not equal comparison (<>).
* <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 property long not equal to 3.
* <p>
* Expected result: doc2.
*
* @throws Exception if an unexpected error occurs
*/
public void testNotEqualDecimal() throws Exception
{
// create data
String name = "fileCS2.doc";
String name2 = "fileCS3.doc";
MimeType contentType = MimeType.fromString("text/plain");
FolderData folder = createFolder(testRoot, "NotEqualDecimal");
DocumentData doc1 = createDocument(folder, name, nasaDocumentTypeDefinition, new byte[0], contentType);
doc1.setProperty(new DecimalProperty(PROPERTY_BOOSTER_MASS, PROPERTY_BOOSTER_MASS, PROPERTY_BOOSTER_MASS,
PROPERTY_BOOSTER_MASS, new BigDecimal(3)));
DocumentData doc2 = createDocument(folder, name2, nasaDocumentTypeDefinition, new byte[0], contentType);
doc2.setProperty(new DecimalProperty(PROPERTY_BOOSTER_MASS, PROPERTY_BOOSTER_MASS, PROPERTY_BOOSTER_MASS,
PROPERTY_BOOSTER_MASS, new BigDecimal(15)));
String statement = "SELECT * FROM " + NASA_DOCUMENT + " WHERE " + PROPERTY_BOOSTER_MASS + " <> 3";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{doc2});
}
/**
* Test more than comparison (>).
* <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 property long more than 5.
* <p>
* Expected result: doc2.
*
* @throws Exception if an unexpected error occurs
*/
public void testMoreThanDecimal() throws Exception
{
// create data
String name = "fileCS2.doc";
String name2 = "fileCS3.doc";
MimeType contentType = MimeType.fromString("text/plain");
FolderData folder = createFolder(testRoot, "CASETest");
DocumentData doc1 = createDocument(folder, name, nasaDocumentTypeDefinition, new byte[0], contentType);
doc1.setProperty(new DecimalProperty(PROPERTY_BOOSTER_MASS, PROPERTY_BOOSTER_MASS, PROPERTY_BOOSTER_MASS,
PROPERTY_BOOSTER_MASS, new BigDecimal(3)));
DocumentData doc2 = createDocument(folder, name2, nasaDocumentTypeDefinition, new byte[0], contentType);
doc2.setProperty(new DecimalProperty(PROPERTY_BOOSTER_MASS, PROPERTY_BOOSTER_MASS, PROPERTY_BOOSTER_MASS,
PROPERTY_BOOSTER_MASS, new BigDecimal(15)));
String statement = "SELECT * FROM " + NASA_DOCUMENT + " WHERE " + PROPERTY_BOOSTER_MASS + " > 5";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{doc2});
}
/**
* Test not equal comparison (<>) string.
* <p>
* Initial data:
* <ul>
* <li>doc1: <b>Title</b> - node1 <b>strprop</b> - test word first
* <li>doc2: <b>Title</b> - node2 <b>strprop</b> - test word second
* </ul>
* <p>
* Query : Select all documents property strprop not equal to
* "test word second".
* <p>
* Expected result: doc1.
*
* @throws Exception if an unexpected error occurs
*/
public void testNotEqualString() throws Exception
{
// create data
String name = "fileCS2.doc";
String name2 = "fileCS3.doc";
MimeType contentType = MimeType.fromString("text/plain");
FolderData folder = createFolder(testRoot, "CASETest");
DocumentData doc1 = createDocument(folder, name, nasaDocumentTypeDefinition, new byte[0], contentType);
doc1.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "test word first"));
DocumentData doc2 = createDocument(folder, name2, nasaDocumentTypeDefinition, new byte[0], contentType);
doc2.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "test word second"));
String statement = "SELECT * FROM " + NASA_DOCUMENT + " WHERE " + PROPERTY_COMMANDER + " <> 'test word second'";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{doc1});
}
/**
* Test fulltext search from jcr:content.
* <p>
* Initial data:
* <ul>
* <li>doc1: <b>Title</b> - node1 <b>content</b> - "There must be test word"
* <li>doc2: <b>Title</b> - node2 <b>content</b> - " Test word is not here"
* </ul>
* <p>
* Query : Select all documents that contains "here" word.
* <p>
* Expected result: doc2.
*
* @throws Exception if an unexpected error occurs
*/
public void testSimpleFulltext() throws Exception
{
// create data
String name1 = "fileFirst";
String name2 = "fileSecond";
MimeType contentType = MimeType.fromString("text/plain");
FolderData folder = createFolder(testRoot, "SimpleFullTextTest");
DocumentData doc1 = createDocument(folder, name1, nasaDocumentTypeDefinition, new byte[0], contentType);
doc1.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "There must be test word"));
DocumentData doc2 = createDocument(folder, name2, nasaDocumentTypeDefinition, new byte[0], contentType);
doc2.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "Test word is not here"));
String statement = "SELECT * FROM " + NASA_DOCUMENT + " WHERE CONTAINS(\"here\")";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{doc2});
}
/**
* Test complex fulltext query.
* <p>
* Initial data:
* <ul>
* <li>doc1: <b>Title</b> - node1 <b>strprop</b> - "There must be test word"
* <li>doc2: <b>Title</b> - node2 <b>strprop</b> -
* " Test word is not here. Another check-word."
* <li>doc3: <b>Title</b> - node3 <b>strprop</b> -
* "There must be check-word."
* </ul>
* <p>
* Query : Select all documents that contains "There must" phrase and do not
* contain "check-word" word.
* <p>
* Expected result: doc1.
*
* @throws Exception if an unexpected error occurs
*/
public void testExtendedFulltext() throws Exception
{
// create data
String name1 = "fileCS1.doc";
String name2 = "fileCS2.doc";
String name3 = "fileCS3.doc";
MimeType contentType = MimeType.fromString("text/plain");
FolderData folder = createFolder(testRoot, "CASETest");
DocumentData doc1 = createDocument(folder, name1, nasaDocumentTypeDefinition, new byte[0], contentType);
doc1.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "There must be test word"));
DocumentData doc2 = createDocument(folder, name2, nasaDocumentTypeDefinition, new byte[0], contentType);
doc2.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "Test word is not here. Another check-word."));
DocumentData doc3 = createDocument(folder, name3, nasaDocumentTypeDefinition, new byte[0], contentType);
doc2.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "There must be check-word."));
String statement =
"SELECT * FROM " + NASA_DOCUMENT + " WHERE CONTAINS(\"\\\"There must\\\" -\\\"check\\-word\\\"\")";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{doc1});
}
/**
* Same as testNOTConstraint.
*/
public void testNotContains() throws Exception
{
// create data
String name = "fileCS2.doc";
String name2 = "fileCS3.doc";
MimeType contentType = MimeType.fromString("text/plain");
DocumentData doc1 = createDocument(testRoot, name, nasaDocumentTypeDefinition, new byte[0], contentType);
doc1.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "There must be test word"));
DocumentData doc2 = createDocument(testRoot, name2, nasaDocumentTypeDefinition, new byte[0], contentType);
doc2.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "Test word is not here"));
String statement = "SELECT * FROM " + NASA_DOCUMENT + " WHERE NOT CONTAINS(\"here\")";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{doc1});
}
/**
* Test comparison of boolean property.
* <p>
* Initial data:
* <ul>
* <li>doc1: <b>Title</b> - node1 <b>boolprop</b> - true
* <li>doc2: <b>Title</b> - node2 <b>boolprop</b> - false
* </ul>
* <p>
* Query : Select all documents where boolprop equal to false.
* <p>
* Expected result: doc2.
*
* @throws Exception if an unexpected error occurs
*/
public void testBooleanConstraint() throws Exception
{
// create data
String name = "fileCS2.doc";
String name2 = "fileCS3.doc";
MimeType contentType = MimeType.fromString("text/plain");
DocumentData doc1 = createDocument(testRoot, name, nasaDocumentTypeDefinition, new byte[0], contentType);
doc1.setProperty(new BooleanProperty(PROPERTY_STATUS, PROPERTY_STATUS, PROPERTY_STATUS, PROPERTY_STATUS, true));
DocumentData doc2 = createDocument(testRoot, name2, nasaDocumentTypeDefinition, new byte[0], contentType);
doc2.setProperty(new BooleanProperty(PROPERTY_STATUS, PROPERTY_STATUS, PROPERTY_STATUS, PROPERTY_STATUS, false));
String statement = "SELECT * FROM " + NASA_DOCUMENT + " WHERE (" + PROPERTY_STATUS + " = FALSE )";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{doc2});
}
/**
* Test comparison of date property.
* <p>
* Initial data:
* <ul>
* <li>doc1: <b>Title</b> - node1 <b>dateProp</b> - 2009-08-08
* <li>doc2: <b>Title</b> - node2 <b>dateProp</b> - 2009-08-08
* </ul>
* <p>
* Query : Select all documents where dateProp more than 2007-01-01.
* <p>
* Expected result: doc2.
*
* @throws Exception if an unexpected error occurs
*/
public void testDateConstraint() throws Exception
{
// create data
String name = "fileCS2.doc";
String name2 = "fileCS3.doc";
MimeType contentType = MimeType.fromString("text/plain");
DocumentData doc1 = createDocument(testRoot, name, nasaDocumentTypeDefinition, new byte[0], contentType);
DocumentData doc2 = createDocument(testRoot, name2, nasaDocumentTypeDefinition, new byte[0], contentType);
String statement =
"SELECT * FROM " + NASA_DOCUMENT
+ " WHERE ( cmis:lastModificationDate >= TIMESTAMP '2007-01-01T00:00:00.000Z' )";
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, new DocumentData[]{doc1, doc2});
}
/**
* Simple test.
* <p>
* All documents from Apollo program
* <p>
* Query : Select all CMIS_DOCUMENTS.
* <p>
* Expected result: document1 and document1
*
* @throws Exception if an unexpected error occurs
*/
public void testSimpleQuery() throws Exception
{
List<DocumentData> appolloContent = createNasaContent(testRoot);
String statement = "SELECT * FROM " + NASA_DOCUMENT;
Query query = new Query(statement, true);
ItemsIterator<Result> result = storage.query(query);
checkResult(result, appolloContent.toArray(new DocumentData[appolloContent.size()]));
}
/**
* Test fulltext constraint.
* <p>
* Initial data:
* <p>
* see createApolloContent()
* <p>
* Query : Select all documents where data contains "moon" word.
* <p>
* Expected result: document1 and document2
*
* @throws Exception if an unexpected error occurs
*/
public void testUpdateFulltextConstraint() throws Exception
{
DocumentData doc3 =
createDocument(testRoot, "Apollo 13", nasaDocumentTypeDefinition, ("Apollo 13 was the third "
+ "manned mission by NASA intended to land on the Moon, but a mid-mission technical "
+ "malfunction forced the lunar landing to be aborted. ").getBytes(), MimeType.fromString("text/plain"));
doc3.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, "James A. Lovell, Jr."));
doc3.setProperty(new StringProperty(PROPERTY_BOOSTER, PROPERTY_BOOSTER, PROPERTY_BOOSTER, PROPERTY_BOOSTER,
"Saturn V"));
String statement1 = "SELECT * FROM " + NASA_DOCUMENT + " WHERE CONTAINS(\"moon\")";
Query query = new Query(statement1, true);
ItemsIterator<Result> result = storage.query(query);
assertEquals(1, result.size());
checkResult(result, new DocumentData[]{doc3});
//replace content
ContentStream cs = new BaseContentStream("Sun".getBytes(), "test", MimeType.fromString("text/plain"));
doc3.setContentStream(cs);
//check old one
result = storage.query(query);
assertEquals(0, result.size());
//check new content
String statement2 = "SELECT * FROM " + NASA_DOCUMENT + " WHERE CONTAINS(\"Sun\")";
query = new Query(statement2, true);
result = storage.query(query);
assertEquals(1, result.size());
checkResult(result, new DocumentData[]{doc3});
}
protected DocumentData createAppoloMission(FolderData parentFolder, String missionName, String commander,
String commandModulePilot, String lunarModulePilot, String boosterName, double boosterMass, long sampleReturned,
String objectives) throws Exception
{
DocumentData doc =
createDocument(parentFolder, missionName, nasaDocumentTypeDefinition, objectives.getBytes(), MimeType
.fromString("text/plain"));
doc.setProperty(new StringProperty(PROPERTY_COMMANDER, PROPERTY_COMMANDER, PROPERTY_COMMANDER,
PROPERTY_COMMANDER, commander));
doc.setProperty(new StringProperty(PROPERTY_COMMAND_MODULE_PILOT, PROPERTY_COMMAND_MODULE_PILOT,
PROPERTY_COMMAND_MODULE_PILOT, PROPERTY_COMMAND_MODULE_PILOT, commandModulePilot));
doc.setProperty(new StringProperty(PROPERTY_LUNAR_MODULE_PILOT, PROPERTY_LUNAR_MODULE_PILOT,
PROPERTY_LUNAR_MODULE_PILOT, PROPERTY_LUNAR_MODULE_PILOT, lunarModulePilot));
doc.setProperty(new StringProperty(PROPERTY_BOOSTER, PROPERTY_BOOSTER, PROPERTY_BOOSTER, PROPERTY_BOOSTER,
boosterName));
doc.setProperty(new DecimalProperty(PROPERTY_BOOSTER_MASS, PROPERTY_BOOSTER_MASS, PROPERTY_BOOSTER_MASS,
PROPERTY_BOOSTER_MASS, new BigDecimal(boosterMass)));
doc.setProperty(new DecimalProperty(PROPERTY_SAMPLE_RETURNED, PROPERTY_SAMPLE_RETURNED, PROPERTY_SAMPLE_RETURNED,
PROPERTY_SAMPLE_RETURNED, new BigDecimal(sampleReturned)));
return doc;
}
@Override
protected void tearDown() throws Exception
{
storage.deleteTree(testRoot, true, UnfileObject.DELETE, true);
super.tearDown();
}
/**
* Create content for Apollo program.
*
* @param folder
* @return
* @throws Exception
*/
private List<DocumentData> createNasaContent(FolderData folder) throws Exception
{
List<DocumentData> result = new ArrayList<DocumentData>();
result.add(createAppoloMission(folder, "Apollo 7", "Walter M. Schirra", "Donn F. Eisele", "R. Walter Cunningham",
"Saturn 1B", 581.844, 0, "Apollo 7 (October 11-22, 1968) was the first manned mission "
+ "in the Apollo program to be launched. It was an eleven-day "
+ "Earth-orbital mission, the first manned launch of the "
+ "Saturn IB launch vehicle, and the first three-person " + "American space mission"));
result.add(createAppoloMission(folder, "Apollo 8", "Frank F. Borman, II", "James A. Lovell, Jr",
"William A. Anders", "Saturn V", 3038.500, 0, "Apollo 8 was the first "
+ "manned space voyage to achieve a velocity sufficient to allow escape from the "
+ "gravitational field of planet Earth; the first to escape from the gravitational "
+ "field of another celestial body; and the first manned voyage to return to planet Earth "
+ "from another celestial body - Earth's Moon"));
result.add(createAppoloMission(folder, "Apollo 13", "James A. Lovell, Jr.", "John L. Swigert",
"Fred W. Haise, Jr.", "Saturn V", 3038.500, 0, "Apollo 13 was the third "
+ "manned mission by NASA intended to land on the Moon, but a mid-mission technical "
+ "malfunction forced the lunar landing to be aborted. "));
result.add(createAppoloMission(folder, "Apollo 17", "Eugene A. Cernan", "Ronald E. Evans", "Harrison H. Schmitt",
"Saturn V", 3038.500, 111, "Apollo 17 was the eleventh manned space "
+ "mission in the NASA Apollo program. It was the first night launch of a U.S. human "
+ "spaceflight and the sixth and final lunar landing mission of the Apollo program."));
return result;
}
public void testIncludedInSupertypeQueryTestTwoDocTypes() throws Exception
{
// create data
TypeDefinition cmis_article_sports_typeDefinition = storage.getTypeDefinition("cmis:article-sports", true);
TypeDefinition cmis_article_animals_typeDefinition = storage.getTypeDefinition("cmis:article-animals", true);
DocumentData doc1 =
createDocument(testRoot, "node1", cmis_article_sports_typeDefinition, "hello world".getBytes(), MimeType
.fromString("text/plain"));
DocumentData doc2 =
createDocument(testRoot, "node2", cmis_article_animals_typeDefinition, "hello world".getBytes(), MimeType
.fromString("text/plain"));
String stat = "SELECT * FROM cmis:article WHERE IN_FOLDER( '" + testRoot.getObjectId() + "')";
Query query = new Query(stat, false);
ItemsIterator<Result> result = storage.query(query);
// check results
checkResult(result, new DocumentData[]{doc1, doc2});
}
}