/*
* Copyright (C) 2011-2016 Markus Junginger, greenrobot (http://greenrobot.org)
*
* This file is part of greenDAO Generator.
*
* greenDAO Generator is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* greenDAO Generator 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with greenDAO Generator. If not, see <http://www.gnu.org/licenses/>.
*/
package org.greenrobot.greendao.daotest.query;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.greenrobot.greendao.daotest.entity.TestEntityTestBase;
import org.greenrobot.greendao.internal.SqlUtils;
import org.greenrobot.greendao.query.Query;
import org.greenrobot.greendao.query.QueryBuilder;
import org.greenrobot.greendao.query.WhereCondition;
import org.greenrobot.greendao.daotest.TestEntity;
import org.greenrobot.greendao.daotest.TestEntityDao.Properties;
public class QueryBuilderSimpleTest extends TestEntityTestBase {
@Override
protected void setUp() throws Exception {
super.setUp();
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;
}
public void testEqInteger() {
ArrayList<TestEntity> inserted = insert(3);
int value = getSimpleInteger(1);
List<TestEntity> result = dao.queryBuilder().where(Properties.SimpleInteger.eq(value)).list();
assertEquals(1, result.size());
TestEntity resultEntity = result.get(0);
assertEquals(value, (int) resultEntity.getSimpleInteger());
assertEquals(inserted.get(1).getId(), resultEntity.getId());
}
public void testEqString() {
ArrayList<TestEntity> inserted = insert(3);
String value = getSimpleString(1);
List<TestEntity> result = dao.queryBuilder().where(Properties.SimpleString.eq(value)).list();
assertEquals(1, result.size());
TestEntity resultEntity = result.get(0);
assertEquals(value, resultEntity.getSimpleString());
assertEquals(inserted.get(1).getId(), resultEntity.getId());
}
public void testIn() {
ArrayList<TestEntity> inserted = insert(10);
String value1 = getSimpleString(2);
String value2 = getSimpleString(8);
String value3 = getSimpleString(9);
List<TestEntity> result = dao.queryBuilder().where(Properties.SimpleString.in(value1, value2, value3))
.orderAsc(Properties.SimpleString).list();
assertEquals(3, result.size());
TestEntity resultEntity1 = result.get(0);
assertEquals(value1, resultEntity1.getSimpleString());
assertEquals(inserted.get(2).getId(), resultEntity1.getId());
TestEntity resultEntity2 = result.get(1);
assertEquals(value2, resultEntity2.getSimpleString());
assertEquals(inserted.get(8).getId(), resultEntity2.getId());
TestEntity resultEntity3 = result.get(2);
assertEquals(value3, resultEntity3.getSimpleString());
assertEquals(inserted.get(9).getId(), resultEntity3.getId());
}
public void testNotIn() {
ArrayList<TestEntity> inserted = insert(5);
String value1 = getSimpleString(0);
String value2 = getSimpleString(2);
String value3 = getSimpleString(4);
List<TestEntity> result = dao.queryBuilder().where(Properties.SimpleString.notIn(value1, value2, value3))
.orderAsc(Properties.SimpleString).list();
assertEquals(2, result.size());
TestEntity resultEntity1 = result.get(0);
assertEquals(inserted.get(1).getId(), resultEntity1.getId());
TestEntity resultEntity2 = result.get(1);
assertEquals(inserted.get(3).getId(), resultEntity2.getId());
}
public void testEqStringAndInteger() {
ArrayList<TestEntity> inserted = insert(3);
String valueStr = getSimpleString(1);
int valueInt = getSimpleInteger(1);
List<TestEntity> result = dao.queryBuilder()
.where(Properties.SimpleString.eq(valueStr), Properties.SimpleInteger.eq(valueInt)).list();
assertEquals(1, result.size());
TestEntity resultEntity = result.get(0);
assertEquals(inserted.get(1).getId(), resultEntity.getId());
}
public void testNotEqString() {
ArrayList<TestEntity> inserted = insert(3);
String value = getSimpleString(1);
List<TestEntity> result = dao.queryBuilder().where(Properties.SimpleString.notEq(value)).list();
assertEquals(2, result.size());
TestEntity resultEntity1 = result.get(0);
TestEntity resultEntity2 = result.get(1);
long loId = Math.min(resultEntity1.getId(), resultEntity2.getId());
long hiId = Math.max(resultEntity1.getId(), resultEntity2.getId());
assertEquals((long) inserted.get(0).getId(), loId);
assertEquals((long) inserted.get(2).getId(), hiId);
}
public void testEqDate() {
ArrayList<TestEntity> inserted = insert(3);
TestEntity testEntity = inserted.get(1);
Date date = new Date();
testEntity.setSimpleDate(date);
dao.update(testEntity);
Query<TestEntity> queryDate = dao.queryBuilder().where(Properties.SimpleDate.eq(date)).build();
TestEntity testEntity2 = queryDate.uniqueOrThrow();
assertEquals(testEntity.getId(), testEntity2.getId());
queryDate.setParameter(0, date);
testEntity2 = queryDate.uniqueOrThrow();
assertEquals(testEntity.getId(), testEntity2.getId());
testEntity2 = dao.queryBuilder().where(Properties.SimpleDate.eq(date.getTime())).uniqueOrThrow();
assertEquals(testEntity.getId(), testEntity2.getId());
}
public void testEqBoolean() {
ArrayList<TestEntity> inserted = insert(3);
TestEntity testEntity = inserted.get(1);
testEntity.setSimpleBoolean(true);
dao.update(testEntity);
Query<TestEntity> queryBoolean = dao.queryBuilder().where(Properties.SimpleBoolean.eq(true)).build();
TestEntity testEntity2 = queryBoolean.uniqueOrThrow();
assertEquals(testEntity.getId(), testEntity2.getId());
queryBoolean.setParameter(0, true);
testEntity2 = queryBoolean.uniqueOrThrow();
assertEquals(testEntity.getId(), testEntity2.getId());
testEntity2 = dao.queryBuilder().where(Properties.SimpleBoolean.eq(Boolean.TRUE)).uniqueOrThrow();
assertEquals(testEntity.getId(), testEntity2.getId());
testEntity2 = dao.queryBuilder().where(Properties.SimpleBoolean.eq("TRUE")).uniqueOrThrow();
assertEquals(testEntity.getId(), testEntity2.getId());
testEntity2 = dao.queryBuilder().where(Properties.SimpleBoolean.eq("truE")).uniqueOrThrow();
assertEquals(testEntity.getId(), testEntity2.getId());
}
// TODO fix byte arrays? Android is doing String args everywhere
public void testEqByteArray() {
ArrayList<TestEntity> inserted = insert(3);
TestEntity testEntity = inserted.get(1);
byte[] byteArray = {96, 77, 37, -21};
testEntity.setSimpleByteArray(byteArray);
dao.update(testEntity);
// Unsupported: Query<TestEntity> query = dao.queryBuilder().where(Properties.SimpleByteArray.eq(byteArray)).build();
// Works, but probably voids any index on BLOBs (Note: there's no hex2blob function and X'?' is bad syntax):
// String conditionString = "HEX(" + Properties.SimpleByteArray.columnName + ")=?";
// WhereCondition condition = new WhereCondition.StringCondition(conditionString, SqlUtils.toHex(byteArray));
String conditionString = Properties.SimpleByteArray.columnName + '=' + SqlUtils.escapeBlobArgument(byteArray);
WhereCondition condition = new WhereCondition.StringCondition(conditionString);
Query<TestEntity> query = dao.queryBuilder().where(condition).build();
TestEntity testEntity2 = query.uniqueOrThrow();
assertEquals(testEntity.getId(), testEntity2.getId());
// Unsupported: query.setParameter(0, new byte[]{96, 77, 37, -21, 99});
// Unsupported: assertNull(query.unique());
}
public void testIsNullIsNotNull() {
ArrayList<TestEntity> inserted = insert(2);
TestEntity testEntityNull = inserted.get(0);
TestEntity testEntityNotNull = inserted.get(1);
testEntityNull.setSimpleInteger(null);
testEntityNotNull.setSimpleInteger(42);
dao.update(testEntityNull);
dao.update(testEntityNotNull);
TestEntity testEntityNull2 = dao.queryBuilder().where(Properties.SimpleInteger.isNull()).uniqueOrThrow();
assertEquals(testEntityNull.getId(), testEntityNull2.getId());
TestEntity testEntityNotNull2 = dao.queryBuilder().where(Properties.SimpleInteger.isNotNull()).uniqueOrThrow();
assertEquals(testEntityNotNull.getId(), testEntityNotNull2.getId());
}
public void testBuildTwice() {
insert(3);
String value = getSimpleString(1);
QueryBuilder<TestEntity> builder = dao.queryBuilder().where(Properties.SimpleString.eq(value));
Query<TestEntity> query1 = builder.build();
Query<TestEntity> query2 = builder.build();
List<TestEntity> list1 = query1.list();
List<TestEntity> list2 = query2.list();
assertEquals(1, list1.size());
assertEquals(1, list2.size());
assertEquals(list1.get(0).getId(), list2.get(0).getId());
}
public void testLike() {
TestEntity entity = insert(3).get(1);
entity.setSimpleString("greenrobot");
dao.update(entity);
Query<TestEntity> query = dao.queryBuilder().where(Properties.SimpleString.like("%robot")).build();
TestEntity entity2 = query.uniqueOrThrow();
assertEquals(entity.getId(), entity2.getId());
query.setParameter(0, "green%");
entity2 = query.uniqueOrThrow();
assertEquals(entity.getId(), entity2.getId());
query.setParameter(0, "%enrob%");
entity2 = query.uniqueOrThrow();
assertEquals(entity.getId(), entity2.getId());
query.setParameter(0, "%nothere%");
entity2 = query.unique();
assertNull(entity2);
}
public void testDistinct() {
TestEntity entity = insert(3).get(1);
Query<TestEntity> query = dao.queryBuilder().distinct()
.where(Properties.SimpleString.eq(entity.getSimpleString())).build();
TestEntity entity2 = query.uniqueOrThrow();
assertEquals(entity.getId(), entity2.getId());
// TODO improve test to check functionality
}
}