/** * Add code matches in XDS form using XDSCode entity * * @param builder BooleanBuilder to add matches for given code parameter * @param codeParam Stored Query Parameter with code values * @param codeType The classification of the codes (Classification.classificationScheme) * @param xdsCodes The CollectionPath for XDSCodes of parent select (to bind subselect) * @throws XDSException */ protected void addXdsCodeMatch( BooleanBuilder builder, StoredQueryParam codeParam, String codeClassification, CollectionPath<XDSCode, QXDSCode> xdsCodes) throws XDSException { if (codeParam != null) { List<String> codeValues; String[] codeAndScheme; for (int i = 0, len = codeParam.getNumberOfANDElements(); i < len; i++) { codeValues = codeParam.getMultiValues(i); BooleanBuilder codesBuilder = new BooleanBuilder(); for (int j = 0, jLen = codeValues.size(); j < jLen; j++) { codeAndScheme = toCodeValueAndScheme(codeValues.get(j)); codesBuilder.or( ExpressionUtils.allOf( QXDSCode.xDSCode.codeClassification.eq(codeClassification), QXDSCode.xDSCode.codeValue.eq(codeAndScheme[0]), QXDSCode.xDSCode.codingSchemeDesignator.eq(codeAndScheme[1]))); } builder.and( new JPASubQuery() .from(QXDSCode.xDSCode) .where(QXDSCode.xDSCode.in(xdsCodes), codesBuilder) .exists()); } } }
protected void addFromToMatch( BooleanBuilder builder, StoredQueryParam fromParam, StoredQueryParam toParam, NumberPath<Long> subselectJoinPk, String slotName) { String from = fromParam == null ? null : XDSUtil.normalizeDTM(fromParam.getStringValue(), false); String to = toParam == null ? null : XDSUtil.normalizeDTM(toParam.getStringValue(), true); if (from != null || to != null) { Predicate fromTo = from == null ? QSlot.slot.value.loe(to) : to != null ? ExpressionUtils.allOf(QSlot.slot.value.goe(from), QSlot.slot.value.loe(to)) : QSlot.slot.value.goe(from); builder.and( new JPASubQuery() .from(QSlot.slot) .where(QSlot.slot.parent.pk.eq(subselectJoinPk), QSlot.slot.name.eq(slotName), fromTo) .exists()); } }
private Expression<?> getExpressionList() { return ExpressionUtils.list(getType(), exprs); }
@Override public Object visit(Operation<?> expr, Void context) { Operator<?> op = expr.getOperator(); if (op == Ops.EQ) { if (expr.getArg(0) instanceof Operation) { Operation<?> lhs = (Operation<?>) expr.getArg(0); if (lhs.getOperator() == Ops.COL_SIZE || lhs.getOperator() == Ops.ARRAY_SIZE) { return asDBObject(asDBKey(lhs, 0), asDBObject("$size", asDBValue(expr, 1))); } else { throw new UnsupportedOperationException("Illegal operation " + expr); } } else { return asDBObject(asDBKey(expr, 0), asDBValue(expr, 1)); } } else if (op == Ops.STRING_IS_EMPTY) { return asDBObject(asDBKey(expr, 0), ""); } else if (op == Ops.AND) { BasicDBObject left = (BasicDBObject) handle(expr.getArg(0)); left.putAll((BSONObject) handle(expr.getArg(1))); return left; } else if (op == Ops.NOT) { // Handle the not's child BasicDBObject arg = (BasicDBObject) handle(expr.getArg(0)); // Only support the first key, let's see if there // is cases where this will get broken String key = arg.keySet().iterator().next(); Operator<?> subOp = ((Operation<?>) expr.getArg(0)).getOperator(); if (subOp != Ops.EQ && subOp != Ops.STRING_IS_EMPTY) { return asDBObject(key, asDBObject("$not", arg.get(key))); } else { return asDBObject(key, asDBObject("$ne", arg.get(key))); } } else if (op == Ops.OR) { BasicDBList list = new BasicDBList(); list.add(handle(expr.getArg(0))); list.add(handle(expr.getArg(1))); return asDBObject("$or", list); } else if (op == Ops.NE) { return asDBObject(asDBKey(expr, 0), asDBObject("$ne", asDBValue(expr, 1))); } else if (op == Ops.STARTS_WITH) { return asDBObject(asDBKey(expr, 0), Pattern.compile("^" + regexValue(expr, 1))); } else if (op == Ops.STARTS_WITH_IC) { return asDBObject( asDBKey(expr, 0), Pattern.compile("^" + regexValue(expr, 1), Pattern.CASE_INSENSITIVE)); } else if (op == Ops.ENDS_WITH) { return asDBObject(asDBKey(expr, 0), Pattern.compile(regexValue(expr, 1) + "$")); } else if (op == Ops.ENDS_WITH_IC) { return asDBObject( asDBKey(expr, 0), Pattern.compile(regexValue(expr, 1) + "$", Pattern.CASE_INSENSITIVE)); } else if (op == Ops.EQ_IGNORE_CASE) { return asDBObject( asDBKey(expr, 0), Pattern.compile("^" + regexValue(expr, 1) + "$", Pattern.CASE_INSENSITIVE)); } else if (op == Ops.STRING_CONTAINS) { return asDBObject(asDBKey(expr, 0), Pattern.compile(".*" + regexValue(expr, 1) + ".*")); } else if (op == Ops.STRING_CONTAINS_IC) { return asDBObject( asDBKey(expr, 0), Pattern.compile(".*" + regexValue(expr, 1) + ".*", Pattern.CASE_INSENSITIVE)); } else if (op == Ops.MATCHES) { return asDBObject(asDBKey(expr, 0), Pattern.compile(asDBValue(expr, 1).toString())); } else if (op == Ops.MATCHES_IC) { return asDBObject( asDBKey(expr, 0), Pattern.compile(asDBValue(expr, 1).toString(), Pattern.CASE_INSENSITIVE)); } else if (op == Ops.LIKE) { String regex = ExpressionUtils.likeToRegex((Expression) expr.getArg(1)).toString(); return asDBObject(asDBKey(expr, 0), Pattern.compile(regex)); } else if (op == Ops.BETWEEN) { BasicDBObject value = new BasicDBObject("$gte", asDBValue(expr, 1)); value.append("$lte", asDBValue(expr, 2)); return asDBObject(asDBKey(expr, 0), value); } else if (op == Ops.IN) { int constIndex = 0; int exprIndex = 1; if (expr.getArg(1) instanceof Constant<?>) { constIndex = 1; exprIndex = 0; } if (Collection.class.isAssignableFrom(expr.getArg(constIndex).getType())) { Collection<?> values = (Collection<?>) ((Constant<?>) expr.getArg(constIndex)).getConstant(); return asDBObject(asDBKey(expr, exprIndex), asDBObject("$in", values.toArray())); } else { return asDBObject(asDBKey(expr, exprIndex), asDBValue(expr, constIndex)); } } else if (op == Ops.LT) { return asDBObject(asDBKey(expr, 0), asDBObject("$lt", asDBValue(expr, 1))); } else if (op == Ops.GT) { return asDBObject(asDBKey(expr, 0), asDBObject("$gt", asDBValue(expr, 1))); } else if (op == Ops.LOE) { return asDBObject(asDBKey(expr, 0), asDBObject("$lte", asDBValue(expr, 1))); } else if (op == Ops.GOE) { return asDBObject(asDBKey(expr, 0), asDBObject("$gte", asDBValue(expr, 1))); } else if (op == Ops.IS_NULL) { return asDBObject(asDBKey(expr, 0), asDBObject("$exists", false)); } else if (op == Ops.IS_NOT_NULL) { return asDBObject(asDBKey(expr, 0), asDBObject("$exists", true)); } else if (op == Ops.CONTAINS_KEY) { Path<?> path = (Path<?>) expr.getArg(0); Expression<?> key = expr.getArg(1); return asDBObject(visit(path, context) + "." + key.toString(), asDBObject("$exists", true)); } else if (op == MongodbExpressions.NEAR) { return asDBObject(asDBKey(expr, 0), asDBObject("$near", asDBValue(expr, 1))); } else if (op == MongodbExpressions.ELEM_MATCH) { return asDBObject(asDBKey(expr, 0), asDBObject("$elemMatch", asDBValue(expr, 1))); } throw new UnsupportedOperationException("Illegal operation " + expr); }
public MongodbQuery<K> on(Predicate... conditions) { return queryMixin.where( new PredicateOperation( MongodbOps.ELEM_MATCH, collection, ExpressionUtils.allOf(conditions))); }
/** @author tiwe */ public abstract class AbstractStandardTest { private static final Expression<?>[] NO_EXPRESSIONS = new Expression[0]; private static final QCompany company = QCompany.company; private static final QAnimal animal = QAnimal.animal; private static final QCat cat = QCat.cat; private static final QCat otherCat = new QCat("otherCat"); private static final BooleanExpression cond1 = cat.name.length().gt(0); private static final BooleanExpression cond2 = otherCat.name.length().gt(0); private static final Predicate condition = ExpressionUtils.and( (Predicate) ExpressionUtils.extract(cond1), (Predicate) ExpressionUtils.extract(cond2)); private static final Date birthDate; private static final java.sql.Date date; private static final java.sql.Time time; private final List<Cat> savedCats = new ArrayList<Cat>(); static { Calendar cal = Calendar.getInstance(); cal.set(2000, 1, 2, 3, 4); cal.set(Calendar.MILLISECOND, 0); birthDate = cal.getTime(); date = new java.sql.Date(cal.getTimeInMillis()); time = new java.sql.Time(cal.getTimeInMillis()); } protected Target getTarget() { return Mode.target.get(); } protected abstract JPQLQuery query(); protected abstract JPQLQuery testQuery(); protected JPASubQuery subQuery() { return new JPASubQuery(); } protected abstract void save(Object entity); @Before public void setUp() { if (query().from(cat).exists()) { savedCats.addAll(query().from(cat).orderBy(cat.id.asc()).list(cat)); return; } Cat prev = null; for (Cat cat : Arrays.asList( new Cat("Bob123", 1, 1.0), new Cat("Ruth123", 2, 2.0), new Cat("Felix123", 3, 3.0), new Cat("Allen123", 4, 4.0), new Cat("Mary_123", 5, 5.0))) { if (prev != null) { cat.addKitten(prev); } cat.setBirthdate(birthDate); cat.setDateField(date); cat.setTimeField(time); save(cat); savedCats.add(cat); prev = cat; } Animal animal = new Animal(10); animal.setBodyWeight(10.5); save(animal); Cat cat = new Cat("Some", 6, 6.0); cat.setBirthdate(birthDate); save(cat); savedCats.add(cat); Show show = new Show(1); show.acts = new HashMap<String, String>(); show.acts.put("a", "A"); show.acts.put("b", "B"); save(show); Company company = new Company(); company.id = 1; company.ratingOrdinal = Company.Rating.A; company.ratingString = Company.Rating.AA; save(company); Employee employee = new Employee(); employee.id = 1; employee.lastName = "Smith"; employee.jobFunctions.add(JobFunction.CODER); save(employee); Employee employee2 = new Employee(); employee2.id = 2; employee2.lastName = "Doe"; employee2.jobFunctions.add(JobFunction.CODER); employee2.jobFunctions.add(JobFunction.CONSULTANT); employee2.jobFunctions.add(JobFunction.CONTROLLER); save(employee2); save(new Entity1(1)); save(new Entity1(2)); save(new Entity2(3)); Foo foo = new Foo(); foo.id = 1; foo.names = Arrays.asList("a", "b"); foo.bar = "München"; save(foo); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void test() { Cat kitten = savedCats.get(0); Cat noKitten = savedCats.get(savedCats.size() - 1); ProjectionsFactory projections = new ProjectionsFactory(Module.JPA, getTarget()) { @Override public <A, Q extends SimpleExpression<A>> Collection<Expression<?>> list( ListPath<A, Q> expr, ListExpression<A, Q> other, A knownElement) { // NOTE : expr.get(0) is only supported in the where clause return Collections.<Expression<?>>singleton(expr.size()); } }; final EntityPath<?>[] sources = new EntityPath[] {cat, otherCat}; final Predicate[] conditions = new Predicate[] {condition}; final Expression<?>[] projection = new Expression[] {cat.name, otherCat.name}; QueryExecution standardTest = new QueryExecution( projections, new FilterFactory(projections, Module.JPA, getTarget()), new MatchingFiltersFactory(Module.JPA, getTarget())) { @Override protected Pair<Projectable, Expression<?>[]> createQuery() { // NOTE : EclipseLink needs extra conditions cond1 and code2 return Pair.of( (Projectable) testQuery().from(sources).where(conditions), NO_EXPRESSIONS); } @Override protected Pair<Projectable, Expression<?>[]> createQuery(Predicate filter) { // NOTE : EclipseLink needs extra conditions cond1 and code2 return Pair.of( (Projectable) testQuery().from(sources).where(condition, filter), projection); } }; // standardTest.runArrayTests(cat.kittensArray, otherCat.kittensArray, kitten, noKitten); standardTest.runBooleanTests(cat.name.isNull(), otherCat.kittens.isEmpty()); standardTest.runCollectionTests(cat.kittens, otherCat.kittens, kitten, noKitten); standardTest.runDateTests(cat.dateField, otherCat.dateField, date); standardTest.runDateTimeTests(cat.birthdate, otherCat.birthdate, birthDate); standardTest.runListTests(cat.kittens, otherCat.kittens, kitten, noKitten); // standardTest.mapTests(cat.kittensByName, otherCat.kittensByName, "Kitty", kitten); // int standardTest.runNumericCasts(cat.id, otherCat.id, 1); standardTest.runNumericTests(cat.id, otherCat.id, 1); // double standardTest.runNumericCasts(cat.bodyWeight, otherCat.bodyWeight, 1.0); standardTest.runNumericTests(cat.bodyWeight, otherCat.bodyWeight, 1.0); standardTest.runStringTests(cat.name, otherCat.name, kitten.getName()); standardTest.runTimeTests(cat.timeField, otherCat.timeField, time); standardTest.report(); } @Test public void Any_Simple() { assertEquals(1, query().from(cat).where(cat.kittens.any().name.eq("Ruth123")).count()); } @Test public void Exists() { assertTrue(query().from(cat).where(cat.kittens.any().name.eq("Ruth123")).exists()); } @Test public void NotExists() { assertTrue(query().from(cat).where(cat.kittens.any().name.eq("XXX")).notExists()); } @Test public void Any_Usage() { assertEquals(1, query().from(cat).where(cat.kittens.any().name.eq("Ruth123")).count()); } @Test public void Any_And_Lt() { assertEquals( 1, query() .from(cat) .where(cat.kittens.any().name.eq("Ruth123"), cat.kittens.any().bodyWeight.lt(10.0)) .count()); } @Test public void Any_And_Gt() { assertEquals( 0, query() .from(cat) .where(cat.kittens.any().name.eq("Ruth123"), cat.kittens.any().bodyWeight.gt(10.0)) .count()); } @Test public void Any_In1() { // select cat from Cat cat where exists ( // select cat_kittens from Cat cat_kittens where cat_kittens member of cat.kittens and // cat_kittens in ?1) query().from(cat).where(cat.kittens.any().in(savedCats)).list(cat); } @Test public void Any_In11() { List<Integer> ids = Lists.newArrayList(); for (Cat cat : savedCats) ids.add(cat.getId()); query().from(cat).where(cat.kittens.any().id.in(ids)).list(cat); } @Test public void Any_In2() { query() .from(cat) .where(cat.kittens.any().in(savedCats), cat.kittens.any().in(savedCats.subList(0, 1)).not()) .list(cat); } @Test public void Any_In3() { QEmployee employee = QEmployee.employee; query() .from(employee) .where(employee.jobFunctions.any().in(JobFunction.CODER, JobFunction.CONSULTANT)) .list(employee); } @Test public void Any_In_Projection() { query().from(cat).list(cat.kittens.any()); } @Test public void Any_In_Projection2() { query().from(cat).list(cat.kittens.any().name); } @Test public void Any_In_Order() { query().from(cat).orderBy(cat.kittens.any().name.asc()).list(cat); } @Test public void As() { query().from(QAnimal.animal.as(QCat.class)).count(); } @Test @NoEclipseLink @ExcludeIn(Target.ORACLE) public void JoinEmbeddable() { QBookVersion bookVersion = QBookVersion.bookVersion; QBookMark bookMark = QBookMark.bookMark; query() .from(bookVersion) .join(bookVersion.definition.bookMarks, bookMark) .where( bookVersion.definition.bookMarks.size().eq(1), bookMark.page.eq(2357L).or(bookMark.page.eq(2356L))) .list(bookVersion); } @Test public void Aggregates_UniqueResult_Min() { assertEquals(Integer.valueOf(1), query().from(cat).uniqueResult(cat.id.min())); } @Test public void Aggregates_UniqueResult_Max() { assertEquals(Integer.valueOf(6), query().from(cat).uniqueResult(cat.id.max())); } @Test public void Aggregates_List_Min() { assertEquals(Integer.valueOf(1), query().from(cat).list(cat.id.min()).get(0)); } @Test public void Aggregates_List_Max() { assertEquals(Integer.valueOf(6), query().from(cat).list(cat.id.max()).get(0)); } @Test @NoHibernate public void Constant() { // select cat.id, ?1 as const from Cat cat query() .from(cat) .list(new QTuple(cat.id, Expressions.constantAs("abc", new StringPath("const")))); } @Test public void DistinctResults() { System.out.println("-- list results"); SearchResults<Date> res = query().from(cat).limit(2).listResults(cat.birthdate); assertEquals(2, res.getResults().size()); assertEquals(6l, res.getTotal()); System.out.println(); System.out.println("-- list distinct results"); res = query().from(cat).limit(2).distinct().listResults(cat.birthdate); assertEquals(1, res.getResults().size()); assertEquals(1l, res.getTotal()); System.out.println(); System.out.println("-- list distinct"); assertEquals(1, query().from(cat).distinct().list(cat.birthdate).size()); } @Test @ExcludeIn(Target.ORACLE) public void Divide() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); query() .from(entity, entity2) .where(entity.ddouble.divide(entity2.ddouble).loe(2.0)) .list(entity); query().from(entity, entity2).where(entity.ddouble.divide(entity2.iint).loe(2.0)).list(entity); query().from(entity, entity2).where(entity.iint.divide(entity2.ddouble).loe(2.0)).list(entity); query().from(entity, entity2).where(entity.iint.divide(entity2.iint).loe(2)).list(entity); } @Test @ExcludeIn(Target.ORACLE) public void Divide_BigDecimal() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); NumberPath<BigDecimal> bigd1 = entity.bigDecimal; NumberPath<BigDecimal> bigd2 = entity2.bigDecimal; query() .from(entity, entity2) .where(bigd1.divide(bigd2).loe(new BigDecimal("1.00"))) .list(entity); query() .from(entity, entity2) .where(entity.ddouble.divide(bigd2).loe(new BigDecimal("1.00"))) .list(entity); query() .from(entity, entity2) .where(bigd1.divide(entity.ddouble).loe(new BigDecimal("1.00"))) .list(entity); } @Test @ExcludeIn(Target.ORACLE) public void Multiply() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); query() .from(entity, entity2) .where(entity.ddouble.multiply(entity2.ddouble).loe(2.0)) .list(entity); } @Test @ExcludeIn(Target.ORACLE) public void Multiply_BigDecimal() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); NumberPath<BigDecimal> bigd1 = entity.bigDecimal; NumberPath<BigDecimal> bigd2 = entity2.bigDecimal; query() .from(entity, entity2) .where(bigd1.multiply(bigd2).loe(new BigDecimal("1.00"))) .list(entity); } @Test @ExcludeIn(Target.ORACLE) public void Add_BigDecimal() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); NumberPath<BigDecimal> bigd1 = entity.bigDecimal; NumberPath<BigDecimal> bigd2 = entity2.bigDecimal; query().from(entity, entity2).where(bigd1.add(bigd2).loe(new BigDecimal("1.00"))).list(entity); } @Test @ExcludeIn(Target.ORACLE) public void Subtract_BigDecimal() { QSimpleTypes entity = new QSimpleTypes("entity1"); QSimpleTypes entity2 = new QSimpleTypes("entity2"); NumberPath<BigDecimal> bigd1 = entity.bigDecimal; NumberPath<BigDecimal> bigd2 = entity2.bigDecimal; query() .from(entity, entity2) .where(bigd1.subtract(bigd2).loe(new BigDecimal("1.00"))) .list(entity); } @Test @NoBatooJPA public void Enum_in() { assertEquals( 1, query().from(company).where(company.ratingOrdinal.in(Rating.A, Rating.AA)).count()); assertEquals( 1, query().from(company).where(company.ratingString.in(Rating.A, Rating.AA)).count()); } @Test public void In() { query().from(cat).where(cat.id.in(Arrays.asList(1, 2, 3))).count(); query().from(cat).where(cat.name.in(Arrays.asList("A", "B", "C"))).count(); } @Test public void In2() { query().from(cat).where(cat.id.in(1, 2, 3)).count(); query().from(cat).where(cat.name.in("A", "B", "C")).count(); } @Test public void In3() { query().from(cat).where(cat.name.in("A,B,C".split(","))).count(); } @Test public void In4() { // $.parameterRelease.id.eq(releaseId).and($.parameterGroups.any().id.in(filter.getGroups())); query().from(cat).where(cat.id.eq(1), cat.kittens.any().id.in(1, 2, 3)).list(cat); } @Test public void In5() { query().from(cat).where(cat.mate.in(savedCats)).count(); } @Test @Ignore public void In6() { // query().from(cat).where(cat.kittens.in(savedCats)).count(); } @Test public void In7() { query().from(cat).where(cat.kittens.any().in(savedCats)).count(); } @Test public void Collection_Predicates() { ListPath<Cat, QCat> path = cat.kittens; List<Predicate> predicates = Arrays.<Predicate>asList( // path.eq(savedCats), // path.in(savedCats), // path.isNotNull(), // path.isNull(), // path.ne(savedCats), // path.notIn(savedCats) // path.when(other) ); for (Predicate pred : predicates) { System.err.println(pred); query().from(cat).where(pred).list(cat); } } @Test public void Collection_Projections() { ListPath<Cat, QCat> path = cat.kittens; List<Expression<?>> projections = Arrays.<Expression<?>>asList( // path.count(), // path.countDistinct() ); for (Expression<?> proj : projections) { System.err.println(proj); query().from(cat).list(proj); } } @Test @Ignore // FIXME https://github.com/mysema/querydsl/issues/185 public void Case() { query().from(cat).list(cat.name.when("Bob").then(1).otherwise(2)); } @Test public void Cast() { query().from(cat).list(cat.bodyWeight.castToNum(Integer.class)); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void Fetch() { QMammal mammal = QMammal.mammal; QHuman human = new QHuman("mammal"); query().from(mammal).leftJoin(human.hairs).fetch().list(mammal); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void Fetch2() { QWorld world = QWorld.world; QMammal mammal = QMammal.mammal; QHuman human = new QHuman("mammal"); query() .from(world) .leftJoin(world.mammals, mammal) .fetch() .leftJoin(human.hairs) .fetch() .list(world); } @Test public void StartsWith() { assertEquals(1, query().from(cat).where(cat.name.startsWith("R")).count()); } @Test public void StartsWith2() { assertEquals(0, query().from(cat).where(cat.name.startsWith("X")).count()); } @Test public void StartsWith3() { assertEquals(1, query().from(cat).where(cat.name.startsWith("Mary_")).count()); } @Test public void StartsWith_IgnoreCase() { assertEquals(1, query().from(cat).where(cat.name.startsWithIgnoreCase("r")).count()); } @Test public void EndsWith() { assertEquals(1, query().from(cat).where(cat.name.endsWith("h123")).count()); } @Test public void EndsWith2() { assertEquals(0, query().from(cat).where(cat.name.endsWith("X")).count()); } @Test public void EndsWith3() { assertEquals(1, query().from(cat).where(cat.name.endsWith("_123")).count()); } @Test public void EndsWith_IgnoreCase() { assertEquals(1, query().from(cat).where(cat.name.endsWithIgnoreCase("H123")).count()); } @Test public void Contains1() { assertEquals(1, query().from(cat).where(cat.name.contains("eli")).count()); } @Test public void Contains2() { assertEquals(1l, query().from(cat).where(cat.kittens.contains(savedCats.get(0))).count()); } @Test public void Contains3() { assertEquals(1l, query().from(cat).where(cat.name.contains("_")).count()); } @Test public void Contains4() { QEmployee employee = QEmployee.employee; query() .from(employee) .where( employee.jobFunctions.contains(JobFunction.CODER), employee.jobFunctions.contains(JobFunction.CONSULTANT), employee.jobFunctions.size().eq(2)) .list(employee); } @Test public void Contains_Ic() { QFoo foo = QFoo.foo; assertEquals(1, query().from(foo).where(foo.bar.containsIgnoreCase("München")).count()); } @Test public void Length() { assertEquals(6, query().from(cat).where(cat.name.length().gt(0)).count()); } @Test @NoOpenJPA public void IndexOf() { assertEquals( Integer.valueOf(0), query().from(cat).where(cat.name.eq("Bob123")).uniqueResult(cat.name.indexOf("B"))); } @Test @NoOpenJPA public void IndexOf2() { assertEquals( Integer.valueOf(1), query().from(cat).where(cat.name.eq("Bob123")).uniqueResult(cat.name.indexOf("o"))); } @Test @ExcludeIn(Target.MYSQL) @NoOpenJPA public void StringOperations() { // NOTE : locate in MYSQL is case-insensitive assertEquals(0, query().from(cat).where(cat.name.startsWith("r")).count()); assertEquals(0, query().from(cat).where(cat.name.endsWith("H123")).count()); assertEquals( Integer.valueOf(2), query().from(cat).where(cat.name.eq("Bob123")).uniqueResult(cat.name.indexOf("b"))); } @Test public void Limit() { List<String> names1 = Arrays.asList("Allen123", "Bob123"); assertEquals(names1, query().from(cat).orderBy(cat.name.asc()).limit(2).list(cat.name)); } @Test public void Limit2() { assertEquals( Collections.singletonList("Allen123"), query().from(cat).orderBy(cat.name.asc()).limit(1).list(cat.name)); } @Test public void Limit3() { assertEquals(6, query().from(cat).limit(Long.MAX_VALUE).list(cat).size()); } @Test public void Min() { query().from(cat).uniqueResult(cat.bodyWeight.min()); } @Test public void Max() { query().from(cat).uniqueResult(cat.bodyWeight.max()); } @Test public void Order() { NumberPath<Double> weight = new NumberPath<Double>(Double.class, "weight"); query().from(cat).orderBy(weight.asc()).list(cat.bodyWeight.as(weight)); } @Test @Ignore public void Order_NullsFirst() { assertNull( query().from(cat).orderBy(cat.dateField.asc().nullsFirst()).singleResult(cat.dateField)); } @Test @Ignore public void Order_NullsLast() { assertNotNull( query().from(cat).orderBy(cat.dateField.asc().nullsLast()).singleResult(cat.dateField)); } @Test @NoOpenJPA // FIXME public void Offset() { List<String> names2 = Arrays.asList("Felix123", "Mary_123", "Ruth123", "Some"); assertEquals(names2, query().from(cat).orderBy(cat.name.asc()).offset(2).list(cat.name)); } @Test public void Limit_and_offset() { List<String> names3 = Arrays.asList("Felix123", "Mary_123"); assertEquals( names3, query().from(cat).orderBy(cat.name.asc()).limit(2).offset(2).list(cat.name)); } @Test public void InstanceOf_Cat() { assertEquals(6l, query().from(cat).where(cat.instanceOf(Cat.class)).count()); } @Test public void InstanceOf_DomesticCat() { assertEquals(0l, query().from(cat).where(cat.instanceOf(DomesticCat.class)).count()); } @Test public void InstanceOf_Entity1() { QEntity1 entity1 = QEntity1.entity1; assertEquals(2l, query().from(entity1).where(entity1.instanceOf(Entity1.class)).count()); } @Test public void InstanceOf_Entity2() { QEntity1 entity1 = QEntity1.entity1; assertEquals(1l, query().from(entity1).where(entity1.instanceOf(Entity2.class)).count()); } @Test public void NestedProjection() { Concatenation concat = new Concatenation(cat.name, cat.name); List<Tuple> tuples = query().from(cat).list(new QTuple(cat.name, concat)); assertFalse(tuples.isEmpty()); for (Tuple tuple : tuples) { assertEquals(tuple.get(concat), tuple.get(cat.name) + tuple.get(cat.name)); } } @Test public void TupleProjection() { List<Tuple> tuples = query().from(cat).list(new QTuple(cat.name, cat)); assertFalse(tuples.isEmpty()); for (Tuple tuple : tuples) { assertNotNull(tuple.get(cat.name)); assertNotNull(tuple.get(cat)); } } @Test public void TupleProjection_As_SearchResults() { SearchResults<Tuple> tuples = query().from(cat).limit(1).listResults(new QTuple(cat.name, cat)); assertEquals(1, tuples.getResults().size()); assertTrue(tuples.getTotal() > 0); } @Test @Ignore public void Type() { assertEquals( Arrays.asList("C", "C", "C", "C", "C", "C", "A"), query().from(animal).orderBy(animal.id.asc()).list(JPAExpressions.type(animal))); } @Test @NoOpenJPA public void Type_Order() { assertEquals( Arrays.asList(10, 1, 2, 3, 4, 5, 6), query() .from(animal) .orderBy(JPAExpressions.type(animal).asc(), animal.id.asc()) .list(animal.id)); } @SuppressWarnings("unchecked") @Test public void ArrayProjection() { List<String[]> results = query().from(cat).list(new ArrayConstructorExpression<String>(String[].class, cat.name)); assertFalse(results.isEmpty()); for (String[] result : results) { assertNotNull(result[0]); } } @Test public void ConstructorProjection() { List<Projection> projections = query().from(cat).list(ConstructorExpression.create(Projection.class, cat.name, cat)); assertFalse(projections.isEmpty()); for (Projection projection : projections) { assertNotNull(projection); } } @Test public void ConstructorProjection2() { List<Projection> projections = query().from(cat).list(new QProjection(cat.name, cat)); assertFalse(projections.isEmpty()); for (Projection projection : projections) { assertNotNull(projection); } } @Test public void Params() { Param<String> name = new Param<String>(String.class, "name"); assertEquals( "Bob123", query().from(cat).where(cat.name.eq(name)).set(name, "Bob123").uniqueResult(cat.name)); } @Test public void Params_anon() { Param<String> name = new Param<String>(String.class); assertEquals( "Bob123", query().from(cat).where(cat.name.eq(name)).set(name, "Bob123").uniqueResult(cat.name)); } @Test(expected = ParamNotSetException.class) public void Params_not_set() { Param<String> name = new Param<String>(String.class, "name"); assertEquals("Bob123", query().from(cat).where(cat.name.eq(name)).uniqueResult(cat.name)); } @Test public void Null_as_uniqueResult() { assertNull( query().from(cat).where(cat.name.eq(UUID.randomUUID().toString())).uniqueResult(cat)); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void Map_ContainsKey() { QShow show = QShow.show; assertEquals(1l, query().from(show).where(show.acts.containsKey("a")).count()); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void Map_ContainsKey2() { QShow show = QShow.show; assertEquals(1l, query().from(show).where(show.acts.containsKey("b")).count()); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void Map_ContainsKey3() { QShow show = QShow.show; assertEquals(0l, query().from(show).where(show.acts.containsKey("c")).count()); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void Map_ContainsValue() { QShow show = QShow.show; assertEquals(1l, query().from(show).where(show.acts.containsValue("A")).count()); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void Map_ContainsValue2() { QShow show = QShow.show; assertEquals(1l, query().from(show).where(show.acts.containsValue("B")).count()); } @Test @NoEclipseLink @NoOpenJPA @NoBatooJPA public void Map_ContainsValue3() { QShow show = QShow.show; assertEquals(0l, query().from(show).where(show.acts.containsValue("C")).count()); } @Test @Ignore public void Map_Join() { // select m.text from Show s join s.acts a where key(a) = 'B' QShow show = QShow.show; StringPath act = new StringPath("act"); query().from(show).join(show.acts, act); } @Test @Ignore public void Size() { // NOT SUPPORTED query().from(cat).list(cat, cat.kittens.size()); } @Test @Ignore public void Sum() throws RecognitionException, TokenStreamException { // NOT SUPPORTED query().from(cat).list(cat.kittens.size().sum()); } @Test @Ignore public void Sum_2() throws RecognitionException, TokenStreamException { // NOT SUPPORTED query().from(cat).where(cat.kittens.size().sum().gt(0)).list(cat); } @Test public void Sum_3() { query().from(cat).uniqueResult(cat.bodyWeight.sum()); } @Test public void Sum_3_Projected() { double val = query().from(cat).uniqueResult(cat.bodyWeight.sum()); DoubleProjection projection = query().from(cat).uniqueResult(new QDoubleProjection(cat.bodyWeight.sum())); assertEquals(val, projection.val, 0.001); } @Test public void Sum_4() { query().from(cat).uniqueResult(cat.bodyWeight.sum().negate()); } @Test public void Sum_NoRows_Double() { query() .from(cat) .where(cat.name.eq(UUID.randomUUID().toString())) .uniqueResult(cat.bodyWeight.sum()); } @Test public void Sum_NoRows_Float() { query() .from(cat) .where(cat.name.eq(UUID.randomUUID().toString())) .uniqueResult(cat.floatProperty.sum()); } @Test public void Sum_as_Float() { float val = query().from(cat).uniqueResult(cat.floatProperty.sum()); assertTrue(val > 0); } @Test public void Sum_as_Float2() { float val = query().from(cat).uniqueResult(cat.floatProperty.sum().negate()); assertTrue(val < 0); } @Test public void Sum_Coalesce() { int val = query().from(cat).uniqueResult(cat.weight.sum().coalesce(0)); assertTrue(val == 0); } @Test public void Sum_as_Float_Projected() { float val = query().from(cat).uniqueResult(cat.floatProperty.sum()); FloatProjection projection = query().from(cat).uniqueResult(new QFloatProjection(cat.floatProperty.sum())); assertEquals(val, projection.val, 0.001); } @Test public void Precedence() { StringPath str = cat.name; Predicate where = str.like("Bob%").and(str.like("%ob123")).or(str.like("Ruth%").and(str.like("%uth123"))); assertEquals(2l, query().from(cat).where(where).count()); } @Test public void Precedence2() { StringPath str = cat.name; Predicate where = str.like("Bob%").and(str.like("%ob123").or(str.like("Ruth%"))).and(str.like("%uth123")); assertEquals(0l, query().from(cat).where(where).count()); } @Test public void Precedence3() { Predicate where = cat.name.eq("Bob123").and(cat.id.eq(1)).or(cat.name.eq("Ruth123").and(cat.id.eq(2))); assertEquals(2l, query().from(cat).where(where).count()); } @Test public void Substring() { for (String str : query().from(cat).list(cat.name.substring(1, 2))) { assertEquals(1, str.length()); } } @Test public void SubQuery() { QShow show = QShow.show; QShow show2 = new QShow("show2"); query() .from(show) .where(subQuery().from(show2).where(show2.id.ne(show.id)).count().gt(0)) .count(); } @Test public void SubQuery2() { QCat cat = QCat.cat; QCat other = new QCat("other"); List<Cat> cats = query() .from(cat) .where( cat.name.in( new HibernateSubQuery().from(other).groupBy(other.name).list(other.name))) .list(cat); assertNotNull(cats); } @Test public void SubQuery3() { QCat cat = QCat.cat; QCat other = new QCat("other"); query() .from(cat) .where( cat.name.eq( new JPASubQuery() .from(other) .where(other.name.indexOf("B").eq(0)) .unique(other.name))) .list(cat); } @Test public void Count() { QShow show = QShow.show; assertTrue(query().from(show).count() > 0); } @Test public void One_To_One() { QEmployee employee = QEmployee.employee; QUser user = QUser.user; JPQLQuery query = query(); query.from(employee); query.innerJoin(employee.user, user); query.list(employee); } @Test @NoBatooJPA public void Enum_In() { QEmployee employee = QEmployee.employee; JPQLQuery query = query(); query .from(employee) .where(employee.lastName.eq("Smith"), employee.jobFunctions.contains(JobFunction.CODER)); assertEquals(1l, query.count()); } @Test public void List_ElementCollection_Of_Enum() { QEmployee employee = QEmployee.employee; // QJobFunction jobFunction = QJobFunction.jobFunction; EnumPath<JobFunction> jobFunction = new EnumPath<JobFunction>(JobFunction.class, "jf"); List<JobFunction> jobFunctions = query().from(employee).innerJoin(employee.jobFunctions, jobFunction).list(jobFunction); assertEquals(4, jobFunctions.size()); } @Test @NoBatooJPA public void List_ElementCollection_Of_String() { QFoo foo = QFoo.foo; StringPath str = new StringPath("str"); List<String> strings = query().from(foo).innerJoin(foo.names, str).list(str); assertEquals(2, strings.size()); assertTrue(strings.contains("a")); assertTrue(strings.contains("b")); } @Test @ExcludeIn({MYSQL, DERBY}) @NoBatooJPA public void GroupBy() { QAuthor author = QAuthor.author; QBook book = QBook.book; for (int i = 0; i < 10; i++) { Author a = new Author(); a.setName(String.valueOf(i)); save(a); for (int j = 0; j < 2; j++) { Book b = new Book(); b.setTitle(String.valueOf(i) + " " + String.valueOf(j)); b.setAuthor(a); save(b); } } Map<Long, List<Pair<Long, String>>> map = query() .from(author) .join(author.books, book) .transform( GroupBy.groupBy(author.id).as(GroupBy.list(QPair.create(book.id, book.title)))); for (Entry<Long, List<Pair<Long, String>>> entry : map.entrySet()) { System.out.println("author = " + entry.getKey()); for (Pair<Long, String> pair : entry.getValue()) { System.out.println(" book = " + pair.getFirst() + "," + pair.getSecond()); } } } @Test public void GroupBy2() { // select cat0_.name as col_0_0_, cat0_.breed as col_1_0_, sum(cat0_.bodyWeight) as // col_2_0_ // from animal_ cat0_ where cat0_.DTYPE in ('C', 'DC') and cat0_.bodyWeight>? // group by cat0_.name , cat0_.breed query() .from(cat) .where(cat.bodyWeight.gt(0)) .groupBy(cat.name, cat.breed) .list(cat.name, cat.breed, cat.bodyWeight.sum()); } }
@SuppressWarnings("unchecked") public T from(SubQueryExpression<?> subQuery, Path<?> alias) { return queryMixin.from(ExpressionUtils.as((Expression) subQuery, alias)); }