/* * 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 org.greenrobot.greendao.DaoException; import org.greenrobot.greendao.query.Join; import org.greenrobot.greendao.query.Query; import org.greenrobot.greendao.query.QueryBuilder; import org.greenrobot.greendao.test.AbstractDaoSessionTest; import org.greenrobot.greendao.daotest.DaoMaster; import org.greenrobot.greendao.daotest.DaoSession; import org.greenrobot.greendao.daotest.RelationEntity; import org.greenrobot.greendao.daotest.RelationEntityDao; import org.greenrobot.greendao.daotest.TestEntity; import org.greenrobot.greendao.daotest.TestEntityDao; import org.greenrobot.greendao.daotest.TestEntityDao.Properties; import java.util.ArrayList; import java.util.List; public class JoinTest extends AbstractDaoSessionTest<DaoMaster, DaoSession> { private TestEntityDao testEntityDao; private RelationEntityDao relationEntityDao; public JoinTest() { super(DaoMaster.class); } @Override protected void setUp() throws Exception { super.setUp(); QueryBuilder.LOG_SQL = true; QueryBuilder.LOG_VALUES = true; testEntityDao = daoSession.getTestEntityDao(); relationEntityDao = daoSession.getRelationEntityDao(); } public void testJoinSimple() { prepareData(); QueryBuilder<RelationEntity> queryBuilder = createQueryBuilder(5); RelationEntity unique = queryBuilder.uniqueOrThrow(); assertEquals("entity-5", unique.getSimpleString()); } public void testJoinSimpleParameterValue() { prepareData(); QueryBuilder<RelationEntity> queryBuilder = createQueryBuilder(-1); Query<RelationEntity> query = queryBuilder.build(); for (int i = 0; i < 10; i++) { query.setParameter(0, i + 1); RelationEntity unique = query.uniqueOrThrow(); assertEquals("entity-" + (i + 1), unique.getSimpleString()); } } public void testJoinMixedParameterValues() { prepareData(); QueryBuilder<RelationEntity> queryBuilder = relationEntityDao.queryBuilder(); queryBuilder.where(RelationEntityDao.Properties.SimpleString.like(""), RelationEntityDao.Properties.SimpleString.ge("")); Join<RelationEntity, TestEntity> join = queryBuilder.join(RelationEntityDao.Properties.TestIdNotNull, TestEntity.class); join.where(Properties.SimpleInt.le(0)); queryBuilder.offset(0).limit(0); Query<RelationEntity> query = queryBuilder.build(); query.setParameter(0, "entity-%"); query.setParameter(1, "entity-4"); query.setParameter(2, 6); query.setOffset(1); query.setLimit(99); List<RelationEntity> entities = query.list(); assertEquals(2, entities.size()); assertEquals("entity-5", entities.get(0).getSimpleString()); assertEquals("entity-6", entities.get(1).getSimpleString()); } public void testJoinOfJoin() { prepareData(); List<RelationEntity> relationEntities = relationEntityDao.loadAll(); relationEntities.get(2).setParent(relationEntities.get(4)); relationEntities.get(3).setParent(relationEntities.get(5)); relationEntities.get(7).setParent(relationEntities.get(5)); relationEntityDao.updateInTx(relationEntities); QueryBuilder<RelationEntity> queryBuilder = relationEntityDao.queryBuilder(); Join<RelationEntity, RelationEntity> join1 = queryBuilder.join(RelationEntityDao.Properties.ParentId, RelationEntity.class); queryBuilder.join(join1, RelationEntityDao.Properties.TestIdNotNull, TestEntity.class, Properties.Id) .where(Properties.SimpleInt.lt(6)); Query<RelationEntity> query = queryBuilder.build(); RelationEntity entity = query.uniqueOrThrow(); assertEquals(relationEntities.get(2).getSimpleString(), entity.getSimpleString()); query.setParameter(0, 99); assertEquals(3, query.list().size()); } public void testJoinDelete() { prepareData(); QueryBuilder<RelationEntity> queryBuilder = createQueryBuilder(5); try { queryBuilder.buildDelete().executeDeleteWithoutDetachingEntities(); } catch (DaoException e) { assertEquals("JOINs are not supported for DELETE queries", e.getMessage()); return; } // Never executed, unsupported by SQLite assertEquals(9, relationEntityDao.count()); assertEquals(10, testEntityDao.count()); assertNull(relationEntityDao.queryBuilder().where(Properties.SimpleString.eq("entity-5")).unique()); } public void testJoinCount() { prepareData(); QueryBuilder<RelationEntity> queryBuilder = relationEntityDao.queryBuilder(); Join<RelationEntity, TestEntity> join = queryBuilder.join(RelationEntityDao.Properties.TestIdNotNull, TestEntity.class); join.where(Properties.SimpleInt.gt(6)); queryBuilder.count(); assertEquals(4, queryBuilder.count()); } private void prepareData() { List<TestEntity> targetEntities = new ArrayList<TestEntity>(); for (int i = 0; i < 10; i++) { TestEntity testEntity = new TestEntity(); testEntity.setSimpleInt(i + 1); testEntity.setSimpleStringNotNull("string-" + (i + 1)); targetEntities.add(testEntity); } testEntityDao.insertInTx(targetEntities); List<RelationEntity> entities = new ArrayList<RelationEntity>(); for (int i = 0; i < 10; i++) { RelationEntity entity = new RelationEntity(); entity.setSimpleString("entity-" + (i + 1)); entity.setTestNotNull(targetEntities.get(i)); entities.add(entity); } relationEntityDao.insertInTx(entities); } private QueryBuilder<RelationEntity> createQueryBuilder(int simpleIntWhereValue) { QueryBuilder<RelationEntity> queryBuilder = relationEntityDao.queryBuilder(); Join<RelationEntity, TestEntity> join = queryBuilder.join(RelationEntityDao.Properties.TestIdNotNull, TestEntity.class); join.where(Properties.SimpleInt.eq(simpleIntWhereValue)); return queryBuilder; } }