db-jdo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From c..@apache.org
Subject svn commit: r617689 - in /db/jdo/trunk: tck2-legacy/src/java/org/apache/jdo/tck/query/result/ tck2/src/java/org/apache/jdo/tck/query/result/
Date Fri, 01 Feb 2008 22:48:15 GMT
Author: clr
Date: Fri Feb  1 14:48:12 2008
New Revision: 617689

URL: http://svn.apache.org/viewvc?rev=617689&view=rev
Log:
JDO-435 Query with projected variables returns duplicates and extra results that do not satisfy
filter
The failing test methods are removed from VariableInResult which now passes.
The failing test methods are added to VariableInResultNavigation which includes several more
test methods.
The failures in VariableInResultNavigation are due to one of the following bugs:
DERBY-3301
http://www.jpox.org/servlet/jira/browse/RDBMS-45
http://www.jpox.org/servlet/jira/browse/RDBMS-59


Added:
    db/jdo/trunk/tck2-legacy/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java
  (with props)
    db/jdo/trunk/tck2/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java
  (with props)
Modified:
    db/jdo/trunk/tck2-legacy/src/java/org/apache/jdo/tck/query/result/VariableInResult.java
    db/jdo/trunk/tck2/src/java/org/apache/jdo/tck/query/result/VariableInResult.java

Modified: db/jdo/trunk/tck2-legacy/src/java/org/apache/jdo/tck/query/result/VariableInResult.java
URL: http://svn.apache.org/viewvc/db/jdo/trunk/tck2-legacy/src/java/org/apache/jdo/tck/query/result/VariableInResult.java?rev=617689&r1=617688&r2=617689&view=diff
==============================================================================
--- db/jdo/trunk/tck2-legacy/src/java/org/apache/jdo/tck/query/result/VariableInResult.java
(original)
+++ db/jdo/trunk/tck2-legacy/src/java/org/apache/jdo/tck/query/result/VariableInResult.java
Fri Feb  1 14:48:12 2008
@@ -116,35 +116,6 @@
         /*ORDER BY*/    null,
         /*FROM*/        null,
         /*TO*/          null),
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "e, p",
-        /*INTO*/        null, 
-        /*FROM*/        Department.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       "employees.contains(e) && e.projects.contains(p)" +
-                "&& p.name == 'orange'",
-        /*VARIABLES*/   "Employee e; Project p",
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "e, p",
-        /*INTO*/        null, 
-        /*FROM*/        Department.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       "employees.contains(e) && e.projects.contains(p)",
-        /*VARIABLES*/   "Employee e; Project p",
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
         // SELECT e FROM Department WHERE deptid==2 & employees.contains(e) VARIABLES
Employee e 
         new QueryElementHolder(
         /*UNIQUE*/      null,
@@ -186,18 +157,6 @@
             new Object[]{new Long(1), "orange"}}),
         getTransientCompanyModelInstancesAsList(
             new String[]{"emp1","emp2","emp3","emp4","emp5"}),
-        Arrays.asList(new Object[] {
-            new Object[] {emp1, proj1},
-            new Object[] {emp2, proj1},
-            new Object[] {emp3, proj1}}),
-        Arrays.asList(new Object[] {
-            new Object[] {emp1, proj1},
-            new Object[] {emp2, proj1},
-            new Object[] {emp3, proj1},
-            new Object[] {emp2, proj2},
-            new Object[] {emp3, proj2},
-            new Object[] {emp4, proj3},
-            new Object[] {emp5, proj3}}),
         getTransientCompanyModelInstancesAsList(
             new String[]{"emp4","emp5"})
     };
@@ -250,24 +209,6 @@
     /** */
     public void testMultipleProjectionWithConstraints() {
         int index = 4;
-        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                expectedResult[index]);
-        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                expectedResult[index]);
-    }
-
-    /** */
-    public void testMultipleProjection() {
-        int index = 5;
-        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                expectedResult[index]);
-        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                expectedResult[index]);
-    }
-
-    /** */
-    public void testProjectionWithConstraints() {
-        int index = 6;
         executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
                 expectedResult[index]);
         executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 

Added: db/jdo/trunk/tck2-legacy/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java
URL: http://svn.apache.org/viewvc/db/jdo/trunk/tck2-legacy/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java?rev=617689&view=auto
==============================================================================
--- db/jdo/trunk/tck2-legacy/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java
(added)
+++ db/jdo/trunk/tck2-legacy/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java
Fri Feb  1 14:48:12 2008
@@ -0,0 +1,281 @@
+/*
+ * 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
+ * 
+ *     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 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.tck.query.result;
+
+import java.util.Arrays;
+
+import org.apache.jdo.tck.pc.company.CompanyModelReader;
+import org.apache.jdo.tck.pc.company.Company;
+import org.apache.jdo.tck.pc.company.Department;
+import org.apache.jdo.tck.query.QueryElementHolder;
+import org.apache.jdo.tck.query.QueryTest;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+/**
+ *<B>Title:</B> Variable in Result.
+ *<BR>
+ *<B>Keywords:</B> query
+ *<BR>
+ *<B>Assertion ID:</B> A14.6.9-3.
+ *<BR>
+ *<B>Assertion Description: </B>
+ * If a variable or a field of a variable is included in the result, 
+ * either directly or via navigation through the variable, 
+ * then the semantics of the contains clause that include the variable change. 
+ * In this case, all values of the variable 
+ * that satisfy the filter are included in the result.
+ * Result expressions begin with either an instance of the candidate class 
+ * (with an explicit or implicit "this") or an instance of a variable 
+ * (using the variable name). The candidate tuples are the cartesian product 
+ * of the candidate class and all variables used in the result. The result 
+ * tuples are the tuples of the candidate class and all variables used 
+ * in the result that satisfy the filter. 
+ * The result is the collection of result expressions projected from the 
+ * result tuples. 
+ * 
+ * This test differs from VariableInResult by extending the navigation
+ * of variables. It navigates from the candidate Department class to include
+ * fields in the corresponding Company. It navigates from the candidate
+ * Company class to Department, Employee, and Project.
+ */
+public class VariableInResultNavigation extends QueryTest {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A14.6.9-3 (VariableInResult) failed: ";
+    
+    /** 
+     * The array of valid queries which may be executed as 
+     * single string queries and as API queries.
+     */
+    private static final QueryElementHolder[] VALID_QUERIES = {
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Department.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "employees.contains(e) && e.projects.contains(p) &&
p.name == 'orange'",
+        /*VARIABLES*/   "Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Department.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "employees.contains(e) && e.projects.contains(p)",
+        /*VARIABLES*/   "Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "this, e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Department.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "employees.contains(e) && e.projects.contains(p)",
+        /*VARIABLES*/   "Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "this, e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Company.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "name == \"Sun Microsystems, Inc.\" && departments.contains(d)
&& d.employees.contains(e) && e.projects.contains(p)",
+        /*VARIABLES*/   "Department d; Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Department.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "deptid == 1 && employees.contains(e) && e.projects.contains(p)",
+        /*VARIABLES*/   "Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Department.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "company.name == \"Sun Microsystems, Inc.\" && employees.contains(e)
&& e.projects.contains(p)",
+        /*VARIABLES*/   "Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null)
+    };
+    
+    /** 
+     * The expected results of valid queries.
+     */
+    private Object emp1 = getTransientCompanyModelInstance("emp1");
+    private Object emp2 = getTransientCompanyModelInstance("emp2");
+    private Object emp3 = getTransientCompanyModelInstance("emp3");
+    private Object emp4 = getTransientCompanyModelInstance("emp4");
+    private Object emp5 = getTransientCompanyModelInstance("emp5");
+    private Object proj1 = getTransientCompanyModelInstance("proj1");
+    private Object proj2 = getTransientCompanyModelInstance("proj2");
+    private Object proj3 = getTransientCompanyModelInstance("proj3");
+    private Object dept1 = getTransientCompanyModelInstance("dept1");
+    private Object dept2 = getTransientCompanyModelInstance("dept2");
+
+    private Object[] expectedResult = {
+        Arrays.asList(new Object[] {
+            new Object[] {emp1, proj1},
+            new Object[] {emp2, proj1},
+            new Object[] {emp3, proj1}}),
+        Arrays.asList(new Object[] {
+            new Object[] {emp1, proj1},
+            new Object[] {emp2, proj1},
+            new Object[] {emp3, proj1},
+            new Object[] {emp2, proj2},
+            new Object[] {emp3, proj2},
+            new Object[] {emp4, proj3},
+            new Object[] {emp5, proj3}}),
+        Arrays.asList(new Object[] {
+            new Object[] {dept1, emp1, proj1},
+            new Object[] {dept1, emp2, proj1},
+            new Object[] {dept1, emp3, proj1},
+            new Object[] {dept1, emp2, proj2},
+            new Object[] {dept1, emp3, proj2},
+            new Object[] {dept2, emp4, proj3},
+            new Object[] {dept2, emp5, proj3}}),
+        Arrays.asList(new Object[] {
+            new Object[] {dept1, emp1, proj1},
+            new Object[] {dept1, emp2, proj1},
+            new Object[] {dept1, emp3, proj1},
+            new Object[] {dept1, emp2, proj2},
+            new Object[] {dept1, emp3, proj2},
+            new Object[] {dept2, emp4, proj3},
+            new Object[] {dept2, emp5, proj3}}),
+        Arrays.asList(new Object[] {
+            new Object[] {emp1, proj1},
+            new Object[] {emp2, proj1},
+            new Object[] {emp3, proj1},
+            new Object[] {emp2, proj2},
+            new Object[] {emp3, proj2}}),
+        Arrays.asList(new Object[] {
+            new Object[] {emp1, proj1},
+            new Object[] {emp2, proj1},
+            new Object[] {emp3, proj1},
+            new Object[] {emp2, proj2},
+            new Object[] {emp3, proj2},
+            new Object[] {emp4, proj3},
+            new Object[] {emp5, proj3}})
+    };
+
+    /**
+     * 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(VariableInResult.class);
+    }
+    
+    /** */
+    public void testNavigationWithConstraint() {
+        int index = 0;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+
+    /** */
+    public void testNavigationWithoutConstraint() {
+        int index = 1;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+
+    /** */
+    public void testNavigationWithThis() {
+        int index = 2;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+
+    /** */
+    public void testNavigationWithThisAndCompany() {
+        int index = 3;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+
+    /** */
+    public void testNavigationWithThisConstraint() {
+        int index = 4;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+
+    /** */
+    public void testNavigationWithCompanyConstraint() {
+        int index = 5;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+    /**
+     * @see JDO_Test#localSetUp()
+     */
+    protected void localSetUp() {
+        addTearDownClass(CompanyModelReader.getTearDownClasses());
+        loadAndPersistCompanyModel(getPM());
+    }
+}

Propchange: db/jdo/trunk/tck2-legacy/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java
------------------------------------------------------------------------------
    svn:eol-style = LF

Modified: db/jdo/trunk/tck2/src/java/org/apache/jdo/tck/query/result/VariableInResult.java
URL: http://svn.apache.org/viewvc/db/jdo/trunk/tck2/src/java/org/apache/jdo/tck/query/result/VariableInResult.java?rev=617689&r1=617688&r2=617689&view=diff
==============================================================================
--- db/jdo/trunk/tck2/src/java/org/apache/jdo/tck/query/result/VariableInResult.java (original)
+++ db/jdo/trunk/tck2/src/java/org/apache/jdo/tck/query/result/VariableInResult.java Fri Feb
 1 14:48:12 2008
@@ -116,35 +116,6 @@
         /*ORDER BY*/    null,
         /*FROM*/        null,
         /*TO*/          null),
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "e, p",
-        /*INTO*/        null, 
-        /*FROM*/        Department.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       "employees.contains(e) && e.projects.contains(p)" +
-                "&& p.name == 'orange'",
-        /*VARIABLES*/   "Employee e; Project p",
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "e, p",
-        /*INTO*/        null, 
-        /*FROM*/        Department.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       "employees.contains(e) && e.projects.contains(p)",
-        /*VARIABLES*/   "Employee e; Project p",
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
         // SELECT e FROM Department WHERE deptid==2 & employees.contains(e) VARIABLES
Employee e 
         new QueryElementHolder(
         /*UNIQUE*/      null,
@@ -186,18 +157,6 @@
             new Object[]{new Long(1), "orange"}}),
         getTransientCompanyModelInstancesAsList(
             new String[]{"emp1","emp2","emp3","emp4","emp5"}),
-        Arrays.asList(new Object[] {
-            new Object[] {emp1, proj1},
-            new Object[] {emp2, proj1},
-            new Object[] {emp3, proj1}}),
-        Arrays.asList(new Object[] {
-            new Object[] {emp1, proj1},
-            new Object[] {emp2, proj1},
-            new Object[] {emp3, proj1},
-            new Object[] {emp2, proj2},
-            new Object[] {emp3, proj2},
-            new Object[] {emp4, proj3},
-            new Object[] {emp5, proj3}}),
         getTransientCompanyModelInstancesAsList(
             new String[]{"emp4","emp5"})
     };
@@ -250,24 +209,6 @@
     /** */
     public void testMultipleProjectionWithConstraints() {
         int index = 4;
-        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                expectedResult[index]);
-        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                expectedResult[index]);
-    }
-
-    /** */
-    public void testMultipleProjection() {
-        int index = 5;
-        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                expectedResult[index]);
-        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                expectedResult[index]);
-    }
-
-    /** */
-    public void testProjectionWithConstraints() {
-        int index = 6;
         executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
                 expectedResult[index]);
         executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 

Added: db/jdo/trunk/tck2/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java
URL: http://svn.apache.org/viewvc/db/jdo/trunk/tck2/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java?rev=617689&view=auto
==============================================================================
--- db/jdo/trunk/tck2/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java
(added)
+++ db/jdo/trunk/tck2/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java
Fri Feb  1 14:48:12 2008
@@ -0,0 +1,281 @@
+/*
+ * 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
+ * 
+ *     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 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.tck.query.result;
+
+import java.util.Arrays;
+
+import org.apache.jdo.tck.pc.company.CompanyModelReader;
+import org.apache.jdo.tck.pc.company.Company;
+import org.apache.jdo.tck.pc.company.Department;
+import org.apache.jdo.tck.query.QueryElementHolder;
+import org.apache.jdo.tck.query.QueryTest;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+/**
+ *<B>Title:</B> Variable in Result.
+ *<BR>
+ *<B>Keywords:</B> query
+ *<BR>
+ *<B>Assertion ID:</B> A14.6.9-3.
+ *<BR>
+ *<B>Assertion Description: </B>
+ * If a variable or a field of a variable is included in the result, 
+ * either directly or via navigation through the variable, 
+ * then the semantics of the contains clause that include the variable change. 
+ * In this case, all values of the variable 
+ * that satisfy the filter are included in the result.
+ * Result expressions begin with either an instance of the candidate class 
+ * (with an explicit or implicit "this") or an instance of a variable 
+ * (using the variable name). The candidate tuples are the cartesian product 
+ * of the candidate class and all variables used in the result. The result 
+ * tuples are the tuples of the candidate class and all variables used 
+ * in the result that satisfy the filter. 
+ * The result is the collection of result expressions projected from the 
+ * result tuples. 
+ * 
+ * This test differs from VariableInResult by extending the navigation
+ * of variables. It navigates from the candidate Department class to include
+ * fields in the corresponding Company. It navigates from the candidate
+ * Company class to Department, Employee, and Project.
+ */
+public class VariableInResultNavigation extends QueryTest {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A14.6.9-3 (VariableInResult) failed: ";
+    
+    /** 
+     * The array of valid queries which may be executed as 
+     * single string queries and as API queries.
+     */
+    private static final QueryElementHolder[] VALID_QUERIES = {
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Department.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "employees.contains(e) && e.projects.contains(p) &&
p.name == 'orange'",
+        /*VARIABLES*/   "Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Department.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "employees.contains(e) && e.projects.contains(p)",
+        /*VARIABLES*/   "Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "this, e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Department.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "employees.contains(e) && e.projects.contains(p)",
+        /*VARIABLES*/   "Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "this, e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Company.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "name == \"Sun Microsystems, Inc.\" && departments.contains(d)
&& d.employees.contains(e) && e.projects.contains(p)",
+        /*VARIABLES*/   "Department d; Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Department.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "deptid == 1 && employees.contains(e) && e.projects.contains(p)",
+        /*VARIABLES*/   "Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "e, p",
+        /*INTO*/        null, 
+        /*FROM*/        Department.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "company.name == \"Sun Microsystems, Inc.\" && employees.contains(e)
&& e.projects.contains(p)",
+        /*VARIABLES*/   "Employee e; Project p",
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null)
+    };
+    
+    /** 
+     * The expected results of valid queries.
+     */
+    private Object emp1 = getTransientCompanyModelInstance("emp1");
+    private Object emp2 = getTransientCompanyModelInstance("emp2");
+    private Object emp3 = getTransientCompanyModelInstance("emp3");
+    private Object emp4 = getTransientCompanyModelInstance("emp4");
+    private Object emp5 = getTransientCompanyModelInstance("emp5");
+    private Object proj1 = getTransientCompanyModelInstance("proj1");
+    private Object proj2 = getTransientCompanyModelInstance("proj2");
+    private Object proj3 = getTransientCompanyModelInstance("proj3");
+    private Object dept1 = getTransientCompanyModelInstance("dept1");
+    private Object dept2 = getTransientCompanyModelInstance("dept2");
+
+    private Object[] expectedResult = {
+        Arrays.asList(new Object[] {
+            new Object[] {emp1, proj1},
+            new Object[] {emp2, proj1},
+            new Object[] {emp3, proj1}}),
+        Arrays.asList(new Object[] {
+            new Object[] {emp1, proj1},
+            new Object[] {emp2, proj1},
+            new Object[] {emp3, proj1},
+            new Object[] {emp2, proj2},
+            new Object[] {emp3, proj2},
+            new Object[] {emp4, proj3},
+            new Object[] {emp5, proj3}}),
+        Arrays.asList(new Object[] {
+            new Object[] {dept1, emp1, proj1},
+            new Object[] {dept1, emp2, proj1},
+            new Object[] {dept1, emp3, proj1},
+            new Object[] {dept1, emp2, proj2},
+            new Object[] {dept1, emp3, proj2},
+            new Object[] {dept2, emp4, proj3},
+            new Object[] {dept2, emp5, proj3}}),
+        Arrays.asList(new Object[] {
+            new Object[] {dept1, emp1, proj1},
+            new Object[] {dept1, emp2, proj1},
+            new Object[] {dept1, emp3, proj1},
+            new Object[] {dept1, emp2, proj2},
+            new Object[] {dept1, emp3, proj2},
+            new Object[] {dept2, emp4, proj3},
+            new Object[] {dept2, emp5, proj3}}),
+        Arrays.asList(new Object[] {
+            new Object[] {emp1, proj1},
+            new Object[] {emp2, proj1},
+            new Object[] {emp3, proj1},
+            new Object[] {emp2, proj2},
+            new Object[] {emp3, proj2}}),
+        Arrays.asList(new Object[] {
+            new Object[] {emp1, proj1},
+            new Object[] {emp2, proj1},
+            new Object[] {emp3, proj1},
+            new Object[] {emp2, proj2},
+            new Object[] {emp3, proj2},
+            new Object[] {emp4, proj3},
+            new Object[] {emp5, proj3}})
+    };
+
+    /**
+     * 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(VariableInResult.class);
+    }
+    
+    /** */
+    public void testNavigationWithConstraint() {
+        int index = 0;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+
+    /** */
+    public void testNavigationWithoutConstraint() {
+        int index = 1;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+
+    /** */
+    public void testNavigationWithThis() {
+        int index = 2;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+
+    /** */
+    public void testNavigationWithThisAndCompany() {
+        int index = 3;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+
+    /** */
+    public void testNavigationWithThisConstraint() {
+        int index = 4;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+
+    /** */
+    public void testNavigationWithCompanyConstraint() {
+        int index = 5;
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+    /**
+     * @see JDO_Test#localSetUp()
+     */
+    protected void localSetUp() {
+        addTearDownClass(CompanyModelReader.getTearDownClasses());
+        loadAndPersistCompanyModel(getPM());
+    }
+}

Propchange: db/jdo/trunk/tck2/src/java/org/apache/jdo/tck/query/result/VariableInResultNavigation.java
------------------------------------------------------------------------------
    svn:eol-style = LF



Mime
View raw message