blob: c314f409eaef8d8db5e3c31e5e9027a2f95bd61c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.chemistry.opencmis.client.runtime;
import static org.junit.Assert.assertEquals;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.TimeZone;
import org.apache.chemistry.opencmis.client.api.QueryStatement;
import org.apache.chemistry.opencmis.client.api.Session;
import org.junit.Test;
public class QueryStatementTest {
@Test
public void testStaticQueries() {
Session session = new SessionImpl(new HashMap<String, String>(), null, null, null, null);
String query;
QueryStatement st;
query = "SELECT cmis:name FROM cmis:folder";
st = new QueryStatementImpl(session, query);
assertEquals(query, st.toQueryString());
query = "SELECT * FROM cmis:document WHERE cmis:createdBy = \'admin\' AND abc:int = 42";
st = new QueryStatementImpl(session, query);
assertEquals(query, st.toQueryString());
query = "SELECT * FROM cmis:document WHERE abc:test = 'x?z'";
st = new QueryStatementImpl(session, query);
st.setString(1, "y");
assertEquals(query, st.toQueryString());
}
@Test
public void testWherePlacholder() {
Session session = new SessionImpl(new HashMap<String, String>(), null, null, null, null);
String query;
QueryStatement st;
// strings
query = "SELECT * FROM cmis:document WHERE abc:string = ?";
st = new QueryStatementImpl(session, query);
st.setString(1, "test");
assertEquals("SELECT * FROM cmis:document WHERE abc:string = 'test'", st.toQueryString());
query = "SELECT * FROM cmis:document WHERE abc:string = ?";
st = new QueryStatementImpl(session, query);
st.setString(1, "te'st");
assertEquals("SELECT * FROM cmis:document WHERE abc:string = 'te\\'st'", st.toQueryString());
// likes
query = "SELECT * FROM cmis:document WHERE abc:string LIKE ?";
st = new QueryStatementImpl(session, query);
st.setStringLike(1, "%test%");
assertEquals("SELECT * FROM cmis:document WHERE abc:string LIKE '%test%'", st.toQueryString());
query = "SELECT * FROM cmis:document WHERE abc:string LIKE ?";
st = new QueryStatementImpl(session, query);
st.setStringLike(1, "\\_test\\%blah\\\\blah");
assertEquals("SELECT * FROM cmis:document WHERE abc:string LIKE '\\_test\\%blah\\\\\\\\blah'",
st.toQueryString());
// contains
// *, ? and - are treated as text search operators: 1st level escaping:
// none, 2nd level escaping: none
// \*, \? and \- are used as literals, 1st level escaping: none, 2nd
// level escaping: \\*, \\?, \\-
// ' and " are used as literals, 1st level escaping: \', \", 2nd level
// escaping: \\\', \\\",
// \ plus any other character, 1st level escaping \\ plus character, 2nd
// level: \\\\ plus character
query = "SELECT * FROM cmis:document WHERE CONTAINS(?)";
st = new QueryStatementImpl(session, query);
st.setStringContains(1, "John's");
assertEquals("SELECT * FROM cmis:document WHERE CONTAINS('John\\\\\\'s')", st.toQueryString());
st.setStringContains(1, "foo -bar");
assertEquals("SELECT * FROM cmis:document WHERE CONTAINS('foo -bar')", st.toQueryString());
st.setStringContains(1, "foo*");
assertEquals("SELECT * FROM cmis:document WHERE CONTAINS('foo*')", st.toQueryString());
st.setStringContains(1, "foo?");
assertEquals("SELECT * FROM cmis:document WHERE CONTAINS('foo?')", st.toQueryString());
st.setStringContains(1, "foo\\-bar");
assertEquals("SELECT * FROM cmis:document WHERE CONTAINS('foo\\\\-bar')", st.toQueryString());
st.setStringContains(1, "foo\\*");
assertEquals("SELECT * FROM cmis:document WHERE CONTAINS('foo\\\\*')", st.toQueryString());
st.setStringContains(1, "foo\\?");
assertEquals("SELECT * FROM cmis:document WHERE CONTAINS('foo\\\\?')", st.toQueryString());
st.setStringContains(1, "\"Cool\"");
assertEquals("SELECT * FROM cmis:document WHERE CONTAINS('\\\\\\\"Cool\\\\\\\"')", st.toQueryString());
st.setStringContains(1, "c:\\MyDcuments");
assertEquals("SELECT * FROM cmis:document WHERE CONTAINS('c:\\\\MyDcuments')", st.toQueryString());
// ids
query = "SELECT * FROM cmis:document WHERE abc:id = ?";
st = new QueryStatementImpl(session, query);
st.setId(1, new ObjectIdImpl("123"));
assertEquals("SELECT * FROM cmis:document WHERE abc:id = '123'", st.toQueryString());
// booleans
query = "SELECT * FROM cmis:document WHERE abc:bool = ?";
st = new QueryStatementImpl(session, query);
st.setBoolean(1, true);
assertEquals("SELECT * FROM cmis:document WHERE abc:bool = TRUE", st.toQueryString());
// numbers
query = "SELECT * FROM cmis:document WHERE abc:int = ? AND abc:int2 = 123";
st = new QueryStatementImpl(session, query);
st.setNumber(1, 42);
assertEquals("SELECT * FROM cmis:document WHERE abc:int = 42 AND abc:int2 = 123", st.toQueryString());
// dateTime
query = "SELECT * FROM cmis:document WHERE abc:dateTime = TIMESTAMP ?";
GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
cal.clear();
cal.set(2012, 1, 2, 3, 4, 5);
st = new QueryStatementImpl(session, query);
st.setDateTime(1, cal);
assertEquals("SELECT * FROM cmis:document WHERE abc:dateTime = TIMESTAMP '2012-02-02T03:04:05.000Z'",
st.toQueryString());
st = new QueryStatementImpl(session, query);
st.setDateTime(1, cal.getTimeInMillis());
assertEquals("SELECT * FROM cmis:document WHERE abc:dateTime = TIMESTAMP '2012-02-02T03:04:05.000Z'",
st.toQueryString());
// dateTime Timestamp
query = "SELECT * FROM cmis:document WHERE abc:dateTime = ?";
st = new QueryStatementImpl(session, query);
st.setDateTimeTimestamp(1, cal);
assertEquals("SELECT * FROM cmis:document WHERE abc:dateTime = TIMESTAMP '2012-02-02T03:04:05.000Z'",
st.toQueryString());
st = new QueryStatementImpl(session, query);
st.setDateTimeTimestamp(1, cal.getTimeInMillis());
assertEquals("SELECT * FROM cmis:document WHERE abc:dateTime = TIMESTAMP '2012-02-02T03:04:05.000Z'",
st.toQueryString());
query = "SELECT * FROM cmis:document WHERE abc:dateTime IN (?)";
st = new QueryStatementImpl(session, query);
st.setDateTimeTimestamp(1, cal.getTime(), cal.getTime());
assertEquals("SELECT * FROM cmis:document WHERE abc:dateTime "
+ "IN (TIMESTAMP '2012-02-02T03:04:05.000Z',TIMESTAMP '2012-02-02T03:04:05.000Z')", st.toQueryString());
}
// @Test
public void testQueryApiEscaping() {
// contains
Session session = new SessionImpl(new HashMap<String, String>(), null, null, null, null);
String query = "SELECT * FROM cmis:document WHERE CONTAINS(?)";
String ss = "a\\xc";
assertEquals(4, ss.length());
System.out.println(ss);
QueryStatement st = new QueryStatementImpl(session, query);
st.setStringContains(1, "John's");
System.out.println("setStringContains: " + st.toQueryString());
String expected = "SELECT * FROM cmis:document WHERE CONTAINS('John\\\'s')";
System.out.println("Expected: " + expected);
assertEquals(expected, st.toQueryString());
}
}