Author: brazil
Date: Fri Nov 11 08:23:30 2005
New Revision: 332590
URL: http://svn.apache.org/viewcvs?rev=332590&view=rev
Log:
JDO-163: Bug fixes reported by Andy on jdo-dev. Improved equals comparison for object arrays,
floating points, and big devimals.
Added:
incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/ConversionHelper.java
Modified:
incubator/jdo/trunk/tck20/maven.xml
incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/QueryTest.java
incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/api/MetadataSearchOrder.java
incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/api/SingleStringQuery.java
incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/company/Person.jdoquery
incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/company/Person.jdoquery
Modified: incubator/jdo/trunk/tck20/maven.xml
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/maven.xml?rev=332590&r1=332589&r2=332590&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/maven.xml (original)
+++ incubator/jdo/trunk/tck20/maven.xml Fri Nov 11 08:23:30 2005
@@ -399,6 +399,7 @@
<uptodate targetfile="${jdo.tck.enhanced.dir}/${jdo.tck.identitytype}.jar">
<srcfiles dir="${basedir}/test/jdo/${jdo.tck.identitytype}"
includes="org/apache/jdo/tck/**/*.jdo,
+ org/apache/jdo/tck/**/*.jdoquery,
org/apache/jdo/tck/**/jdoTest.properties"/>
<srcfiles dir="${basedir}/test/java"
includes="${jdo.tck.pcclasses.sources},
@@ -413,7 +414,7 @@
<mkdir dir="${jdo.tck.enhanced.dir}/${jdo.tck.identitytype}" />
<copy todir="${jdo.tck.enhanced.dir}/${jdo.tck.identitytype}">
<fileset dir="${basedir}/test/jdo/${jdo.tck.identitytype}"
- includes="**/*.jdo, **/jdoTest.properties"/>
+ includes="**/*.jdo, **/*.jdoquery, **/jdoTest.properties"/>
</copy>
<!-- compile pc and pa classes -->
<javac srcdir="${basedir}/test/java"
@@ -506,7 +507,7 @@
<delete file="${jdo.tck.enhanced.dir}/${jdo.tck.identitytype}.jar"/>
<jar jarfile="${jdo.tck.enhanced.dir}/${jdo.tck.identitytype}.jar">
<fileset dir="${jdo.tck.enhanced.dir}/${jdo.tck.identitytype}"
- includes="**/*.class, **/*.jdo, **/*.orm, **/*.xml, **/jdoTest.properties"/>
+ includes="**/*.class, **/*.jdo, **/*.jdoquery **/*.orm, **/*.xml, **/jdoTest.properties"/>
</jar>
</goal>
Modified: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/QueryTest.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/QueryTest.java?rev=332590&r1=332589&r2=332590&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/QueryTest.java (original)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/QueryTest.java Fri Nov 11
08:23:30 2005
@@ -24,6 +24,7 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import javax.jdo.Extent;
import javax.jdo.JDOFatalInternalException;
@@ -32,6 +33,8 @@
import javax.jdo.Query;
import javax.jdo.Transaction;
+import junit.framework.AssertionFailedError;
+
import org.apache.jdo.tck.JDO_Test;
import org.apache.jdo.tck.pc.company.Company;
import org.apache.jdo.tck.pc.company.CompanyModelReader;
@@ -42,6 +45,8 @@
import org.apache.jdo.tck.pc.mylib.MylibReader;
import org.apache.jdo.tck.pc.mylib.PCPoint;
import org.apache.jdo.tck.pc.mylib.PrimitiveTypes;
+import org.apache.jdo.tck.util.ConversionHelper;
+import org.apache.jdo.tck.util.EqualityHelper;
public abstract class QueryTest extends JDO_Test {
@@ -189,7 +194,8 @@
CompanyModelReader reader = new CompanyModelReader(COMPANY_TESTDATA);
Object[] result = new Object[beanNames.length];
for (int i = 0; i < beanNames.length; i++) {
- result[i] = reader.getBean(beanNames[i]);
+ result[i] = beanNames[i] == null ?
+ null : reader.getBean(beanNames[i]);
}
return result;
}
@@ -345,6 +351,10 @@
}
if (!compareOrderedResults((Collection)result, expected)) {
String lf = System.getProperty("line.separator");
+ result =
+ ConversionHelper.convertObjectArrayElements(result);
+ expected =
+ ConversionHelper.convertsElementsOfTypeObjectArray(expected);
fail(assertion,
"Wrong query result: " + lf +
"query returns: " + result + lf +
@@ -368,11 +378,7 @@
}
Object firstObject = firstIterator.next();
Object secondObject = secondIterator.next();
- if (firstObject == null) {
- if (secondObject != null) {
- return false;
- }
- } else if (!firstObject.equals(secondObject)) {
+ if (!equals(firstObject, secondObject)) {
return false;
}
}
@@ -397,11 +403,14 @@
result.getClass().getName());
}
- if (((Collection)result).size() != expected.size() ||
- !((Collection)result).containsAll(expected)) {
+ if (!equalsCollection((Collection)result, expected)) {
+ result =
+ ConversionHelper.convertObjectArrayElements(result);
+ expected =
+ ConversionHelper.convertsElementsOfTypeObjectArray(expected);
fail(assertion, "Wrong query result" +
- "\nexpected: " + new ArrayList(expected) +
- "\ngot: " + new ArrayList((Collection)result));
+ "\nexpected: " + expected +
+ "\ngot: " + result);
}
}
@@ -411,12 +420,194 @@
Object expected) {
if ((result != null && expected == null) ||
(result == null && expected != null) ||
- (result != null && expected != null && !result.equals(expected)))
{
- String lf = System.getProperty("line.separator");
- fail(assertion, "Wrong query result: " + lf +
- "query returns: " + result + lf +
- "expected result: " + expected);
+ (result != null && expected != null)) {
+ if (!equals(result, expected)) {
+ String lf = System.getProperty("line.separator");
+ result = ConversionHelper.
+ convertObjectArrayElements(result);
+ expected = ConversionHelper.
+ convertObjectArrayElements(expected);
+ fail(assertion, "Wrong query result: " + lf +
+ "query returns: " + result + lf +
+ "expected result: " + expected);
+ }
+ }
+ }
+
+ /**
+ * Returns <code>true</code>
+ * if <code>o1</code> and <code>o2</code> equal.
+ * This method is capable to compare object arrays,
+ * collections of object arrays, maps of object arrays.
+ * This method implements a narrowing in case of floating point values.
+ * In case of big decimals it calls
+ * {@link BigDecimal#compareTo(java.lang.Object)}.
+ * It allows <code>o1</code> and/or <code>o2</code>
+ * to be <code>null</code>.
+ * @param o1 the first object
+ * @param o2 the second object
+ * @return <code>true</code> if <code>o1</code> and <code>o2</code>
equal.
+ */
+ private boolean equals(Object o1, Object o2) {
+ boolean result;
+ if (o1 == o2) {
+ result = true;
+ } if ((o1 instanceof Object[]) && (o2 instanceof Object[])) {
+ result = equalsObjectArray((Object[])o1, (Object[])o2);
+ } else if ((o1 instanceof Collection) && (o2 instanceof Collection)) {
+ result = equalsCollection((Collection)o1, (Collection)o2);
+ } else if ((o1 instanceof Map) && (o2 instanceof Map)) {
+ result = equalsMap((Map)o1, (Map)o2);
+ }else if ((o1 instanceof Float) && (o2 instanceof Float)) {
+ result = closeEnough(((Float)o1).floatValue(),
+ ((Float)o2).floatValue());
+ } else if ((o1 instanceof Double) && (o2 instanceof Double)) {
+ result = closeEnough(((Double)o1).floatValue(),
+ ((Double)o2).floatValue());
+ } else if ((o1 instanceof BigDecimal) && (o2 instanceof BigDecimal)) {
+ result = ((BigDecimal)o1).compareTo(o2) == 0;
+ } else if (o1 != null) {
+ result = o1.equals(o2);
+ } else {
+ // Due to the first if and the last if we have:
+ // o1 == null && o2 != null
+ result = false;
}
+ return result;
+ }
+
+ /**
+ * Returns <code>true</code>
+ * if <code>o1</code> and <code>o2</code> equal.
+ * This method iterates over both object arrays and calls
+ * {@link QueryTest#equals(Object, Object)} passing
+ * corresponding instances.
+ * This method does not allow <code>o1</code> and <code>o2</code>
+ * to be <code>null</code> both.
+ * @param o1 the first object array
+ * @param o2 the second object array
+ * @return <code>true</code> if <code>o1</code> and <code>o2</code>
equal.
+ */
+ private boolean equalsObjectArray(Object[] o1, Object[] o2) {
+ boolean result = true;
+ if (o1.length != o2.length) {
+ result = false;
+ } else {
+ for (int i = 0; i < o1.length; i++ ) {
+ if (!equals(o1[i], o2[i])) {
+ result = false;
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Returns <code>true</code>
+ * if <code>o1</code> and <code>o2</code> equal.
+ * This method iterates over the first collection and
+ * checks if each instance is contained in the second collection
+ * by calling {@link QueryTest#contains(Collection, Object)}.
+ * This method does not allow <code>o1</code> and <code>o2</code>
+ * to be <code>null</code> both.
+ * @param o1 the first collection
+ * @param o2 the second collection
+ * @return <code>true</code> if <code>o1</code> and <code>o2</code>
equal.
+ */
+ private boolean equalsCollection(Collection o1, Collection o2) {
+ boolean result = true;
+ if (o1.size() != o2.size()) {
+ result = false;
+ } else {
+ for (Iterator i = o1.iterator(); i.hasNext(); ) {
+ Object oo1 = i.next();
+ if (!contains(o2, oo1)) {
+ result = false;
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Returns <code>true</code>
+ * if <code>o1</code> and <code>o2</code> equal.
+ * This method checks if the key sets and the value sets of both
+ * maps equal calling
+ * {@link QueryTest#equalsCollection(Collection, Collection).
+ * This method does not allow <code>o1</code> and <code>o2</code>
+ * to be <code>null</code> both.
+ * @param o1 the first map
+ * @param o2 the second map
+ * @return <code>true</code> if <code>o1</code> and <code>o2</code>
equal.
+ */
+ private boolean equalsMap(Map o1, Map o2) {
+ boolean result = true;
+ if (o1.size() != o2.size()) {
+ result = false;
+ } else if (!equalsCollection(o1.keySet(), o2.keySet()) ||
+ !equalsCollection(o1.values(), o2.values())) {
+ result = false;
+ }
+ return result;
+ }
+
+ /**
+ * Returns <code>true</code> if <code>o</code> is contained
+ * in the given collection.
+ * This method iterates the given collection and calls
+ * {@link QueryTest#equals(Object, Object)} for each instance.
+ * @param col the collection
+ * @param o the object
+ * @return <code>true</code> if <code>o</code> is contained
+ * in the given collection.
+ */
+ private boolean contains(Collection col, Object o) {
+ for (Iterator i = col.iterator(); i.hasNext(); ) {
+ if (equals(o, i.next())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** Returns <code>true</code> if the specified float values are close
+ * enough to be considered to be equal for a deep equals
+ * comparison. Floating point values are not exact, so comparing them
+ * using <code>==</code> might not return useful results. This method
+ * checks that both double values are within some percent of each
+ * other.
+ * @param d1 one double to be tested for close enough
+ * @param d2 the other double to be tested for close enough
+ * @return <code>true</code> if the specified values are close enough.
+ */
+ public boolean closeEnough(double d1, double d2) {
+ if (d1 == d2)
+ return true;
+
+ double diff = Math.abs(d1 - d2);
+ return diff < Math.abs((d1 + d2) * EqualityHelper.DOUBLE_EPSILON);
+ }
+
+ /**
+ * Returns <code>true</code> if the specified float values are close
+ * enough to be considered to be equal for a deep equals
+ * comparison. Floating point values are not exact, so comparing them
+ * using <code>==</code> might not return useful results. This method
+ * checks that both float values are within some percent of each
+ * other.
+ * @param f1 one float to be tested for close enough
+ * @param f2 the other float to be tested for close enough
+ * @return <code>true</code> if the specified values are close enough.
+ */
+ public boolean closeEnough(float f1, float f2) {
+ if (f1 == f2)
+ return true;
+
+ float diff = Math.abs(f1 - f2);
+ return diff < Math.abs((f1 + f2) * EqualityHelper.FLOAT_EPSILON);
}
// Debugging helper methods
Modified: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/api/MetadataSearchOrder.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/api/MetadataSearchOrder.java?rev=332590&r1=332589&r2=332590&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/api/MetadataSearchOrder.java
(original)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/api/MetadataSearchOrder.java
Fri Nov 11 08:23:30 2005
@@ -101,11 +101,11 @@
}
/** */
- public void testPackageJDOQuery() {
+ public void testClassJDOQuery() {
int index = 4;
Object[] expectedResultValues =
getCompanyModelInstances(expectedResult[index]);
- executeNamedQuery(Person.class, "packageJDOQuery",
+ executeNamedQuery(Person.class, "classJDOQuery",
false, expectedResultValues);
}
Modified: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/api/SingleStringQuery.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/api/SingleStringQuery.java?rev=332590&r1=332589&r2=332590&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/api/SingleStringQuery.java
(original)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/query/api/SingleStringQuery.java
Fri Nov 11 08:23:30 2005
@@ -58,19 +58,18 @@
" firstname == 'emp1First' " +
"VARIABLES Project project " +
"PARAMETERS BigDecimal limit " +
- "IMPORTS IMPORT org.apache.jdo.tck.query.result.classes.FullName; " +
- " IMPORT org.apache.jdo.tck.pc.company.Person; " +
- " IMPORT org.apache.jdo.tck.pc.company.Project; " +
- " IMPORT java.math.BigDecimal; " +
- "ORDER BY personid ASCENDING" +
+ "IMPORTS import org.apache.jdo.tck.query.result.classes.FullName; " +
+ " import org.apache.jdo.tck.pc.company.Person; " +
+ " import org.apache.jdo.tck.pc.company.Project; " +
+ " import java.math.BigDecimal; " +
"GROUP BY firstname, lastname " +
- "RANGE 0 TO 5";
+ "ORDER BY personid ASCENDING " +
+ "RANGE 0,5";
/** The expected results of valid queries. */
private static Object[][] expectedResult = {
{new FullName("emp1First", "emp1Last")},
- //Note: These are no bean names!
- {"emp1First", "emp2First", "emp5First"}
+ new String[]{"emp1", "emp2", "emp5"}
};
/** Parameters of valid queries. */
@@ -95,8 +94,7 @@
true, true, parameters[index], expectedResult[index]);
index = 1;
- String singleStringQuery =
- "SELECT firstName FROM org.apache.jdo.tck.pc.company.FullTimeEmployee";
+ String singleStringQuery = "SELECT FROM FullTimeEmployee";
query.setUnique(false);
query.setResult(null);
query.setResultClass(null);
@@ -107,9 +105,9 @@
query.declareImports(null);
query.setGrouping(null);
query.setOrdering(null);
- query.setRange(0, 0);
- execute(ASSERTION_FAILED, query, singleStringQuery,
- false, false, parameters[index], expectedResult[index]);
+ query.setRange(null);
+ execute(ASSERTION_FAILED, query, singleStringQuery, false, false, null,
+ getCompanyModelInstances((String[])expectedResult[index]));
}
/**
Added: incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/ConversionHelper.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/ConversionHelper.java?rev=332590&view=auto
==============================================================================
--- incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/ConversionHelper.java (added)
+++ incubator/jdo/trunk/tck20/test/java/org/apache/jdo/tck/util/ConversionHelper.java Fri
Nov 11 08:23:30 2005
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed 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.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+
+import javax.jdo.JDOFatalException;
+
+/**
+ * Provides consersion functionality.
+ */
+public class ConversionHelper {
+
+ /**
+ * Converts the given <code>value</code> to a {@link java.util.Date}.
+ * @param pattern the pattern
+ * @param timezone the timezone
+ * @param locale the locale
+ * @param value the value
+ * @return the date
+ * @throws JDOFatalException if the conversion fails
+ */
+ public static Date toUtilDate(String pattern,
+ String timezone, Locale locale, String value) {
+ SimpleDateFormat formatter = new SimpleDateFormat(pattern, locale);
+ formatter.setTimeZone(TimeZone.getTimeZone(timezone));
+ try {
+ return formatter.parse(value);
+ } catch (ParseException e) {
+ throw new JDOFatalException("", e);
+ }
+ }
+
+ /**
+ * Converts the given array into a {@link Map}.
+ * The first dimension represents the map entries,
+ * the second dimension holds the keys and values, e.g.
+ * { {"key1", "value1"}, {"key2", {"value2"} }.
+ * @param array the array
+ * @return the map
+ */
+ public static Map arrayToMap(Object[][] array) {
+ Map map = new HashMap();
+ for (int i = 0; i < array.length; i++) {
+ map.put(array[i][0], array[i][1]);
+ }
+ return map;
+ }
+
+ /**
+ * Returns a collection containing all elements
+ * in the given <code>collection</code>.
+ * Recursively converts all elements of type <code>Object[]</code>
+ * in the given <code>collection</code> to collections
+ * in the returned collection.
+ * @param collection the collection
+ * @return the converted collection
+ */
+ public static Collection convertsElementsOfTypeObjectArray(Collection collection) {
+ Collection result = new ArrayList();
+ for (Iterator i = collection.iterator(); i.hasNext(); ) {
+ Object current = convertObjectArrayElements(i.next());
+ result.add(current);
+ }
+ return result;
+ }
+
+ /**
+ * Returns a map containing all entries
+ * in the given <code>map</code>.
+ * Recursively converts all entries having keys and/or values
+ * of type <code>Object[]</code> in the given <code>map</code>
to collections
+ * in the returned map.
+ * @param map the map
+ * @return the converted map
+ */
+ public static Map convertsElementsOfTypeObjectArray(Map map) {
+ Map result = new HashMap();
+ for (Iterator i = map.entrySet().iterator(); i.hasNext(); ) {
+ Map.Entry entry = (Map.Entry) i.next();
+ Object key = convertObjectArrayElements(entry.getKey());
+ Object value = convertObjectArrayElements(entry.getValue());
+ result.put(key, value);
+ }
+ return result;
+ }
+
+ /**
+ * Recursively converts all elements of type <code>Object[]</code>
+ * in the given <code>array</code> to collections.
+ * Finally, converts the given <code>array</code> to a collection
+ * and return it.
+ * @param array the array
+ * @return the collection
+ */
+ public static Object convertObjectArrayElements(Object object) {
+ Object result;
+ if (object instanceof Object[]) {
+ result = Arrays.asList(
+ convertObjectArrayElements((Object[])object));
+ } else if (object instanceof Collection) {
+ result = convertsElementsOfTypeObjectArray((Collection)object);
+ } else if (object instanceof Map) {
+ result = convertsElementsOfTypeObjectArray((Map)object);
+ } else {
+ result = object;
+ }
+ return result;
+ }
+
+ /**
+ * Recursively converts all elements of type <code>Object[]</code>
+ * in the given <code>array</code> and retuns that array.
+ * @param array the array
+ * @return the converted array
+ */
+ public static Object[] convertObjectArrayElements(Object[] array) {
+ for (int i = 0; i < array.length; i++ ) {
+ array[i] = convertObjectArrayElements(array[i]);
+ }
+ return array;
+ }
+
+ /**
+ * Converts the given <code>array</code> to a string array.
+ * @param array the object array
+ * @return the string array
+ */
+ public static String[] toStringArray(Object[] array) {
+ String[] result = new String[array.length];
+ System.arraycopy(array, 0, result, 0, result.length);
+ return result;
+ }
+
+}
Modified: incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/company/Person.jdoquery
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/company/Person.jdoquery?rev=332590&r1=332589&r2=332590&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/company/Person.jdoquery
(original)
+++ incubator/jdo/trunk/tck20/test/jdo/applicationidentity/org/apache/jdo/tck/pc/company/Person.jdoquery
Fri Nov 11 08:23:30 2005
@@ -7,7 +7,7 @@
<package name="org.apache.jdo.tck.pc.company">
<class name="Person">
- <query name="packageJDOQuery">
+ <query name="classJDOQuery">
SELECT FROM org.apache.jdo.tck.pc.company.Person
WHERE personid > 3
</query>
Modified: incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/company/Person.jdoquery
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/company/Person.jdoquery?rev=332590&r1=332589&r2=332590&view=diff
==============================================================================
--- incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/company/Person.jdoquery
(original)
+++ incubator/jdo/trunk/tck20/test/jdo/datastoreidentity/org/apache/jdo/tck/pc/company/Person.jdoquery
Fri Nov 11 08:23:30 2005
@@ -7,7 +7,7 @@
<package name="org.apache.jdo.tck.pc.company">
<class name="Person">
- <query name="packageJDOQuery">
+ <query name="classJDOQuery">
SELECT FROM org.apache.jdo.tck.pc.company.Person
WHERE personid > 3
</query>
|