/*****************************************************************
* 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.cayenne.query;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import org.apache.cayenne.DataRow;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.testdo.testmap.Artist;
import org.junit.Test;
public class ObjectSelectTest {
@Test
public void testDataRowQuery() {
ObjectSelect<DataRow> q = ObjectSelect.dataRowQuery(Artist.class);
assertNotNull(q);
assertTrue(q.isFetchingDataRows());
assertEquals(Artist.class, q.getEntityType());
assertNull(q.getEntityName());
assertNull(q.getDbEntityName());
}
@Test
public void testQuery_RootType() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
assertNotNull(q);
assertNull(q.getWhere());
assertFalse(q.isFetchingDataRows());
assertEquals(Artist.class, q.getEntityType());
assertNull(q.getEntityName());
assertNull(q.getDbEntityName());
}
@Test
public void testQuery_RootType_WithQualifier() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class, ExpressionFactory.matchExp("a", "A"));
assertNotNull(q);
assertEquals("a = \"A\"", q.getWhere().toString());
assertFalse(q.isFetchingDataRows());
assertEquals(Artist.class, q.getEntityType());
assertNull(q.getEntityName());
assertNull(q.getDbEntityName());
}
@Test
public void testQuery_TypeAndEntity() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class, "Painting");
assertNotNull(q);
assertFalse(q.isFetchingDataRows());
assertNull(q.getEntityType());
assertEquals("Painting", q.getEntityName());
assertNull(q.getDbEntityName());
}
@Test
public void testQuery_TypeAndDbEntity() {
ObjectSelect<DataRow> q = ObjectSelect.dbQuery("PAINTING");
assertNotNull(q);
assertTrue(q.isFetchingDataRows());
assertNull(q.getEntityType());
assertNull(q.getEntityName());
assertEquals("PAINTING", q.getDbEntityName());
}
@Test
public void testWhere() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.where(ExpressionFactory.matchExp("a", 3));
assertEquals("a = 3", q.getWhere().toString());
q.where(ExpressionFactory.matchExp("b", 4));
assertEquals("(a = 3) and (b = 4)", q.getWhere().toString());
}
@Test
public void testAnd_Array() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.where(ExpressionFactory.matchExp("a", 3));
assertEquals("a = 3", q.getWhere().toString());
q.and(ExpressionFactory.matchExp("b", 4), ExpressionFactory.greaterExp("c", 5));
assertEquals("(a = 3) and (b = 4) and (c > 5)", q.getWhere().toString());
}
@Test
public void testAnd_Collection() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.where(ExpressionFactory.matchExp("a", 3));
assertEquals("a = 3", q.getWhere().toString());
Collection<Expression> exps = Arrays.asList(ExpressionFactory.matchExp("b", 4),
ExpressionFactory.greaterExp("c", 5));
q.and(exps);
assertEquals("(a = 3) and (b = 4) and (c > 5)", q.getWhere().toString());
}
@Test
public void testAnd_ArrayNull() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.where(ExpressionFactory.matchExp("a", 3));
assertEquals("a = 3", q.getWhere().toString());
q.and();
assertEquals("a = 3", q.getWhere().toString());
}
@Test
public void testAnd_ArrayEmpty() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.where(ExpressionFactory.matchExp("a", 3));
assertEquals("a = 3", q.getWhere().toString());
q.and(new Expression[0]);
assertEquals("a = 3", q.getWhere().toString());
}
@Test
public void testAnd_CollectionEmpty() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.where(ExpressionFactory.matchExp("a", 3));
assertEquals("a = 3", q.getWhere().toString());
q.and(Collections.<Expression> emptyList());
assertEquals("a = 3", q.getWhere().toString());
}
@Test
public void testOr_Array() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.where(ExpressionFactory.matchExp("a", 3));
assertEquals("a = 3", q.getWhere().toString());
q.or(ExpressionFactory.matchExp("b", 4), ExpressionFactory.greaterExp("c", 5));
assertEquals("(a = 3) or (b = 4) or (c > 5)", q.getWhere().toString());
}
@Test
public void testOr_Collection() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.where(ExpressionFactory.matchExp("a", 3));
assertEquals("a = 3", q.getWhere().toString());
Collection<Expression> exps = Arrays.asList(ExpressionFactory.matchExp("b", 4),
ExpressionFactory.greaterExp("c", 5));
q.or(exps);
assertEquals("(a = 3) or (b = 4) or (c > 5)", q.getWhere().toString());
}
@Test
public void testOrderBy_Array() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
Ordering o1 = new Ordering("x");
q.orderBy(o1);
Object[] result1 = q.getOrderings().toArray();
assertEquals(1, result1.length);
assertSame(o1, result1[0]);
Ordering o2 = new Ordering("y");
q.orderBy(o2);
Object[] result2 = q.getOrderings().toArray();
assertEquals(2, result2.length);
assertSame(o1, result2[0]);
assertSame(o2, result2[1]);
}
@Test
public void testOrderBy_Collection() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
Ordering o1 = new Ordering("x");
q.orderBy(Collections.singletonList(o1));
Object[] result1 = q.getOrderings().toArray();
assertEquals(1, result1.length);
assertSame(o1, result1[0]);
Ordering o2 = new Ordering("y");
q.orderBy(Collections.singletonList(o2));
Object[] result2 = q.getOrderings().toArray();
assertEquals(2, result2.length);
assertSame(o1, result2[0]);
assertSame(o2, result2[1]);
}
@Test
public void testOrderBy_PropertyStrategy() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.orderBy("x", SortOrder.ASCENDING_INSENSITIVE);
Object[] result1 = q.getOrderings().toArray();
assertEquals(1, result1.length);
assertEquals(new Ordering("x", SortOrder.ASCENDING_INSENSITIVE), result1[0]);
q.orderBy("y", SortOrder.DESCENDING);
Object[] result2 = q.getOrderings().toArray();
assertEquals(2, result2.length);
assertEquals(new Ordering("y", SortOrder.DESCENDING), result2[1]);
}
@Test
public void testOrderBy_Property() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.orderBy("x");
Object[] result1 = q.getOrderings().toArray();
assertEquals(1, result1.length);
assertEquals(new Ordering("x", SortOrder.ASCENDING), result1[0]);
q.orderBy("y");
Object[] result2 = q.getOrderings().toArray();
assertEquals(2, result2.length);
assertEquals(new Ordering("x", SortOrder.ASCENDING), result2[0]);
assertEquals(new Ordering("y", SortOrder.ASCENDING), result2[1]);
}
@Test
public void testPrefetch() {
PrefetchTreeNode root = PrefetchTreeNode.withPath("a.b", PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.prefetch(root);
PrefetchTreeNode root1 = q.getPrefetches();
assertNotNull(root1);
assertNotNull(root1.getNode("a.b"));
assertEquals(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS, root1.getNode("a.b").getSemantics());
}
@Test
public void testPrefetch_Path() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.prefetch("a.b", PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
PrefetchTreeNode root1 = q.getPrefetches();
assertNotNull(root1);
assertNotNull(root1.getNode("a.b"));
q.prefetch("a.c", PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
PrefetchTreeNode root2 = q.getPrefetches();
assertNotNull(root2);
assertNotNull(root2.getNode("a.c"));
assertNotNull(root2.getNode("a.b"));
}
@Test
public void testPrefetch_Merge() {
PrefetchTreeNode root = PrefetchTreeNode.withPath("a.b", PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
q.prefetch(root);
PrefetchTreeNode root1 = q.getPrefetches();
assertNotNull(root1);
assertNotNull(root1.getNode("a.b"));
assertEquals(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS, root1.getNode("a.b").getSemantics());
PrefetchTreeNode subRoot = PrefetchTreeNode.withPath("a.b.c", PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
q.prefetch(subRoot);
root1 = q.getPrefetches();
assertNotNull(root1);
assertNotNull(root1.getNode("a.b"));
assertEquals(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS, root1.getNode("a.b").getSemantics());
assertNotNull(root1.getNode("a.b.c"));
assertEquals(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS, root1.getNode("a.b.c").getSemantics());
}
@Test
public void testLimit() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
assertEquals(0, q.getLimit());
q.limit(2);
assertEquals(2, q.getLimit());
q.limit(3).limit(5);
assertEquals(5, q.getLimit());
}
@Test
public void testOffset() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
assertEquals(0, q.getOffset());
q.offset(2);
assertEquals(2, q.getOffset());
q.offset(3).offset(5);
assertEquals(5, q.getOffset());
}
@Test
public void testStatementFetchSize() {
ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
assertEquals(0, q.getStatementFetchSize());
q.statementFetchSize(2);
assertEquals(2, q.getStatementFetchSize());
q.statementFetchSize(3).statementFetchSize(5);
assertEquals(5, q.getStatementFetchSize());
}
@Test
public void testCacheGroups_Collection() {
ObjectSelect<DataRow> q = ObjectSelect.dataRowQuery(Artist.class);
assertNull(q.getCacheStrategy());
assertNull(q.getCacheGroup());
q.cacheGroup("a");
assertNull(q.getCacheStrategy());
assertEquals("a", q.getCacheGroup());
}
@Test
public void testCacheStrategy() {
ObjectSelect<DataRow> q = ObjectSelect.dataRowQuery(Artist.class);
assertNull(q.getCacheStrategy());
assertNull(q.getCacheGroup());
q.cacheStrategy(QueryCacheStrategy.LOCAL_CACHE, "b");
assertSame(QueryCacheStrategy.LOCAL_CACHE, q.getCacheStrategy());
assertEquals("b", q.getCacheGroup());
q.cacheStrategy(QueryCacheStrategy.SHARED_CACHE);
assertSame(QueryCacheStrategy.SHARED_CACHE, q.getCacheStrategy());
assertNull(q.getCacheGroup());
}
@Test
public void testLocalCache() {
ObjectSelect<DataRow> q = ObjectSelect.dataRowQuery(Artist.class);
assertNull(q.getCacheStrategy());
assertNull(q.getCacheGroup());
q.localCache("a");
assertSame(QueryCacheStrategy.LOCAL_CACHE, q.getCacheStrategy());
assertEquals("a", q.getCacheGroup());
q.localCache();
assertSame(QueryCacheStrategy.LOCAL_CACHE, q.getCacheStrategy());
assertNull(q.getCacheGroup());
}
@Test
public void testSharedCache() {
ObjectSelect<DataRow> q = ObjectSelect.dataRowQuery(Artist.class);
assertNull(q.getCacheStrategy());
assertNull(q.getCacheGroup());
q.sharedCache("b");
assertSame(QueryCacheStrategy.SHARED_CACHE, q.getCacheStrategy());
assertEquals("b", q.getCacheGroup());
q.sharedCache();
assertSame(QueryCacheStrategy.SHARED_CACHE, q.getCacheStrategy());
assertNull(q.getCacheGroup());
}
}