blob: cc9a10050cb768c1999364f502b0c3af2dd60fd8 [file] [log] [blame]
/*
* 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
<<<<<<< Updated upstream
*
* 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
=======
*
* https://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
>>>>>>> Stashed changes
* limitations under the License.
*/
package org.apache.jdo.tck.query.api;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jdo.JDOQLTypedQuery;
import javax.jdo.JDOQLTypedSubquery;
import javax.jdo.Query;
import javax.jdo.Transaction;
import javax.jdo.query.CollectionExpression;
import javax.jdo.query.NumericExpression;
import javax.jdo.query.StringExpression;
import org.apache.jdo.tck.pc.company.CompanyModelReader;
import org.apache.jdo.tck.pc.company.Department;
import org.apache.jdo.tck.pc.company.Employee;
import org.apache.jdo.tck.pc.company.FullTimeEmployee;
import org.apache.jdo.tck.pc.company.Person;
import org.apache.jdo.tck.pc.company.QDepartment;
import org.apache.jdo.tck.pc.company.QEmployee;
import org.apache.jdo.tck.pc.company.QFullTimeEmployee;
import org.apache.jdo.tck.query.QueryTest;
import org.apache.jdo.tck.util.BatchTestRunner;
import org.apache.jdo.tck.util.EqualityHelper;
/**
* <B>Title:</B> SampleQueries <br>
* <B>Keywords:</B> query <br>
* <B>Assertion IDs:</B> <br>
* <B>Assertion Description: </B> This test class runs the example queries from the JDO
* specification.
*
* <p>There are up to six test methods per test case: testQueryxxa: runtime constructed JDO query
* using execute to run the query testQueryxxb: runtime constructed JDO query using
* setNamedParameters to specify the parameter values and
* executeList/executeResultList/executeResultUnique to run the query testQueryxxc: runtime
* constructed JDO query using setParameters to specify the parameter values and
* executeList/executeResultList/executeResultUnique to run the query testQueryxxd: single string
* version of the JDO query testQueryxxe: named query version of the JDO query testQueryxxf:
* JDOQLTypedQuery version
*/
public class SampleQueries extends QueryTest {
/** */
private static final String ASSERTION_FAILED = "Assertion (SampleQueries) failed: ";
/** */
private static final String SAMPLE_QUERIES_TEST_COMPANY_TESTDATA =
"org/apache/jdo/tck/pc/company/companyForSampleQueriesTest.xml";
/**
* The <code>main</code> is called when the class is directly executed from the command line.
*
* @param args The arguments passed to the program.
*/
public static void main(String[] args) {
BatchTestRunner.run(SampleQueries.class);
}
private static final String SINGLE_STRING_QUERY_01 =
"select from org.apache.jdo.tck.pc.company.FullTimeEmployee where salary > 30000";
private static final String SINGLE_STRING_QUERY_02 =
"select from org.apache.jdo.tck.pc.company.FullTimeEmployee "
+ "where salary > 30000 order by salary ascending";
private static final String SINGLE_STRING_QUERY_03 =
"select from org.apache.jdo.tck.pc.company.FullTimeEmployee "
+ "where salary > :sal && firstname.startsWith(:begin)";
private static final String SINGLE_STRING_QUERY_04 =
"select from org.apache.jdo.tck.pc.company.Employee where department.name == :dep";
private static final String SINGLE_STRING_QUERY_05 =
"select from org.apache.jdo.tck.pc.company.Department "
+ "where employees.contains(emp) && emp.weeklyhours > :hours variables Employee emp";
private static final String SINGLE_STRING_QUERY_06 =
"select from org.apache.jdo.tck.pc.company.Department where :depts.contains(name)";
private static final String SINGLE_STRING_QUERY_07 =
"select firstname from org.apache.jdo.tck.pc.company.Employee where department.name == :deptName";
private static final String SINGLE_STRING_QUERY_08 =
"select firstname, salary, manager as reportsTo into org.apache.jdo.tck.query.api.SampleQueries$Info "
+ "from org.apache.jdo.tck.pc.company.FullTimeEmployee where department.name == :deptName";
private static final String SINGLE_STRING_QUERY_09 =
"select new org.apache.jdo.tck.query.api.SampleQueries$Info (firstname, salary, manager) "
+ "from org.apache.jdo.tck.pc.company.FullTimeEmployee where department.name == :deptName";
private static final String SINGLE_STRING_QUERY_10 =
"select avg(salary) from org.apache.jdo.tck.pc.company.FullTimeEmployee "
+ "where department.name == :deptName";
private static final String SINGLE_STRING_QUERY_11 =
"select avg(salary), sum(salary) from org.apache.jdo.tck.pc.company.FullTimeEmployee "
+ "where department.name == :deptName";
private static final String SINGLE_STRING_QUERY_12 =
"select avg(salary), sum(salary), department.name "
+ "from org.apache.jdo.tck.pc.company.FullTimeEmployee "
+ "group by department.name having count(department.name) > 1";
private static final String SINGLE_STRING_QUERY_13 =
"select unique this from org.apache.jdo.tck.pc.company.Employee where firstname == :empName";
private static final String SINGLE_STRING_QUERY_14 =
"select unique salary from org.apache.jdo.tck.pc.company.FullTimeEmployee "
+ "where firstname == :empName";
private static final String SINGLE_STRING_QUERY_15 =
"select into org.apache.jdo.tck.query.api.SampleQueries$EmpWrapper "
+ "from org.apache.jdo.tck.pc.company.FullTimeEmployee where salary > :sal";
private static final String SINGLE_STRING_QUERY_16 =
"select into org.apache.jdo.tck.query.api.SampleQueries$EmpInfo "
+ "from org.apache.jdo.tck.pc.company.FullTimeEmployee where salary > :sal";
private static final String SINGLE_STRING_QUERY_17 =
"select e.firstname from org.apache.jdo.tck.pc.company.Department "
+ "where name.startsWith('R&D') && employees.contains(e) "
+ "variables org.apache.jdo.tck.pc.company.Employee e";
private static final String SINGLE_STRING_QUERY_18 =
"select firstname from org.apache.jdo.tck.pc.company.Employee "
+ "where this.weeklyhours > (select avg(e.weeklyhours) from org.apache.jdo.tck.pc.company.Employee e)";
private static final String SINGLE_STRING_QUERY_19 =
"select firstname from org.apache.jdo.tck.pc.company.Employee "
+ "where this.weeklyhours > "
+ " (select AVG(e.weeklyhours) from this.department.employees e where e.manager == this.manager)";
/**
* Basic query.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the constant 30000. Note that the float value for salary is unwrapped for the
* comparison with the literal int value, which is promoted to float using numeric promotion. If
* the value for the salary field in a candidate instance isnull, then it cannot be unwrapped for
* the comparison, and the candidate instance is rejected.
*/
@SuppressWarnings("unchecked")
public void testQuery01a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1", "emp2", "emp5");
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class, "salary > 30000")) {
List<FullTimeEmployee> emps = (List<FullTimeEmployee>) q.execute();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_01, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Basic query.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the constant 30000. Note that the float value for salary is unwrapped for the
* comparison with the literal int value, which is promoted to float using numeric promotion. If
* the value for the salary field in a candidate instance isnull, then it cannot be unwrapped for
* the comparison, and the candidate instance is rejected.
*/
public void testQuery01b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1", "emp2", "emp5");
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class, "salary > 30000")) {
List<FullTimeEmployee> emps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_01, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Basic query.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the constant 30000. Note that the float value for salary is unwrapped for the
* comparison with the literal int value, which is promoted to float using numeric promotion. If
* the value for the salary field in a candidate instance isnull, then it cannot be unwrapped for
* the comparison, and the candidate instance is rejected.
*/
@SuppressWarnings("unchecked")
public void testQuery01d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1", "emp2", "emp5");
try (Query<FullTimeEmployee> q = pm.newQuery(SINGLE_STRING_QUERY_01)) {
List<FullTimeEmployee> emps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_01, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Basic query.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the constant 30000. Note that the float value for salary is unwrapped for the
* comparison with the literal int value, which is promoted to float using numeric promotion. If
* the value for the salary field in a candidate instance isnull, then it cannot be unwrapped for
* the comparison, and the candidate instance is rejected.
*/
public void testQuery01f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1", "emp2", "emp5");
try (JDOQLTypedQuery<FullTimeEmployee> q = pm.newJDOQLTypedQuery(FullTimeEmployee.class)) {
QFullTimeEmployee cand = QFullTimeEmployee.candidate();
q.filter(cand.salary.gt(30000.));
List<FullTimeEmployee> emps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_01, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Basic query with ordering.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the constant 30000, and returns a Collection ordered based on employee salary.
*/
@SuppressWarnings("unchecked")
public void testQuery02a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1", "emp5", "emp2");
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class, "salary > 30000")) {
q.setOrdering("salary ascending");
List<FullTimeEmployee> emps = (List<FullTimeEmployee>) q.execute();
checkQueryResultWithOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_02, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Basic query with ordering.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the constant 30000, and returns a Collection ordered based on employee salary.
*/
public void testQuery02b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1", "emp5", "emp2");
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class, "salary > 30000")) {
q.setOrdering("salary ascending");
List<FullTimeEmployee> emps = q.executeList();
checkQueryResultWithOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_02, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Basic query with ordering.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the constant 30000, and returns a Collection ordered based on employee salary.
*/
@SuppressWarnings("unchecked")
public void testQuery02d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1", "emp5", "emp2");
try (Query<FullTimeEmployee> q = pm.newQuery(SINGLE_STRING_QUERY_02)) {
List<FullTimeEmployee> emps = q.executeList();
checkQueryResultWithOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_02, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Basic query with ordering.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the constant 30000, and returns a Collection ordered based on employee salary.
*/
public void testQuery02f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1", "emp5", "emp2");
try (JDOQLTypedQuery<FullTimeEmployee> q = pm.newJDOQLTypedQuery(FullTimeEmployee.class)) {
QFullTimeEmployee cand = QFullTimeEmployee.candidate();
q.filter(cand.salary.gt(30000.)).orderBy(cand.salary.asc());
List<FullTimeEmployee> emps = q.executeList();
checkQueryResultWithOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_02, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Parameter passing.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the value passed as a parameter and the name starts with the value passed as a
* second parameter. If the value for the salary field in a candidate instance is null, then it
* cannot be unwrapped for the comparison, and the candidate instance is rejected.
*/
@SuppressWarnings("unchecked")
public void testQuery03a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1");
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "salary > sal && firstname.startsWith(begin)")) {
q.declareParameters("Double sal, String begin");
List<FullTimeEmployee> emps = (List<FullTimeEmployee>) q.execute(30000., "M");
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_03, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Parameter passing.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the value passed as a parameter and the name starts with the value passed as a
* second parameter. If the value for the salary field in a candidate instance is null, then it
* cannot be unwrapped for the comparison, and the candidate instance is rejected.
*/
public void testQuery03b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1");
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "salary > sal && firstname.startsWith(begin)")) {
q.declareParameters("Double sal, String begin");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("sal", 30000.);
paramValues.put("begin", "M");
q.setNamedParameters(paramValues);
List<FullTimeEmployee> emps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_03, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Parameter passing.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the value passed as a parameter and the name starts with the value passed as a
* second parameter. If the value for the salary field in a candidate instance is null, then it
* cannot be unwrapped for the comparison, and the candidate instance is rejected.
*/
public void testQuery03c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1");
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "salary > sal && firstname.startsWith(begin)")) {
q.declareParameters("Double sal, String begin");
q.setParameters(30000., "M");
List<FullTimeEmployee> emps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_03, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Parameter passing.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the value passed as a parameter and the name starts with the value passed as a
* second parameter. If the value for the salary field in a candidate instance is null, then it
* cannot be unwrapped for the comparison, and the candidate instance is rejected.
*/
@SuppressWarnings("unchecked")
public void testQuery03d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1");
try (Query<FullTimeEmployee> q = pm.newQuery(SINGLE_STRING_QUERY_03)) {
List<FullTimeEmployee> emps = (List<FullTimeEmployee>) q.execute(30000., "M");
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_03, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Parameter passing.
*
* <p>This query selects all Employee instances from the candidate collection where the salary is
* greater than the value passed as a parameter and the name starts with the value passed as a
* second parameter. If the value for the salary field in a candidate instance is null, then it
* cannot be unwrapped for the comparison, and the candidate instance is rejected.
*/
public void testQuery03f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<FullTimeEmployee> expected =
getTransientCompanyModelInstancesAsList(FullTimeEmployee.class, "emp1");
try (JDOQLTypedQuery<FullTimeEmployee> q = pm.newJDOQLTypedQuery(FullTimeEmployee.class)) {
QFullTimeEmployee cand = QFullTimeEmployee.candidate();
NumericExpression<Double> sal = q.numericParameter("sal", Double.class);
StringExpression begin = q.stringParameter("begin");
q.filter(cand.salary.gt(sal).and(cand.firstname.startsWith(begin)));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("sal", 30000.);
paramValues.put("begin", "M");
q.setParameters(paramValues);
List<FullTimeEmployee> emps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_03, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Navigation through single-valued field.
*
* <p>This query selects all Employee instances from the candidate collection where the value of
* the name field in the Department instance associated with the Employee instance is equal to the
* value passed as a parameter. If the value for the dept field in a candidate instance is null,
* then it cannot be navigated for the comparison, and the candidate instance is rejected.
*/
@SuppressWarnings("unchecked")
public void testQuery04a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Employee> expected =
getTransientCompanyModelInstancesAsList(Employee.class, "emp1", "emp2", "emp3");
try (Query<Employee> q = pm.newQuery(Employee.class, "department.name == dep")) {
q.declareParameters("String dep");
List<Employee> emps = (List<Employee>) q.execute("R&D");
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_04, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Navigation through single-valued field.
*
* <p>This query selects all Employee instances from the candidate collection where the value of
* the name field in the Department instance associated with the Employee instance is equal to the
* value passed as a parameter. If the value for the dept field in a candidate instance is null,
* then it cannot be navigated for the comparison, and the candidate instance is rejected.
*/
public void testQuery04b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Employee> expected =
getTransientCompanyModelInstancesAsList(Employee.class, "emp1", "emp2", "emp3");
try (Query<Employee> q = pm.newQuery(Employee.class, "department.name == dep")) {
q.declareParameters("String dep");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("dep", "R&D");
q.setNamedParameters(paramValues);
List<Employee> emps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_04, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Navigation through single-valued field.
*
* <p>This query selects all Employee instances from the candidate collection where the value of
* the name field in the Department instance associated with the Employee instance is equal to the
* value passed as a parameter. If the value for the dept field in a candidate instance is null,
* then it cannot be navigated for the comparison, and the candidate instance is rejected.
*/
public void testQuery04c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Employee> expected =
getTransientCompanyModelInstancesAsList(Employee.class, "emp1", "emp2", "emp3");
try (Query<Employee> q = pm.newQuery(Employee.class, "department.name == dep")) {
q.declareParameters("String dep");
q.setParameters("R&D");
List<Employee> emps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_04, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Navigation through single-valued field.
*
* <p>This query selects all Employee instances from the candidate collection where the value of
* the name field in the Department instance associated with the Employee instance is equal to the
* value passed as a parameter. If the value for the dept field in a candidate instance is null,
* then it cannot be navigated for the comparison, and the candidate instance is rejected.
*/
@SuppressWarnings("unchecked")
public void testQuery04d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Employee> expected =
getTransientCompanyModelInstancesAsList(Employee.class, "emp1", "emp2", "emp3");
try (Query<Employee> q = pm.newQuery(SINGLE_STRING_QUERY_04)) {
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("dep", "R&D");
q.setNamedParameters(paramValues);
List<Employee> emps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_04, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Navigation through single-valued field.
*
* <p>This query selects all Employee instances from the candidate collection where the value of
* the name field in the Department instance associated with the Employee instance is equal to the
* value passed as a parameter. If the value for the dept field in a candidate instance is null,
* then it cannot be navigated for the comparison, and the candidate instance is rejected.
*/
public void testQuery04f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Employee> expected =
getTransientCompanyModelInstancesAsList(Employee.class, "emp1", "emp2", "emp3");
try (JDOQLTypedQuery<Employee> q = pm.newJDOQLTypedQuery(Employee.class)) {
QEmployee cand = QEmployee.candidate();
StringExpression dep = q.stringParameter("dep");
q.filter(cand.department.name.eq(dep));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("dep", "R&D");
q.setParameters(paramValues);
List<Employee> emps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_04, emps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Navigation through multi-valued field.
*
* <p>This query selects all Department instances from the candidate collection where the
* collection of Employee instances contains at least one Employee instance having a salary
* greater than the value passed as a parameter.
*/
@SuppressWarnings("unchecked")
public void testQuery05a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Department> expected =
getTransientCompanyModelInstancesAsList(Department.class, "dept1");
try (Query<Department> q =
pm.newQuery(Department.class, "employees.contains (emp) && emp.weeklyhours > hours")) {
q.declareVariables("Employee emp");
q.declareParameters("double hours");
List<Department> deps = (List<Department>) q.execute(30.);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_05, deps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Navigation through multi-valued field.
*
* <p>This query selects all Department instances from the candidate collection where the
* collection of Employee instances contains at least one Employee instance having a salary
* greater than the value passed as a parameter.
*/
public void testQuery05b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Department> expected =
getTransientCompanyModelInstancesAsList(Department.class, "dept1");
try (Query<Department> q =
pm.newQuery(Department.class, "employees.contains (emp) && emp.weeklyhours > hours")) {
q.declareVariables("Employee emp");
q.declareParameters("double hours");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("hours", 30.);
q.setNamedParameters(paramValues);
List<Department> deps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_05, deps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Navigation through multi-valued field.
*
* <p>This query selects all Department instances from the candidate collection where the
* collection of Employee instances contains at least one Employee instance having a salary
* greater than the value passed as a parameter.
*/
public void testQuery05c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Department> expected =
getTransientCompanyModelInstancesAsList(Department.class, "dept1");
try (Query<Department> q =
pm.newQuery(Department.class, "employees.contains (emp) && emp.weeklyhours > hours")) {
q.declareVariables("Employee emp");
q.declareParameters("double hours");
q.setParameters(30.);
List<Department> deps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_05, deps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Navigation through multi-valued field.
*
* <p>This query selects all Department instances from the candidate collection where the
* collection of Employee instances contains at least one Employee instance having a salary
* greater than the value passed as a parameter.
*/
@SuppressWarnings("unchecked")
public void testQuery05d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Department> expected =
getTransientCompanyModelInstancesAsList(Department.class, "dept1");
try (Query<Department> q = pm.newQuery(SINGLE_STRING_QUERY_05)) {
List<Department> deps = (List<Department>) q.execute(30.);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_05, deps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Navigation through multi-valued field.
*
* <p>This query selects all Department instances from the candidate collection where the
* collection of Employee instances contains at least one Employee instance having a salary
* greater than the value passed as a parameter.
*/
@SuppressWarnings("unchecked")
public void testQuery05f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Department> expected =
getTransientCompanyModelInstancesAsList(Department.class, "dept1");
try (JDOQLTypedQuery<Department> q = pm.newJDOQLTypedQuery(Department.class)) {
QDepartment cand = QDepartment.candidate();
QEmployee emp = QEmployee.variable("emp");
NumericExpression<Double> hours = q.numericParameter("hours", double.class);
q.filter(cand.employees.contains(emp).and(emp.weeklyhours.gt(hours)));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("hours", 30.);
q.setParameters(paramValues);
List<Department> deps = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_05, deps, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Membership in a collection.
*
* <p>This query selects all Department instances where the name field is contained in a parameter
* collection, which in this example consists of three department names.
*/
@SuppressWarnings("unchecked")
public void testQuery06a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Department> expected =
getTransientCompanyModelInstancesAsList(Department.class, "dept1", "dept2", "dept3");
try (Query<Department> q = pm.newQuery(Department.class, "depts.contains(name)")) {
q.declareParameters("java.util.Collection depts");
List<String> deptNames = Arrays.asList("R&D", "Sales", "Marketing");
List<Department> result = (List<Department>) q.execute(deptNames);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_06, result, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Membership in a collection.
*
* <p>This query selects all Department instances where the name field is contained in a parameter
* collection, which in this example consists of three department names.
*/
public void testQuery06b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Department> expected =
getTransientCompanyModelInstancesAsList(Department.class, "dept1", "dept2", "dept3");
try (Query<Department> q = pm.newQuery(Department.class, "depts.contains(name)")) {
q.declareParameters("java.util.Collection depts");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("depts", Arrays.asList("R&D", "Sales", "Marketing"));
q.setNamedParameters(paramValues);
List<Department> result = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_06, result, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Membership in a collection.
*
* <p>This query selects all Department instances where the name field is contained in a parameter
* collection, which in this example consists of three department names.
*/
public void testQuery06c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Department> expected =
getTransientCompanyModelInstancesAsList(Department.class, "dept1", "dept2", "dept3");
try (Query<Department> q = pm.newQuery(Department.class, "depts.contains(name)")) {
q.declareParameters("java.util.Collection depts");
q.setParameters(Arrays.asList("R&D", "Sales", "Marketing"));
List<Department> result = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_06, result, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Membership in a collection.
*
* <p>This query selects all Department instances where the name field is contained in a parameter
* collection, which in this example consists of three department names.
*/
@SuppressWarnings("unchecked")
public void testQuery06d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Department> expected =
getTransientCompanyModelInstancesAsList(Department.class, "dept1", "dept2", "dept3");
try (Query<Department> q = pm.newQuery(SINGLE_STRING_QUERY_06)) {
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("depts", Arrays.asList("R&D", "Sales", "Marketing"));
q.setNamedParameters(paramValues);
List<Department> result = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_06, result, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Membership in a collection.
*
* <p>This query selects all Department instances where the name field is contained in a parameter
* collection, which in this example consists of three department names.
*/
public void testQuery06f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Department> expected =
getTransientCompanyModelInstancesAsList(Department.class, "dept1", "dept2", "dept3");
try (JDOQLTypedQuery<Department> q = pm.newJDOQLTypedQuery(Department.class)) {
QDepartment cand = QDepartment.candidate();
CollectionExpression<Collection<String>, String> depts =
q.collectionParameter("depts", String.class);
q.filter(depts.contains(cand.name));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("depts", Arrays.asList("R&D", "Sales", "Marketing"));
q.setParameters(paramValues);
List<Department> result = q.executeList();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_06, result, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of a Single Field.
*
* <p>This query selects names of all Employees who work in the parameter department.
*/
@SuppressWarnings("unchecked")
public void testQuery07a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Joe", "Craig", "Michael");
try (Query<Employee> q = pm.newQuery(Employee.class, "department.name == deptName")) {
q.setResult("firstname");
q.declareParameters("String deptName");
List<String> names = (List<String>) q.execute("R&D");
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_07, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of a Single Field.
*
* <p>This query selects names of all Employees who work in the parameter department.
*/
public void testQuery07b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Joe", "Craig", "Michael");
try (Query<Employee> q = pm.newQuery(Employee.class, "department.name == deptName")) {
q.setResult("firstname");
q.declareParameters("String deptName");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("deptName", "R&D");
q.setNamedParameters(paramValues);
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_07, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of a Single Field.
*
* <p>This query selects names of all Employees who work in the parameter department.
*/
public void testQuery07c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Joe", "Craig", "Michael");
try (Query<Employee> q = pm.newQuery(Employee.class, "department.name == deptName")) {
q.setResult("firstname");
q.declareParameters("String deptName");
q.setParameters("R&D");
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_07, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of a Single Field.
*
* <p>This query selects names of all Employees who work in the parameter department.
*/
@SuppressWarnings("unchecked")
public void testQuery07d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Joe", "Craig", "Michael");
try (Query<Employee> q = pm.newQuery(SINGLE_STRING_QUERY_07)) {
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("deptName", "R&D");
q.setNamedParameters(paramValues);
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_07, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of a Single Field.
*
* <p>This query selects names of all Employees who work in the parameter department.
*/
public void testQuery07f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Joe", "Craig", "Michael");
try (JDOQLTypedQuery<Employee> q = pm.newJDOQLTypedQuery(Employee.class)) {
QEmployee cand = QEmployee.candidate();
StringExpression deptName = q.stringParameter("deptName");
q.filter(cand.department.name.eq(deptName)).result(false, cand.firstname);
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("deptName", "R&D");
q.setParameters(paramValues);
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_07, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of Multiple Fields and Expressions.
*
* <p>This query selects names, salaries, and bosses of Employees who work in the parameter
* department.
*/
@SuppressWarnings("unchecked")
public void testQuery08a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<SampleQueries.Info> expected = testQuery08Helper();
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult("firstname, salary, manager as reportsTo");
q.setResultClass(Info.class);
q.declareParameters("String deptName");
List<Info> infos = (List<Info>) q.execute("R&D");
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_08, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of Multiple Fields and Expressions.
*
* <p>This query selects names, salaries, and bosses of Employees who work in the parameter
* department.
*/
public void testQuery08b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Info> expected = testQuery08Helper();
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult("firstname, salary, manager as reportsTo");
q.setResultClass(Info.class);
q.declareParameters("String deptName");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("deptName", "R&D");
q.setNamedParameters(paramValues);
List<Info> infos = q.executeResultList(Info.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_08, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of Multiple Fields and Expressions.
*
* <p>This query selects names, salaries, and bosses of Employees who work in the parameter
* department.
*/
public void testQuery08c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Info> expected = testQuery08Helper();
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult("firstname, salary, manager as reportsTo");
q.setResultClass(Info.class);
q.declareParameters("String deptName");
q.setParameters("R&D");
List<Info> infos = q.executeResultList(Info.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_08, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of Multiple Fields and Expressions.
*
* <p>This query selects names, salaries, and bosses of Employees who work in the parameter
* department.
*/
@SuppressWarnings("unchecked")
public void testQuery08d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Info> expected = testQuery08Helper();
try (Query<FullTimeEmployee> q = pm.newQuery(SINGLE_STRING_QUERY_08)) {
q.setParameters("R&D");
List<Info> infos = q.executeResultList(Info.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_08, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of Multiple Fields and Expressions.
*
* <p>This query selects names, salaries, and bosses of Employees who work in the parameter
* department.
*/
public void testQuery08f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Info> expected = testQuery08Helper();
try (JDOQLTypedQuery<FullTimeEmployee> q = pm.newJDOQLTypedQuery(FullTimeEmployee.class)) {
QFullTimeEmployee cand = QFullTimeEmployee.candidate();
StringExpression deptName = q.stringParameter("deptName");
q.result(false, cand.firstname, cand.salary, cand.manager.as("reportsTo"))
.filter(cand.department.name.eq(deptName));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("deptName", "R&D");
q.setParameters(paramValues);
List<Info> infos = q.executeResultList(Info.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_08, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of Multiple Fields and Expressions into a Constructed instance.
*
* <p>This query selects names, salaries, and bosses of Employees who work in the parameter
* department, and uses the constructor for the result class.
*/
@SuppressWarnings("unchecked")
public void testQuery09a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Info> expected =
Arrays.asList(
new Info("Michael", 40000., getTransientCompanyModelInstance(Employee.class, "emp2")),
new Info("Craig", 50000., null));
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult(
"new org.apache.jdo.tck.query.api.SampleQueries$Info(firstname, salary, manager)");
q.declareParameters("String deptName");
List<Info> infos = (List<Info>) q.execute("R&D");
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_09, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of Multiple Fields and Expressions into a Constructed instance.
*
* <p>This query selects names, salaries, and bosses of Employees who work in the parameter
* department, and uses the constructor for the result class.
*/
public void testQuery09b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Info> expected =
Arrays.asList(
new Info("Michael", 40000., getTransientCompanyModelInstance(Employee.class, "emp2")),
new Info("Craig", 50000., null));
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult(
"new org.apache.jdo.tck.query.api.SampleQueries$Info(firstname, salary, manager)");
q.declareParameters("String deptName");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("deptName", "R&D");
q.setNamedParameters(paramValues);
List<Info> infos = q.executeResultList(Info.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_09, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of Multiple Fields and Expressions into a Constructed instance.
*
* <p>This query selects names, salaries, and bosses of Employees who work in the parameter
* department, and uses the constructor for the result class.
*/
public void testQuery09c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Info> expected =
Arrays.asList(
new Info("Michael", 40000., getTransientCompanyModelInstance(Employee.class, "emp2")),
new Info("Craig", 50000., null));
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult(
"new org.apache.jdo.tck.query.api.SampleQueries$Info(firstname, salary, manager)");
q.declareParameters("String deptName");
q.setParameters("R&D");
List<Info> infos = q.executeResultList(Info.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_09, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of Multiple Fields and Expressions into a Constructed instance.
*
* <p>This query selects names, salaries, and bosses of Employees who work in the parameter
* department, and uses the constructor for the result class.
*/
@SuppressWarnings("unchecked")
public void testQuery09d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Info> expected =
Arrays.asList(
new Info("Michael", 40000., getTransientCompanyModelInstance(Employee.class, "emp2")),
new Info("Craig", 50000., null));
try (Query<FullTimeEmployee> q = pm.newQuery(SINGLE_STRING_QUERY_09)) {
q.setParameters("R&D");
List<Info> infos = q.executeResultList(Info.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_09, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of Multiple Fields and Expressions into a Constructed instance.
*
* <p>This query selects names, salaries, and bosses of Employees who work in the parameter
* department, and uses the constructor for the result class.
*/
public void testQuery09e() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Info> expected =
Arrays.asList(
new Info("Michael", 40000., getTransientCompanyModelInstance(Employee.class, "emp2")),
new Info("Craig", 50000., null));
try (Query<FullTimeEmployee> q = pm.newNamedQuery(FullTimeEmployee.class, "constructor")) {
q.setParameters("R&D");
List<Info> infos = q.executeResultList(Info.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_09, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of Multiple Fields and Expressions into a Constructed instance.
*
* <p>This query selects names, salaries, and bosses of Employees who work in the parameter
* department, and uses the constructor for the result class.
*/
public void testQuery09f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<Info> expected =
Arrays.asList(
new Info("Michael", 40000., getTransientCompanyModelInstance(Employee.class, "emp2")),
new Info("Craig", 50000., null));
try (JDOQLTypedQuery<FullTimeEmployee> q = pm.newJDOQLTypedQuery(FullTimeEmployee.class)) {
QFullTimeEmployee cand = QFullTimeEmployee.candidate();
StringExpression deptName = q.stringParameter("deptName");
q.result(false, cand.firstname, cand.salary, cand.manager)
.filter(cand.department.name.eq(deptName));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("deptName", "R&D");
q.setParameters(paramValues);
List<Info> infos = q.executeResultList(Info.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_09, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of a single Field.
*
* <p>This query averages the salaries of Employees who work in the parameter department and
* returns a single value.
*/
public void testQuery10a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double expected = 45000.;
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult("avg(salary)");
q.declareParameters("String deptName");
Double avgSalary = (Double) q.execute("R&D");
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_10, avgSalary, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of a single Field.
*
* <p>This query averages the salaries of Employees who work in the parameter department and
* returns a single value.
*/
public void testQuery10b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double expected = 45000.;
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult("avg(salary)");
q.declareParameters("String deptName");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("deptName", "R&D");
q.setNamedParameters(paramValues);
Double avgSalary = q.executeResultUnique(Double.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_10, avgSalary, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of a single Field.
*
* <p>This query averages the salaries of Employees who work in the parameter department and
* returns a single value.
*/
public void testQuery10c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double expected = 45000.;
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult("avg(salary)");
q.declareParameters("String deptName");
q.setParameters("R&D");
Double avgSalary = q.executeResultUnique(Double.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_10, avgSalary, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of a single Field.
*
* <p>This query averages the salaries of Employees who work in the parameter department and
* returns a single value.
*/
@SuppressWarnings("unchecked")
public void testQuery10d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double expected = 45000.;
try (Query<FullTimeEmployee> q = pm.newQuery(SINGLE_STRING_QUERY_10)) {
q.setParameters("R&D");
Double avgSalary = q.executeResultUnique(Double.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_10, avgSalary, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of a single Field.
*
* <p>This query averages the salaries of Employees who work in the parameter department and
* returns a single value.
*/
public void testQuery10f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double expected = 45000.;
try (JDOQLTypedQuery<FullTimeEmployee> q = pm.newJDOQLTypedQuery(FullTimeEmployee.class)) {
QFullTimeEmployee cand = QFullTimeEmployee.candidate();
StringExpression deptName = q.stringParameter("deptName");
q.result(false, cand.salary.avg()).filter(cand.department.name.eq(deptName));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("deptName", "R&D");
q.setParameters(paramValues);
Double avgSalary = q.executeResultUnique(Double.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_10, avgSalary, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of Multiple Fields and Expressions.
*
* <p>This query averages and sums the salaries of Employees who work in the parameter department.
*/
public void testQuery11a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double[] expected = new Double[] {45000., 90000.};
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult("avg(salary), sum(salary)");
q.declareParameters("String deptName");
Object[] avgSum = (Object[]) q.execute("R&D");
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_11, avgSum, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of Multiple Fields and Expressions.
*
* <p>This query averages and sums the salaries of Employees who work in the parameter department.
*/
public void testQuery11b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double[] expected = new Double[] {45000., 90000.};
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult("avg(salary), sum(salary)");
q.declareParameters("String deptName");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("deptName", "R&D");
q.setNamedParameters(paramValues);
Object[] avgSum = q.executeResultUnique(Object[].class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_11, avgSum, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of Multiple Fields and Expressions.
*
* <p>This query averages and sums the salaries of Employees who work in the parameter department.
*/
public void testQuery11c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double[] expected = new Double[] {45000., 90000.};
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "department.name == deptName")) {
q.setResult("avg(salary), sum(salary)");
q.declareParameters("String deptName");
q.setParameters("R&D");
Object[] avgSum = q.executeResultUnique(Object[].class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_11, avgSum, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of Multiple Fields and Expressions.
*
* <p>This query averages and sums the salaries of Employees who work in the parameter department.
*/
@SuppressWarnings("unchecked")
public void testQuery11d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double[] expected = new Double[] {45000., 90000.};
try (Query<FullTimeEmployee> q = pm.newQuery(SINGLE_STRING_QUERY_11)) {
q.setParameters("R&D");
Object[] avgSum = q.executeResultUnique(Object[].class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_11, avgSum, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of Multiple Fields and Expressions.
*
* <p>This query averages and sums the salaries of Employees who work in the parameter department.
*/
public void testQuery11f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double[] expected = new Double[] {45000., 90000.};
try (JDOQLTypedQuery<FullTimeEmployee> q = pm.newJDOQLTypedQuery(FullTimeEmployee.class)) {
QFullTimeEmployee cand = QFullTimeEmployee.candidate();
StringExpression deptName = q.stringParameter("deptName");
q.result(false, cand.salary.avg(), cand.salary.sum())
.filter(cand.department.name.eq(deptName));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("deptName", "R&D");
q.setParameters(paramValues);
Object[] avgSum = q.executeResultUnique(Object[].class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_11, avgSum, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of Multiple fields with Grouping.
*
* <p>This query averages and sums the salaries of Employees who work in all departments having
* more than one employee and aggregates by department name.
*/
@SuppressWarnings("unchecked")
public void testQuery12a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Object[] expectedRow = new Object[] {45000., 90000., "R&D"};
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class)) {
q.setResult("avg(salary), sum(salary), department.name");
q.setGrouping("department.name having count(department.name) > 1");
List<Object[]> results = (List<Object[]>) q.execute();
if (results.size() != 1) {
fail(
ASSERTION_FAILED,
"Query result has size " + results.size() + ", expected query result of size 1");
}
Object[] row = results.get(0);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_12, row, expectedRow);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of Multiple fields with Grouping.
*
* <p>This query averages and sums the salaries of Employees who work in all departments having
* more than one employee and aggregates by department name.
*/
public void testQuery12b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Object[] expectedRow = new Object[] {45000., 90000., "R&D"};
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class)) {
q.setResult("avg(salary), sum(salary), department.name");
q.setGrouping("department.name having count(department.name) > 1");
List<Object[]> results = q.executeResultList(Object[].class);
if (results.size() != 1) {
fail(
ASSERTION_FAILED,
"Query result has size " + results.size() + ", expected query result of size 1");
}
Object[] row = results.get(0);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_12, row, expectedRow);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of Multiple fields with Grouping.
*
* <p>This query averages and sums the salaries of Employees who work in all departments having
* more than one employee and aggregates by department name.
*/
@SuppressWarnings("unchecked")
public void testQuery12d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Object[] expectedRow = new Object[] {45000., 90000., "R&D"};
try (Query<FullTimeEmployee> q = pm.newQuery(SINGLE_STRING_QUERY_12)) {
List<Object[]> results = q.executeResultList(Object[].class);
if (results.size() != 1) {
fail(
ASSERTION_FAILED,
"Query result has size " + results.size() + ", expected query result of size 1");
}
Object[] row = results.get(0);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_12, row, expectedRow);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of Multiple fields with Grouping.
*
* <p>This query averages and sums the salaries of Employees who work in all departments having
* more than one employee and aggregates by department name.
*/
public void testQuery12e() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Object[] expectedRow = new Object[] {45000., 90000., "R&D"};
try (Query<FullTimeEmployee> q = pm.newNamedQuery(FullTimeEmployee.class, "grouping")) {
List<Object[]> results = q.executeResultList(Object[].class);
if (results.size() != 1) {
fail(
ASSERTION_FAILED,
"Query result has size " + results.size() + ", expected query result of size 1");
}
Object[] row = results.get(0);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_12, row, expectedRow);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Aggregation of Multiple fields with Grouping.
*
* <p>This query averages and sums the salaries of Employees who work in all departments having
* more than one employee and aggregates by department name.
*/
public void testQuery12f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Object[] expectedRow = new Object[] {45000., 90000., "R&D"};
try (JDOQLTypedQuery<FullTimeEmployee> q = pm.newJDOQLTypedQuery(FullTimeEmployee.class)) {
QFullTimeEmployee cand = QFullTimeEmployee.candidate();
q.result(false, cand.salary.avg(), cand.salary.sum(), cand.department.name)
.groupBy(cand.department.name)
.having(cand.department.name.count().gt(1L));
List<Object[]> results = q.executeResultList(Object[].class);
if (results.size() != 1) {
fail(
ASSERTION_FAILED,
"Query result has size " + results.size() + ", expected query result of size 1");
}
Object[] row = results.get(0);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_12, row, expectedRow);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Selection of a Single Instance.
*
* <p>This query returns a single instance of Employee.
*/
public void testQuery13a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Employee expectedEmp = getTransientCompanyModelInstance(Employee.class, "emp1");
try (Query<Employee> q = pm.newQuery(Employee.class, "firstname == empName")) {
q.setUnique(true);
q.declareParameters("String empName");
Employee emp = (Employee) q.execute("Michael");
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_13, emp, expectedEmp);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Selection of a Single Instance.
*
* <p>This query returns a single instance of Employee.
*/
public void testQuery13b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Employee expectedEmp = getTransientCompanyModelInstance(Employee.class, "emp1");
try (Query<Employee> q = pm.newQuery(Employee.class, "firstname == empName")) {
q.setUnique(true);
q.declareParameters("String empName");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("empName", "Michael");
q.setNamedParameters(paramValues);
Employee emp = q.executeUnique();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_13, emp, expectedEmp);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Selection of a Single Instance.
*
* <p>This query returns a single instance of Employee.
*/
public void testQuery13c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Employee expectedEmp = getTransientCompanyModelInstance(Employee.class, "emp1");
try (Query<Employee> q = pm.newQuery(Employee.class, "firstname == empName")) {
q.setUnique(true);
q.declareParameters("String empName");
q.setParameters("Michael");
Employee emp = q.executeUnique();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_13, emp, expectedEmp);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Selection of a Single Instance.
*
* <p>This query returns a single instance of Employee.
*/
@SuppressWarnings("unchecked")
public void testQuery13d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Employee expectedEmp = getTransientCompanyModelInstance(Employee.class, "emp1");
try (Query<Employee> q = pm.newQuery(SINGLE_STRING_QUERY_13)) {
q.setParameters("Michael");
Employee emp = q.executeResultUnique(Employee.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_13, emp, expectedEmp);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Selection of a Single Instance.
*
* <p>This query returns a single instance of Employee.
*/
public void testQuery13f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Employee expectedEmp = getTransientCompanyModelInstance(Employee.class, "emp1");
try (JDOQLTypedQuery<Employee> q = pm.newJDOQLTypedQuery(Employee.class)) {
QEmployee cand = QEmployee.candidate();
StringExpression empName = q.stringParameter("empName");
q.filter(cand.firstname.eq(empName));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("empName", "Michael");
q.setParameters(paramValues);
Employee emp = q.executeUnique();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_13, emp, expectedEmp);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Selection of a Single Field.
*
* <p>This query returns a single field of a single Employee.
*/
public void testQuery14a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double expectedSalary = 40000.;
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "firstname == empName")) {
q.setResult("salary");
q.setResultClass(Double.class);
q.setUnique(true);
q.declareParameters("String empName");
Double salary = (Double) q.execute("Michael");
checkQueryResultWithoutOrder(
ASSERTION_FAILED, SINGLE_STRING_QUERY_14, salary, expectedSalary);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Selection of a Single Field.
*
* <p>This query returns a single field of a single Employee.
*/
public void testQuery14b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double expectedSalary = 40000.;
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "firstname == empName")) {
q.setResult("salary");
q.setResultClass(Double.class);
q.declareParameters("String empName");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("empName", "Michael");
q.setNamedParameters(paramValues);
Double salary = q.executeResultUnique(Double.class);
checkQueryResultWithoutOrder(
ASSERTION_FAILED, SINGLE_STRING_QUERY_14, salary, expectedSalary);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Selection of a Single Field.
*
* <p>This query returns a single field of a single Employee.
*/
public void testQuery14c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double expectedSalary = 40000.;
try (Query<FullTimeEmployee> q =
pm.newQuery(FullTimeEmployee.class, "firstname == empName")) {
q.setResult("salary");
q.setResultClass(Double.class);
q.declareParameters("String empName");
q.setParameters("Michael");
Double salary = q.executeResultUnique(Double.class);
checkQueryResultWithoutOrder(
ASSERTION_FAILED, SINGLE_STRING_QUERY_14, salary, expectedSalary);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Selection of a Single Field.
*
* <p>This query returns a single field of a single Employee.
*/
@SuppressWarnings("unchecked")
public void testQuery14d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double expectedSalary = 40000.;
try (Query<FullTimeEmployee> q = pm.newQuery(SINGLE_STRING_QUERY_14)) {
q.setParameters("Michael");
Double salary = q.executeResultUnique(Double.class);
checkQueryResultWithoutOrder(
ASSERTION_FAILED, SINGLE_STRING_QUERY_14, salary, expectedSalary);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Selection of a Single Field.
*
* <p>This query returns a single field of a single Employee.
*/
public void testQuery14f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Double expectedSalary = 40000.;
try (JDOQLTypedQuery<FullTimeEmployee> q = pm.newJDOQLTypedQuery(FullTimeEmployee.class)) {
QFullTimeEmployee cand = QFullTimeEmployee.candidate();
StringExpression empName = q.stringParameter("empName");
q.result(false, cand.salary).filter(cand.firstname.eq(empName));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("empName", "Michael");
q.setParameters(paramValues);
Double salary = q.executeResultUnique(Double.class);
checkQueryResultWithoutOrder(
ASSERTION_FAILED, SINGLE_STRING_QUERY_14, salary, expectedSalary);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of "this" to User-defined Result Class with Matching Field.
*
* <p>This query selects instances of Employee who make more than the parameter salary and stores
* the result in a user-defined class. Since the default is "distinct this as FullTimeEmployee",
* the field must be named FullTimeEmployee and be of type FullTimeEmployee.
*/
@SuppressWarnings("unchecked")
public void testQuery15a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<EmpWrapper> expected = testQuery15Helper();
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class, "salary > sal")) {
q.setResultClass(EmpWrapper.class);
q.declareParameters("Double sal");
List<EmpWrapper> infos = (List<EmpWrapper>) q.execute(30000.);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_15, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of "this" to User-defined Result Class with Matching Field.
*
* <p>This query selects instances of Employee who make more than the parameter salary and stores
* the result in a user-defined class. Since the default is "distinct this as FullTimeEmployee",
* the field must be named FullTimeEmployee and be of type FullTimeEmployee.
*/
public void testQuery15b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<EmpWrapper> expected = testQuery15Helper();
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class, "salary > sal")) {
q.setResultClass(EmpWrapper.class);
q.declareParameters("Double sal");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("sal", 30000.);
q.setNamedParameters(paramValues);
List<EmpWrapper> infos = q.executeResultList(EmpWrapper.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_15, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of "this" to User-defined Result Class with Matching Field.
*
* <p>This query selects instances of Employee who make more than the parameter salary and stores
* the result in a user-defined class. Since the default is "distinct this as FullTimeEmployee",
* the field must be named FullTimeEmployee and be of type FullTimeEmployee.
*/
public void testQuery15c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<EmpWrapper> expected = testQuery15Helper();
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class, "salary > sal")) {
q.setResultClass(EmpWrapper.class);
q.declareParameters("Double sal");
q.setParameters(30000.);
List<EmpWrapper> infos = q.executeResultList(EmpWrapper.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_15, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of "this" to User-defined Result Class with Matching Field.
*
* <p>This query selects instances of Employee who make more than the parameter salary and stores
* the result in a user-defined class. Since the default is "distinct this as FullTimeEmployee",
* the field must be named FullTimeEmployee and be of type FullTimeEmployee.
*/
@SuppressWarnings("unchecked")
public void testQuery15d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<EmpWrapper> expected = testQuery15Helper();
try (Query<FullTimeEmployee> q = pm.newQuery(SINGLE_STRING_QUERY_15)) {
q.setParameters(30000.);
List<EmpWrapper> infos = q.executeResultList(EmpWrapper.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_15, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of "this" to User-defined Result Class with Matching Field.
*
* <p>This query selects instances of Employee who make more than the parameter salary and stores
* the result in a user-defined class. Since the default is "distinct this as FullTimeEmployee",
* the field must be named FullTimeEmployee and be of type FullTimeEmployee.
*/
public void testQuery15f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<EmpWrapper> expected = testQuery15Helper();
try (JDOQLTypedQuery<FullTimeEmployee> q = pm.newJDOQLTypedQuery(FullTimeEmployee.class)) {
QFullTimeEmployee cand = QFullTimeEmployee.candidate();
NumericExpression<Double> sal = q.numericParameter("sal", Double.class);
q.result(true, cand.as("FullTimeEmployee")).filter(cand.salary.gt(sal));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("sal", 30000.);
q.setParameters(paramValues);
List<EmpWrapper> infos = q.executeResultList(EmpWrapper.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_15, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of "this" to User-defined Result Class with Matching Method
*
* <p>This query selects instances of FullTimeEmployee who make more than the parameter salary and
* stores the result in a user-defined class.
*/
@SuppressWarnings("unchecked")
public void testQuery16a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<EmpInfo> expected = testQuery16Helper();
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class, "salary > sal")) {
q.setResultClass(EmpInfo.class);
q.declareParameters("Double sal");
List<EmpInfo> infos = (List<EmpInfo>) q.execute(30000.);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_16, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of "this" to User-defined Result Class with Matching Method
*
* <p>This query selects instances of FullTimeEmployee who make more than the parameter salary and
* stores the result in a user-defined class.
*/
public void testQuery16b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<EmpInfo> expected = testQuery16Helper();
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class, "salary > sal")) {
q.setResultClass(EmpInfo.class);
q.declareParameters("Double sal");
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("sal", 30000.);
q.setNamedParameters(paramValues);
List<EmpInfo> infos = q.executeResultList(EmpInfo.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_16, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of "this" to User-defined Result Class with Matching Method
*
* <p>This query selects instances of FullTimeEmployee who make more than the parameter salary and
* stores the result in a user-defined class.
*/
public void testQuery16c() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<EmpInfo> expected = testQuery16Helper();
try (Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class, "salary > sal")) {
q.setResultClass(EmpInfo.class);
q.declareParameters("Double sal");
q.setParameters(30000.);
List<EmpInfo> infos = q.executeResultList(EmpInfo.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_16, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of "this" to User-defined Result Class with Matching Method
*
* <p>This query selects instances of FullTimeEmployee who make more than the parameter salary and
* stores the result in a user-defined class.
*/
@SuppressWarnings("unchecked")
public void testQuery16d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<EmpInfo> expected = testQuery16Helper();
try (Query<FullTimeEmployee> q = pm.newQuery(SINGLE_STRING_QUERY_16)) {
q.setParameters(30000.);
List<EmpInfo> infos = q.executeResultList(EmpInfo.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_16, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of "this" to User-defined Result Class with Matching Method
*
* <p>This query selects instances of FullTimeEmployee who make more than the parameter salary and
* stores the result in a user-defined class.
*/
public void testQuery16f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<EmpInfo> expected = testQuery16Helper();
try (JDOQLTypedQuery<FullTimeEmployee> q = pm.newJDOQLTypedQuery(FullTimeEmployee.class)) {
QFullTimeEmployee cand = QFullTimeEmployee.candidate();
NumericExpression<Double> sal = q.numericParameter("sal", Double.class);
q.result(true, cand.as("FullTimeEmployee")).filter(cand.salary.gt(sal));
Map<String, Object> paramValues = new HashMap<>();
paramValues.put("sal", 30000.);
q.setParameters(paramValues);
List<EmpInfo> infos = q.executeResultList(EmpInfo.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_16, infos, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of variables.
*
* <p>This query returns the names of all Employees of all "Research" departments.
*/
@SuppressWarnings("unchecked")
public void testQuery17a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael", "Craig", "Joe");
try (Query<Department> q = pm.newQuery(Department.class)) {
q.declareVariables("org.apache.jdo.tck.pc.company.Employee e");
q.setFilter("name.startsWith('R&D') && employees.contains(e)");
q.setResult("e.firstname");
List<String> names = (List<String>) q.execute();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_17, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of variables.
*
* <p>This query returns the names of all Employees of all "Research" departments.
*/
public void testQuery17b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael", "Craig", "Joe");
try (Query<Department> q = pm.newQuery(Department.class)) {
q.declareVariables("org.apache.jdo.tck.pc.company.Employee e");
q.setFilter("name.startsWith('R&D') && employees.contains(e)");
q.setResult("e.firstname");
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_17, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of variables.
*
* <p>This query returns the names of all Employees of all "Research" departments.
*/
@SuppressWarnings("unchecked")
public void testQuery17d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael", "Craig", "Joe");
try (Query<Department> q = pm.newQuery(SINGLE_STRING_QUERY_17)) {
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_17, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of variables.
*
* <p>This query returns the names of all Employees of all "Research" departments.
*/
public void testQuery17e() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael", "Craig", "Joe");
try (Query<Department> q = pm.newNamedQuery(Department.class, "projectingVariables")) {
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_17, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Projection of variables.
*
* <p>This query returns the names of all Employees of all "Research" departments.
*/
@SuppressWarnings("unchecked")
public void testQuery17f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael", "Craig", "Joe");
try (JDOQLTypedQuery<Department> q = pm.newJDOQLTypedQuery(Department.class)) {
QDepartment cand = QDepartment.candidate();
QEmployee e = QEmployee.variable("e");
q.filter(cand.name.startsWith("R&D").and(cand.employees.contains(e)))
.result(false, e.firstname);
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_17, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Non-correlated subquery
*
* <p>This query returns names of employees who work more than the average of all employees.
*/
@SuppressWarnings("unchecked")
public void testQuery18a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael", "Craig");
try (Query<Employee> q = pm.newQuery(Employee.class)) {
Query<Employee> subq = pm.newQuery(Employee.class);
subq.setResult("avg(weeklyhours)");
q.setFilter("this.weeklyhours > average_hours");
q.setResult("this.firstname");
q.addSubquery(subq, "double average_hours", null);
List<String> names = (List<String>) q.execute();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_18, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Non-correlated subquery
*
* <p>This query returns names of employees who work more than the average of all employees.
*/
public void testQuery18b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael", "Craig");
try (Query<Employee> q = pm.newQuery(Employee.class)) {
Query<Employee> subq = pm.newQuery(Employee.class);
subq.setResult("avg(weeklyhours)");
q.setFilter("this.weeklyhours > average_hours");
q.setResult("this.firstname");
q.addSubquery(subq, "double average_hours", null);
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_18, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Non-correlated subquery
*
* <p>This query returns names of employees who work more than the average of all employees.
*/
@SuppressWarnings("unchecked")
public void testQuery18d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael", "Craig");
try (Query<Employee> q = pm.newQuery(SINGLE_STRING_QUERY_18)) {
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_18, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Non-correlated subquery
*
* <p>This query returns names of employees who work more than the average of all employees.
*/
public void testQuery18f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael", "Craig");
try (JDOQLTypedQuery<Employee> q = pm.newJDOQLTypedQuery(Employee.class)) {
QEmployee cand = QEmployee.candidate();
JDOQLTypedSubquery<Employee> subquery = q.subquery("e");
QEmployee candsub = QEmployee.candidate("e");
q.result(false, cand.firstname)
.filter(cand.weeklyhours.gt(subquery.selectUnique(candsub.weeklyhours.avg())));
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_18, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Correlated subquery.
*
* <p>This query returns names of employees who work more than the average of employees in the
* same department having the same manager. The candidate collection of the subquery is the
* collection of employees in the department of the candidate employee and the parameter passed to
* the subquery is the manager of the candidate employee.
*/
@SuppressWarnings("unchecked")
public void testQuery19a() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael");
try (Query<Employee> q = pm.newQuery(Employee.class)) {
Query<Employee> subq = pm.newQuery(Employee.class);
subq.setFilter("this.manager == :manager");
subq.setResult("avg(weeklyhours)");
q.setFilter("this.weeklyhours > average_hours");
q.setResult("firstname");
q.addSubquery(subq, "double average_hours", "this.department.employees", "this.manager");
List<String> names = (List<String>) q.execute();
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_19, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Correlated subquery.
*
* <p>This query returns names of employees who work more than the average of employees in the
* same department having the same manager. The candidate collection of the subquery is the
* collection of employees in the department of the candidate employee and the parameter passed to
* the subquery is the manager of the candidate employee.
*/
public void testQuery19b() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael");
try (Query<Employee> q = pm.newQuery(Employee.class)) {
Query<Employee> subq = pm.newQuery(Employee.class);
subq.setFilter("this.manager == :manager");
subq.setResult("avg(weeklyhours)");
q.setFilter("this.weeklyhours > average_hours");
q.setResult("firstname");
q.addSubquery(subq, "double average_hours", "this.department.employees", "this.manager");
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_19, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Correlated subquery.
*
* <p>This query returns names of employees who work more than the average of employees in the
* same department having the same manager. The candidate collection of the subquery is the
* collection of employees in the department of the candidate employee and the parameter passed to
* the subquery is the manager of the candidate employee.
*/
@SuppressWarnings("unchecked")
public void testQuery19d() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael");
try (Query<Employee> q = pm.newQuery(SINGLE_STRING_QUERY_19)) {
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_19, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Correlated subquery.
*
* <p>This query returns names of employees who work more than the average of employees in the
* same department having the same manager. The candidate collection of the subquery is the
* collection of employees in the department of the candidate employee and the parameter passed to
* the subquery is the manager of the candidate employee.
*/
@SuppressWarnings("unchecked")
public void testQuery19f() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
List<String> expected = Arrays.asList("Michael");
try (JDOQLTypedQuery<Employee> q = pm.newJDOQLTypedQuery(Employee.class)) {
QEmployee cand = QEmployee.candidate();
JDOQLTypedSubquery<Employee> subquery =
q.subquery(cand.department.employees, Employee.class, "e");
QEmployee candsub = QEmployee.candidate("e");
subquery.filter(candsub.manager.eq(cand.manager));
q.result(false, cand.firstname)
.filter(cand.weeklyhours.gt(subquery.selectUnique(candsub.weeklyhours.avg())));
List<String> names = q.executeResultList(String.class);
checkQueryResultWithoutOrder(ASSERTION_FAILED, SINGLE_STRING_QUERY_19, names, expected);
} catch (Exception ex) {
fail(ASSERTION_FAILED, ex.getLocalizedMessage());
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
/**
* Deleting Multiple Instances.
*
* <p>This query deletes all Employees who make more than the parameter salary.
*/
public void testQuery20() {
Transaction tx = pm.currentTransaction();
try {
tx.begin();
Query<FullTimeEmployee> empQuery = pm.newQuery(FullTimeEmployee.class, "personid == 5");
empQuery.setUnique(true);
FullTimeEmployee emp5 = empQuery.executeUnique();
Object emp5Oid = pm.getObjectId(emp5);
Query<FullTimeEmployee> q = pm.newQuery(FullTimeEmployee.class, "salary > sal");
q.declareParameters("Double sal");
q.deletePersistentAll(30000.);
tx.commit();
tx.begin();
Query<FullTimeEmployee> allQuery = pm.newQuery(FullTimeEmployee.class);
List<FullTimeEmployee> allFTE = allQuery.executeList();
if (!allFTE.isEmpty()) {
fail(
ASSERTION_FAILED,
"All FullTimeEmployee instances should have been deleted,"
+ " there are still "
+ allFTE.size()
+ " instances left.");
}
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
private List<Info> testQuery08Helper() {
Info info1 = new Info();
info1.firstname = "Michael";
info1.salary = 40000.;
info1.reportsTo = getTransientCompanyModelInstance(Employee.class, "emp2");
Info info2 = new Info();
info2.firstname = "Craig";
info2.salary = 50000.;
info2.reportsTo = null;
return Arrays.asList(info1, info2);
}
private List<EmpWrapper> testQuery15Helper() {
EmpWrapper wrapper1 = new EmpWrapper();
wrapper1.FullTimeEmployee = getTransientCompanyModelInstance(FullTimeEmployee.class, "emp1");
EmpWrapper wrapper2 = new EmpWrapper();
wrapper2.FullTimeEmployee = getTransientCompanyModelInstance(FullTimeEmployee.class, "emp2");
EmpWrapper wrapper3 = new EmpWrapper();
wrapper3.FullTimeEmployee = getTransientCompanyModelInstance(FullTimeEmployee.class, "emp5");
return Arrays.asList(wrapper1, wrapper2, wrapper3);
}
private List<EmpInfo> testQuery16Helper() {
EmpInfo info1 = new EmpInfo();
info1.setFullTimeEmployee(getTransientCompanyModelInstance(FullTimeEmployee.class, "emp1"));
EmpInfo info2 = new EmpInfo();
info2.setFullTimeEmployee(getTransientCompanyModelInstance(FullTimeEmployee.class, "emp2"));
EmpInfo info3 = new EmpInfo();
info3.setFullTimeEmployee(getTransientCompanyModelInstance(FullTimeEmployee.class, "emp5"));
return Arrays.asList(info1, info2, info3);
}
public static class Info {
public String firstname;
public Double salary;
public Person reportsTo;
public Info() {}
public Info(String firstname, Double salary, Person reportsTo) {
this.firstname = firstname;
this.salary = salary;
this.reportsTo = reportsTo;
}
public boolean equals(Object obj) {
if (!(obj instanceof Info)) {
return false;
}
Info other = (Info) obj;
if (!EqualityHelper.equals(firstname, other.firstname)) {
return false;
}
if (!EqualityHelper.equals(salary, other.salary)) {
return false;
}
if (!EqualityHelper.equals(reportsTo, other.reportsTo)) {
return false;
}
return true;
}
public int hashCode() {
int hashCode = 0;
hashCode += firstname == null ? 0 : firstname.hashCode();
hashCode += salary == null ? 0 : salary.hashCode();
hashCode += reportsTo == null ? 0 : reportsTo.hashCode();
return hashCode;
}
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Info(");
builder.append("firstname:").append(firstname);
builder.append(", salary:").append(salary);
builder.append(", reportsTo:").append(reportsTo == null ? "null" : reportsTo.getFirstname());
builder.append(")");
return builder.toString();
}
}
public static class EmpWrapper {
public FullTimeEmployee FullTimeEmployee;
public EmpWrapper() {}
// Need constructor to prevent
// java.lang.NullPointerException
// at
// org.datanucleus.query.QueryUtils.createResultObjectUsingDefaultConstructorAndSetters(QueryUtils.java:293)
public EmpWrapper(FullTimeEmployee FullTimeEmployee) {
this.FullTimeEmployee = FullTimeEmployee;
}
public boolean equals(Object obj) {
if (!(obj instanceof EmpWrapper)) {
return false;
}
EmpWrapper other = (EmpWrapper) obj;
if (!EqualityHelper.equals(FullTimeEmployee, other.FullTimeEmployee)) {
return false;
}
return true;
}
public int hashCode() {
int hashCode = 0;
hashCode += FullTimeEmployee == null ? 0 : FullTimeEmployee.hashCode();
return hashCode;
}
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("EmpWrapper(");
builder
.append("FullTimeEmployee:")
.append(FullTimeEmployee == null ? "null" : FullTimeEmployee.getFirstname());
builder.append(")");
return builder.toString();
}
}
public static class EmpInfo {
private FullTimeEmployee worker;
public EmpInfo() {}
// Need constructor to prevent
// java.lang.NullPointerException
// at
// org.datanucleus.query.QueryUtils.createResultObjectUsingDefaultConstructorAndSetters(QueryUtils.java:293)
public EmpInfo(FullTimeEmployee worker) {
this.worker = worker;
}
public FullTimeEmployee getWorker() {
return worker;
}
public void setFullTimeEmployee(FullTimeEmployee e) {
worker = e;
}
public boolean equals(Object obj) {
if (!(obj instanceof EmpInfo)) {
return false;
}
EmpInfo other = (EmpInfo) obj;
if (!EqualityHelper.equals(worker, other.worker)) {
return false;
}
return true;
}
public int hashCode() {
int hashCode = 0;
hashCode += worker == null ? 0 : worker.hashCode();
return hashCode;
}
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("EmpInfo(");
builder.append("worker:").append(worker == null ? "null" : worker.getFirstname());
builder.append(")");
return builder.toString();
}
}
/**
* @see org.apache.jdo.tck.JDO_Test#localSetUp()
*/
@Override
protected void localSetUp() {
addTearDownClass(CompanyModelReader.getTearDownClasses());
loadAndPersistCompanyModel(getPM());
}
/**
* Returns the name of the company test data resource.
*
* @return name of the company test data resource.
*/
@Override
protected String getCompanyTestDataResource() {
return SAMPLE_QUERIES_TEST_COMPANY_TESTDATA;
}
}