package com.querydsl.jpa; import static org.junit.Assert.assertEquals; import java.util.Arrays; import org.junit.Test; import com.querydsl.core.JoinExpression; import com.querydsl.core.JoinType; import com.querydsl.core.QueryMetadata; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.Predicate; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.domain.QCat; import com.querydsl.jpa.domain.QCompany; import com.querydsl.jpa.domain.QDepartment; import com.querydsl.jpa.domain.QEmployee; import com.querydsl.jpa.domain4.QBookMark; import com.querydsl.jpa.domain4.QBookVersion; public class JPAQueryMixinTest { private JPAQueryMixin<?> mixin = new JPAQueryMixin<Object>(); @Test public void where_null() { mixin.where((Predicate) null); } @Test public void orderBy() { QCat cat = QCat.cat; QCat catMate = new QCat("cat_mate"); mixin.from(cat); mixin.orderBy(cat.mate.name.asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList( new JoinExpression(JoinType.DEFAULT, cat), new JoinExpression(JoinType.LEFTJOIN, cat.mate.as(catMate))), md.getJoins()); assertEquals(Arrays.asList(catMate.name.asc()), md.getOrderBy()); } @Test public void orderBy_nonRoot_twice() { QDepartment department = QDepartment.department; QCompany departmentCompany = new QCompany("department_company"); QEmployee departmentCompanyCeo = new QEmployee("department_company_ceo"); mixin.from(department); mixin.orderBy(department.company.ceo.firstName.asc(), department.company.ceo.lastName.asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList( new JoinExpression(JoinType.DEFAULT, department), new JoinExpression(JoinType.LEFTJOIN, department.company.as(departmentCompany)), new JoinExpression(JoinType.LEFTJOIN, departmentCompany.ceo.as(departmentCompanyCeo))), md.getJoins()); assertEquals(Arrays.asList(departmentCompanyCeo.firstName.asc(), departmentCompanyCeo.lastName.asc()), md.getOrderBy()); } @Test public void orderBy_where() { QCat cat = QCat.cat; mixin.from(cat); mixin.where(cat.mate.name.isNotNull()); mixin.orderBy(cat.mate.name.asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList(new JoinExpression(JoinType.DEFAULT, cat)), md.getJoins()); assertEquals(Arrays.asList(cat.mate.name.asc()), md.getOrderBy()); } @Test public void orderBy_groupBy() { QCat cat = QCat.cat; mixin.from(cat); mixin.groupBy(cat.mate.name); mixin.orderBy(cat.mate.name.asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList(new JoinExpression(JoinType.DEFAULT, cat)), md.getJoins()); assertEquals(Arrays.asList(cat.mate.name.asc()), md.getOrderBy()); } @Test public void orderBy_operation() { QCat cat = QCat.cat; QCat catMate = new QCat("cat_mate"); mixin.from(cat); mixin.orderBy(cat.mate.name.lower().asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList( new JoinExpression(JoinType.DEFAULT, cat), new JoinExpression(JoinType.LEFTJOIN, cat.mate.as(catMate))), md.getJoins()); assertEquals(Arrays.asList(catMate.name.lower().asc()), md.getOrderBy()); } @Test public void orderBy_long() { QCat cat = QCat.cat; QCat catMate = new QCat("cat_mate"); QCat catMateMate = new QCat("cat_mate_mate"); mixin.from(cat); mixin.orderBy(cat.mate.mate.name.asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList( new JoinExpression(JoinType.DEFAULT, cat), new JoinExpression(JoinType.LEFTJOIN, cat.mate.as(catMate)), new JoinExpression(JoinType.LEFTJOIN, catMate.mate.as(catMateMate))), md.getJoins()); assertEquals(Arrays.asList(catMateMate.name.asc()), md.getOrderBy()); } @Test public void orderBy_reuse() { QCat cat = QCat.cat; QCat mate = new QCat("mate"); mixin.from(cat); mixin.leftJoin(cat.mate, mate); mixin.orderBy(cat.mate.name.asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList( new JoinExpression(JoinType.DEFAULT, cat), new JoinExpression(JoinType.LEFTJOIN, cat.mate.as(mate))), md.getJoins()); assertEquals(Arrays.asList(mate.name.asc()), md.getOrderBy()); } @Test public void orderBy_long_reuse() { QCat cat = QCat.cat; QCat mate = new QCat("mate"); QCat mateMate = new QCat("mate_mate"); mixin.from(cat); mixin.leftJoin(cat.mate, mate); mixin.orderBy(cat.mate.mate.name.asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList( new JoinExpression(JoinType.DEFAULT, cat), new JoinExpression(JoinType.LEFTJOIN, cat.mate.as(mate)), new JoinExpression(JoinType.LEFTJOIN, mate.mate.as(mateMate))), md.getJoins()); assertEquals(Arrays.asList(mateMate.name.asc()), md.getOrderBy()); } @Test public void orderBy_any() { QCat cat = QCat.cat; QCat catKittens = new QCat("cat_kittens"); mixin.from(cat); mixin.orderBy(cat.kittens.any().name.asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList( new JoinExpression(JoinType.DEFAULT, cat), new JoinExpression(JoinType.LEFTJOIN, cat.kittens.as(catKittens))), md.getJoins()); assertEquals(Arrays.asList(catKittens.name.asc()), md.getOrderBy()); } @Test public void orderBy_embeddable() { QBookVersion bookVersion = QBookVersion.bookVersion; mixin.from(bookVersion); mixin.orderBy(bookVersion.definition.name.asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList(new JoinExpression(JoinType.DEFAULT, bookVersion)), md.getJoins()); assertEquals(Arrays.asList(bookVersion.definition.name.asc()), md.getOrderBy()); } @SuppressWarnings("unchecked") @Test public void orderBy_embeddable2() { QArticle article = QArticle.article; QArticle articleContentArticle = new QArticle("article_content_article"); mixin.from(article); mixin.orderBy(article.content.article.name.asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList( new JoinExpression(JoinType.DEFAULT, article), new JoinExpression(JoinType.LEFTJOIN, article.content.article.as(articleContentArticle))), md.getJoins()); assertEquals(Arrays.asList(articleContentArticle.name.asc()), md.getOrderBy()); } @SuppressWarnings("unchecked") @Test public void orderBy_embeddable_collection() { QBookVersion bookVersion = QBookVersion.bookVersion; QBookMark bookMark = new QBookMark("bookVersion_definition_bookMarks"); mixin.from(bookVersion); mixin.orderBy(bookVersion.definition.bookMarks.any().comment.asc()); QueryMetadata md = mixin.getMetadata(); assertEquals(Arrays.asList(new JoinExpression(JoinType.DEFAULT, bookVersion)), md.getJoins()); assertEquals(Arrays.asList(Expressions.stringPath(bookVersion.definition.bookMarks, "comment").asc()), md.getOrderBy()); } @Test public void orderBy_nullsLast() { QCat cat = QCat.cat; mixin.from(cat); mixin.orderBy(cat.mate.name.asc().nullsLast()); assertEquals( OrderSpecifier.NullHandling.NullsLast, mixin.getMetadata().getOrderBy().get(0).getNullHandling()); } }