You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jdo-commits@db.apache.org by mb...@apache.org on 2005/05/22 20:09:00 UTC

svn commit: r171353 [6/13] - in /incubator/jdo/trunk/query20: ./ src/ src/conf/ src/java/ src/java/org/ src/java/org/apache/ src/java/org/apache/jdo/ src/java/org/apache/jdo/impl/ src/java/org/apache/jdo/impl/jdoql/ src/java/org/apache/jdo/impl/jdoql/jdoqlc/ src/java/org/apache/jdo/impl/jdoql/scope/ src/java/org/apache/jdo/impl/jdoql/tree/ src/java/org/apache/jdo/jdoql/ src/java/org/apache/jdo/jdoql/tree/

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/jdoqlc/VariableChecker.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/jdoqlc/VariableChecker.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/jdoqlc/VariableChecker.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/jdoqlc/VariableChecker.java Sun May 22 11:08:57 2005
@@ -0,0 +1,290 @@
+/*
+ * 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.
+ */
+
+/*
+ * VariableChecker.java
+ *
+ * Created on September 12, 2001
+ */
+
+package org.apache.jdo.impl.jdoql.jdoqlc;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.HashSet;
+
+import javax.jdo.JDOUnsupportedOptionException;
+import javax.jdo.JDOFatalInternalException;
+
+import org.apache.jdo.jdoql.JDOQueryException;
+import org.apache.jdo.util.I18NHelper;
+
+
+/**
+ * Checks variable declarations/application.
+ *
+ * @author  Michael Bouschen
+ * @version 0.1
+ */
+public class VariableChecker
+{
+    /** I18N support */
+    protected final static I18NHelper msg = I18NHelper.getInstance(
+        "org.apache.jdo.impl.jdoql.Bundle", VariableChecker.class.getClassLoader()); //NOI18N
+
+    /**
+     * A VarInfo consists of two info fields:
+     * - constraint: the variable is constraint with the specified expr
+     * - used: the variable is used
+     */
+    static class VarInfo
+    {
+        /**
+         * The constraint expression.
+         */
+        JDOQLAST constraint;
+
+        /**
+         * Set of JDOQLAST nodes denoting an access of this variable.
+         */
+        Set used;
+
+        /**
+         * Dependency for this variable. 
+         * The constraint for this variable may use another variable. 
+         */
+        String dependsOn;
+
+        /**
+         * Flag whether this varInfo is checked already (see checkConstraints)
+         */
+        int status;
+
+        static final int UNCHECKED = 0;
+        static final int IN_PROGRESS = 1;
+        static final int CHECKED = 2;
+
+        VarInfo()
+        {
+            this.constraint = null;
+            this.used = new HashSet();
+            this.dependsOn = null;
+            this.status = UNCHECKED;
+        }
+
+        VarInfo(VarInfo other)
+        {
+            this.constraint = other.constraint;
+            this.used = new HashSet(other.used);
+            this.dependsOn = other.dependsOn;
+            this.status = other.status;
+        }
+    }
+
+    /**
+     * Map of variable infos
+     */
+    protected Map varInfos;
+
+    /**
+     * Create an empty variable table
+     */
+    public VariableChecker()
+    {
+        varInfos = new HashMap();
+    }
+
+    /**
+     * Create a variable table initialized with the entries of the other variable table.
+     * The constructor creates copies of the values stored in the map (instances of class VarInfo).
+     */
+    public VariableChecker(VariableChecker other)
+    {
+        varInfos = new HashMap();
+        for (Iterator i = other.varInfos.entrySet().iterator(); i.hasNext();) {
+            Map.Entry entry = (Map.Entry)i.next();
+            varInfos.put(entry.getKey(), new VarInfo((VarInfo)entry.getValue()));
+        }
+    }
+
+    /**
+     * Creates a new entry in the variable table with the specified name as key and 
+     * an empty value.
+     */
+    public void add(String name)
+    {
+        // init var entry as not constraint and unused
+        varInfos.put(name, new VarInfo());
+    }
+
+    /**
+     * Mark the specified variable as used. 
+     * The method sets the info field of the VarInfo object to true.
+     */
+    public void markUsed(JDOQLAST variable, String dependendVar)
+    {
+        String name = variable.getText();
+        VarInfo entry = (VarInfo)varInfos.get(name);
+        if (entry == null) {
+            throw new JDOFatalInternalException(
+                msg.msg("ERR_VariableCheckerUndefinedVariable", //NOI18N
+                        "markUsed", name)); //NOI18N
+        }
+        entry.used.add(variable);
+        if (dependendVar != null) {
+            VarInfo dependendVarInfo = (VarInfo)varInfos.get(dependendVar);
+            if (dependendVarInfo.dependsOn != null) {
+                throw new JDOFatalInternalException(
+                    msg.msg("ERR_VariableCheckerMultipleDependencies", //NOI18N    
+                            dependendVar, dependendVarInfo.dependsOn, name));
+            }
+            dependendVarInfo.dependsOn = name;
+        }
+    }
+
+    /**
+     * Mark the specified variable as constaint with the specified expr.
+     * The method sets the constraint field of the VarInfo object to true.
+     */
+    public void markConstraint(JDOQLAST variable, JDOQLAST expr)
+    {
+        String name = variable.getText();
+        VarInfo entry = (VarInfo)varInfos.get(name);
+        if (entry == null) {
+            throw new JDOFatalInternalException(
+                msg.msg("ERR_VariableCheckerUndefinedVariable", //NOI18N
+                        "markConstraint", name)); //NOI18N
+        }
+        String old = (entry.constraint==null ? null : entry.constraint.getText());
+        if ((old != null) && !old.equals(expr.getText())) {
+            throw new JDOUnsupportedOptionException(
+                msg.msg("EXC_UnsupportedMultipleConstraints", name)); //NOI18N
+        }
+        entry.constraint = expr;
+    }
+
+    /**
+     * Merges the specified variable table (other) into this variable table.
+     */
+    public void merge(VariableChecker other)
+    {
+        for (Iterator i = varInfos.entrySet().iterator(); i.hasNext();) {
+            Map.Entry entry = (Map.Entry)i.next();
+            String name = (String)entry.getKey();
+            VarInfo info = (VarInfo)entry.getValue();
+            VarInfo otherInfo = (VarInfo)other.varInfos.get(name);
+            
+            // copy other info if this info is empty
+            if ((info.constraint == null) && (info.used.size() == 0)) {
+                info.constraint = otherInfo.constraint;
+                info.used = otherInfo.used;
+                info.dependsOn = otherInfo.dependsOn;
+                info.status = otherInfo.status;
+                continue;
+            }
+
+            // do nothing if otherInfo is empty
+            if ((otherInfo.constraint == null) && (otherInfo.used.size() == 0)) {
+                continue;
+            }
+            
+            // constraint check
+            // If both variables tables include constraints they have to be the same
+            if ((info.constraint != null) && (otherInfo.constraint != null)) {
+                if (!otherInfo.constraint.getText().equals(info.constraint.getText())) {
+                    throw new JDOUnsupportedOptionException(
+                        msg.msg("EXC_DifferentConstraints", name)); //NOI18N
+                }
+            }
+            // If at least one variable table does not define constraint, 
+            // nullify the constaint in this variable table
+            else {
+                info.constraint = null;
+                info.dependsOn = null;
+                info.status = VarInfo.UNCHECKED;
+            }
+            
+            // copy otherInfo.used to this used list
+            info.used.addAll(otherInfo.used);
+        }
+    }
+
+    /**
+     *
+     */
+    public void checkConstraints()
+    {
+        for (Iterator i = varInfos.entrySet().iterator(); i.hasNext();) {
+            Map.Entry entry = (Map.Entry)i.next();
+            VarInfo info = (VarInfo)entry.getValue();
+            checkConstraint((String)entry.getKey(), (VarInfo)entry.getValue());
+        }
+    }
+
+    protected void checkConstraint(String variable, VarInfo info)
+    {
+        switch (info.status) {
+        case VarInfo.UNCHECKED:
+            // if unchecked, start checking
+            info.status = VarInfo.IN_PROGRESS;
+            break;
+        case VarInfo.IN_PROGRESS:
+            // if this VarInfo is currently processed we have a cyclic dependency
+            throw new JDOUnsupportedOptionException(
+                msg.msg("EXC_UnsupportedCyclicConstaint", variable)); // NOI18N
+        case VarInfo.CHECKED:
+            // if alreday checked just return
+            return;
+        }
+        
+        if (info.dependsOn != null) {
+            VarInfo dependendVarInfo = (VarInfo)varInfos.get(info.dependsOn);
+            checkConstraint(info.dependsOn, dependendVarInfo);
+        }
+        
+        if (info.constraint == null) {
+            throw new JDOUnsupportedOptionException(
+                msg.msg("EXC_UnconstraintVariable", variable)); //NOI18N
+        }
+        
+        if (info.used.size() == 0) {
+            throw new JDOUnsupportedOptionException(
+                msg.msg("EXC_UnusedVariable", variable)); //NOI18N
+        }
+        
+        // Next line in comment, because the node visitor for queries in memory
+        // does not like VARIABLE_ACCESS child nodes. 
+        // This needs to be investigated for the SQL generation.
+        //attachConstraintToUsedAST(info);
+        info.status = VarInfo.CHECKED;
+    }
+    
+    /**
+     *
+     */
+    protected void attachConstraintToUsedAST(VarInfo info)
+    {
+        for (Iterator i = info.used.iterator(); i.hasNext();) {
+            JDOQLAST varNode = (JDOQLAST)i.next();
+            if (varNode.getFirstChild() == null) 
+                varNode.setFirstChild(JDOQLASTFactory.getInstance().dupTree(info.constraint));
+        }
+    }
+
+}
+

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/AbstractValueTable.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/AbstractValueTable.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/AbstractValueTable.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/AbstractValueTable.java Sun May 22 11:08:57 2005
@@ -0,0 +1,175 @@
+/*
+ * 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.
+ */
+
+/*
+ * AbstractValueTable.java
+ *
+ * Created on September 11, 2001
+ */
+
+package org.apache.jdo.impl.jdoql.scope;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.io.Serializable;
+
+import javax.jdo.JDOFatalInternalException;
+
+import org.apache.jdo.jdoql.JDOQueryException;
+import org.apache.jdo.jdoql.tree.Declaration;
+import org.apache.jdo.jdoql.tree.ValueTable;
+import org.apache.jdo.util.I18NHelper;
+
+
+/**
+ * This method is the abstract super class for ParameterTable and VariableTable.
+ * It provides common implementation for managing parameter and variable values.
+ *
+ * @author  Michael Bouschen
+ */
+abstract class AbstractValueTable
+    implements ValueTable, Serializable, Cloneable
+{
+    /**
+     * Map of declarations. Key is the the name of the declared identifier, 
+     * value is the Declaration node.
+     */
+    Map declMap = new HashMap();
+    
+    /**
+     * Map of values. This map includes a values entry for each declared 
+     * identifier. Default value is UNDEFINED.
+     */
+    transient Map valueMap;
+    
+    /** I18N support */
+    protected final static I18NHelper msg = I18NHelper.getInstance(
+        "org.apache.jdo.impl.jdoql.Bundle", //NOI18N
+        AbstractValueTable.class.getClassLoader()); 
+ 
+    /**
+     * Adds a new declaration. The value is set to UNDEFINED.
+     * @param decl the declaration node
+     */
+    public void declare(Declaration decl)
+    {
+        String name = decl.getName();
+        declMap.put(name, decl);
+    }
+    
+    /**
+     * This method initializes the map of values for this ValueTable. 
+     * It needs to be called prior to any use of an AbstractValueTable
+     * at query execution time.
+     */
+    public void initValueHandling()
+    {
+        valueMap = new HashMap();
+        for (Iterator i = declMap.keySet().iterator(); i.hasNext();) {
+            String name = (String)i.next();
+            valueMap.put(name, UNDEFINED.getInstance());
+        }
+    }
+
+    /**
+     * Sets the value for the specified identifier.
+     * @param name the name of the identifier
+     * @param value the current value of the identifier
+     */
+    public void setValue(String name, Object value)
+    {
+        if (valueMap == null)
+            throw new JDOFatalInternalException(
+                msg.msg("ERR_InvalidTableForExecution", //NOI18N
+                        this.getClass().getName()));
+        Declaration decl = (Declaration)declMap.get(name);
+        checkDeclaredIdentifier(name, decl);
+        valueMap.put(name, value);
+    }
+    
+    /**
+     * Returns the current value for the specified identifier.
+     * @param name the name of the identifier
+     * @return the current value of the identifier
+     */
+    public Object getValue(String name)
+    {
+        if (valueMap == null)
+            throw new JDOFatalInternalException(
+                msg.msg("ERR_InvalidTableForExecution", //NOI18N
+                        this.getClass().getName()));
+        checkDeclaredIdentifier(name, (Declaration)declMap.get(name));
+        return valueMap.get(name);
+    }
+    
+    /**
+     * Checks whether the type of the specified value is compatible of the type
+     * of the identifier from its declaration.
+     * @param name the name of the identifier
+     * @param value the value to be checked
+     * @return <code>true</code> if the type of the value is compatible with the 
+     * type of the identifier; <code>false</code> otherwise.
+     */
+    public boolean isCompatibleValue(String name, Object value)
+    {
+        Declaration decl = (Declaration)declMap.get(name);
+        checkDeclaredIdentifier(name, decl);
+
+        boolean isCompatible = true;
+
+        // check type compatibility of actual and formal parameter
+        Class formalType = decl.getJavaClass();
+
+        // handle value == null
+        if (value == null) {
+            isCompatible = !formalType.isPrimitive();
+        }
+        else {
+            Class actualType = value.getClass();
+            Class type = formalType;
+            if (formalType.isPrimitive()) {
+                if (formalType == int.class)
+                    type = Integer.class;
+                else if (formalType == long.class)
+                    type = Long.class;
+                else if (formalType == short.class)
+                    type = Short.class;
+                else if (formalType == byte.class)
+                    type = Byte.class;
+                else if (formalType == double.class)
+                    type = Double.class;
+                else if (formalType == float.class)
+                    type = Float.class;
+                else if (formalType == boolean.class)
+                    type = Boolean.class;
+                else if (formalType == char.class)
+                    type = Character.class;
+            }
+            isCompatible = type.isAssignableFrom(actualType);
+        }
+        return isCompatible;
+    }
+ 
+    /**
+     * Internal method to check whether the specified identifier is declared. 
+     * Allows subclasses of AbstractValueTable to use specific error messages.
+     */
+    protected abstract void checkDeclaredIdentifier(String name, 
+                                                    Declaration decl);
+
+}
+

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/ParameterTable.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/ParameterTable.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/ParameterTable.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/ParameterTable.java Sun May 22 11:08:57 2005
@@ -0,0 +1,173 @@
+/*
+ * 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.
+ */
+
+/*
+ * ParameterTable.java
+ *
+ * Created on August 28, 2001
+ */
+
+package org.apache.jdo.impl.jdoql.scope;
+
+import java.util.*;
+
+import javax.jdo.JDOFatalInternalException;
+
+import org.apache.jdo.impl.jdoql.QueryResultHelperImpl;
+import org.apache.jdo.jdoql.JDOQueryException;
+import org.apache.jdo.jdoql.tree.Declaration;
+import org.apache.jdo.pm.PersistenceManagerInternal;
+
+
+/**
+ * The query parameter table.
+ *
+ * @author  Michael Bouschen
+ */
+public class ParameterTable
+    extends AbstractValueTable
+{
+    /**
+     * List of query parameter names. The query parameter tables stores the 
+     * query parameter names in an extra list to presever the order of 
+     * parameter declarations.
+     */
+    List names = new ArrayList();
+
+    /**
+     * Adds a new declaration. The value is initially set to UNDEFINED.
+     * @param decl the declaration node
+     */
+    public void declare(Declaration decl)
+    {
+        super.declare(decl);
+        names.add(decl.getName());
+    }
+    
+    /**
+     * Returns a copy of this ParameterTable.
+     * @return a copy of this ParameterTable.
+     */
+    public ParameterTable getCopy()
+    {
+        try {
+            return (ParameterTable)clone();
+        }
+        catch (CloneNotSupportedException ex) {
+            throw new JDOFatalInternalException(
+                msg.msg("ERR_UnexpectedCloneProblems", ex)); //NOI18N
+        }
+    }
+    
+    /**
+     * Internal method to check whether the specified identifier is declared. 
+     */
+    protected void checkDeclaredIdentifier(String name, Declaration decl)
+    {
+        if (decl == null)
+            throw new JDOQueryException(
+                msg.msg("EXC_UndefinedQueryParameter", name)); //NOI18N
+    }
+
+    //========= PatameterTable convenience methods ==========
+
+    /**
+     * Sets all query parameter values. The order of declarations in 
+     * declareParameters defines the order in the specified array of parameter 
+     * values. The method checks the type compatibility of the query parameter 
+     * values.
+     * @param paramValues the parameter values
+     */
+    public void setValues(PersistenceManagerInternal queryPM, Object[] paramValues)
+    {
+        if (paramValues != null)
+        {
+            Iterator i = names.iterator();
+            for (int index = 0; index < paramValues.length; index++) {
+                Object value = paramValues[index];
+                if (!i.hasNext()) {
+                    throw new JDOQueryException(
+                        msg.msg("EXC_WrongNumberOfQueryParameters")); //NOI18N
+                }
+                String name = (String)i.next();
+                QueryResultHelperImpl.checkPM(queryPM, value);
+                checkCompatibility(name, value);
+                setValue(name, value);
+            }
+        }
+    }
+
+    /**
+     * Sets all query parameter values. The values are taken from the specified 
+     * map. The method assumes the key in the map to be the parameter name and 
+     * the value in the map to be the parameter value. 
+     * @param paramValues the parameter values
+     */
+    public void setValues(PersistenceManagerInternal queryPM, Map paramValues)
+    {
+        if (paramValues != null)
+        {
+            for (Iterator i = paramValues.entrySet().iterator(); i.hasNext();)
+            {
+                Map.Entry actualParam = (Map.Entry)i.next();
+                String name = (String)actualParam.getKey();
+                Object value = actualParam.getValue();
+                QueryResultHelperImpl.checkPM(queryPM, value);
+                checkCompatibility(name, value);
+                setValue(name, value);
+            }
+        }
+    }
+
+    /**
+     * Checks whether all query parameters are bound. 
+     * If not a JDOQueryException is thrown.
+     */
+    public void checkUnboundParams()
+    {
+        if (valueMap == null)
+            throw new JDOFatalInternalException(
+                msg.msg("ERR_InvalidTableForExecution", //NOI18N
+                        this.getClass().getName()));
+        for (Iterator i = valueMap.entrySet().iterator(); i.hasNext();)
+        {
+            Map.Entry valueEntry = (Map.Entry)i.next();
+            if (valueEntry.getValue() instanceof UNDEFINED)
+            {
+                throw new JDOQueryException(
+                    msg.msg("EXC_UnboundQueryParameter", (String)valueEntry.getKey())); //NOI18N
+            }
+        }
+    }
+
+    //========= Internal helper methods ==========
+   
+    /**
+     * Checks the type compatibility of the specified value and throws a
+     * JDOQueryException if the value has an incompatible type.
+     */
+    private void checkCompatibility(String name, Object value)
+    {
+        if (!isCompatibleValue(name, value)) {
+            Declaration decl = (Declaration)declMap.get(name);
+            String formalType = decl.getJavaClass().getName();
+            String actualType = (value == null) ? "null" : value.getClass().getName(); //NOI18N
+            throw new JDOQueryException(
+                msg.msg("EXC_IncompatibleTypeOfQueryParameter", actualType, formalType)); //NOI18N
+        }
+    }
+}
+

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/SymbolTable.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/SymbolTable.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/SymbolTable.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/SymbolTable.java Sun May 22 11:08:57 2005
@@ -0,0 +1,87 @@
+/*
+ * 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.
+ */
+
+/*
+ * SymbolTable.java
+ *
+ * Created on August 28, 2001
+ */
+
+package org.apache.jdo.impl.jdoql.scope;
+
+import java.util.Map;
+import java.util.HashMap;
+
+import org.apache.jdo.jdoql.tree.Declaration;
+
+
+/**
+ * The symbol table handling declared identifies.
+ *
+ * @author  Michael Bouschen
+ */
+public class SymbolTable
+{
+    /**
+     * The table of declared identifier (symbols).
+     */
+    protected Map symbols = new HashMap();
+
+	/**
+	 * This method adds the specified identifier to this SymbolTable. 
+     * The specified declaration node provides details anbout the declaration. 
+     * If this SymbolTable already defines an identifier with the same name, 
+     * the SymbolTable is not changed and the existing declaration is returned. 
+     * Otherwise <code>null</code> is returned.
+     * @param   ident   identifier to be declared
+     * @param   def     new definition of identifier
+     * @return  the old definition if the identifier was already declared; 
+     * <code>null</code> otherwise
+	 */
+    public Declaration declare(String ident, Declaration def)
+    {
+        Declaration old = (Declaration)symbols.get(ident);
+        if (old == null) {
+            symbols.put(ident, def);
+        }
+        return old;
+    }
+
+    /**
+     * Checks whether the specified identifier is declared.  
+     * @param ident the name of identifier to be tested
+     * @return <code>true</code> if the identifier is declared; 
+     * <code>false</code> otherwise.
+     */
+    public boolean isDeclared(String ident)
+    {
+        return (getDeclaration(ident) != null);
+    }
+
+    /**
+     * Checks the symbol table for the actual declaration of the specified 
+     * identifier. The method returns the declaration node if available or
+     * <code>null</code> for an undeclared identifier. 
+     * @param ident the name of identifier
+     * @return the declaration node if ident is declared;
+     * <code>null</code> otherise.
+     */
+    public Declaration getDeclaration(String ident)
+    {
+        return (Declaration)symbols.get(ident);
+    }
+	
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/TypeNames.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/TypeNames.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/TypeNames.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/TypeNames.java Sun May 22 11:08:57 2005
@@ -0,0 +1,156 @@
+/*
+ * 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.
+ */
+
+/*
+ * TypeNames.java
+ *
+ * Created on September 06, 2001
+ */
+
+package org.apache.jdo.impl.jdoql.scope;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.TypeSupport;
+import org.apache.jdo.model.java.JavaType;
+
+
+/**
+ * The table handling type names.
+ * <p>
+ * TBD:
+ * <ul>
+ * <li> check single type-import-on-demand on access
+ * </ul> 
+ * @author  Michael Bouschen
+ */
+public class TypeNames
+{
+    /**
+     * The corresponding type table.
+     **/
+    protected TypeSupport typeSupport;
+
+    /**
+     * Map of single-type-imports. 
+     * Key is the imported class name, value is the fully qualified class name.
+     */
+    protected Map imports = new HashMap();
+
+    /**
+     * Collection of type-imports-on-demand. 
+     * The collection stores the imported package names.
+     */
+    protected Set importOnDemands = new HashSet();
+
+    /**
+     * The package of the class of the current compilation unit.
+     */
+    protected String currentPackage = null;
+
+    /**
+     * Creates a new TypeNames instance.
+     */
+    public TypeNames(TypeSupport typeSupport)
+    {
+        this.typeSupport = typeSupport;
+    }
+
+    /**
+     * This method initializes the TypeNames table. It sets the currentPackage 
+     * as the package name of the specified compilation unit. It also adds the 
+     * package java.lang to the type-imports-on-demand.
+     */
+    public void init(String compilationUnit)
+    {
+        declareImport(compilationUnit);
+        declareImportOnDemand("java.lang"); //NOI18N
+        int index = compilationUnit.lastIndexOf('.');
+        currentPackage = index > 0 ? compilationUnit.substring(0, index) : ""; //NOI18N
+    }
+
+    /**
+     * Defines a single-type-import.
+     * @param typeName the fully qualified name of the type to be imported.
+     */
+    public String declareImport(String typeName)
+    {
+        int index = typeName.lastIndexOf('.');
+        String shortName = index>0 ? typeName.substring(index+1) : typeName;
+        String old = (String)imports.get(shortName);
+        if (old == null)
+            imports.put(shortName, typeName);
+        else if (old.equals(typeName))
+            // same import twice => no problem
+            old = null;
+        return old;
+    }
+
+    /**
+     * Defines a type-import-on-demand.
+     * @param packageName the package name to be imported.
+     */
+    public void declareImportOnDemand(String packageName)
+    {
+        importOnDemands.add(packageName);
+    }
+
+    /**
+     * Resolves a type name. If the specified type name is fully qualified 
+     * the method checks the type table for the type representation. If the 
+     * name is not fully qualified, the method first checks whether there is 
+     * a single-type-import importing the specified name. If not it checks 
+     * whether the current package defines this type. If not the method checks 
+     * whether there is a single type-import-on-demand for the spceified name. 
+     * @param name a type name
+     * @return the type representation for the type name.
+     */
+    public JavaType resolve(String name)
+    {
+        // check fully qulified class name
+        int index = name.indexOf('.');
+        if (index > -1) {
+            return typeSupport.checkType(name);
+        }
+        
+        // check single-type-import
+        String singleTypeImort = (String)imports.get(name);
+        if (singleTypeImort != null)
+            return typeSupport.checkType(singleTypeImort);
+        
+        // check current package
+        JavaType type = typeSupport.checkType(currentPackage + '.' + name);
+        if (type != null)
+            return type;
+
+        // check type-import-on-demand
+        // TBD: check single type-import-on-demand
+        for (Iterator i = importOnDemands.iterator(); i.hasNext();) {
+            String next = (String)i.next();
+            type = typeSupport.checkType(next + '.' + name);
+            if (type != null)
+                return type;
+        }
+
+        // not found
+        return null;
+    }
+
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/UNDEFINED.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/UNDEFINED.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/UNDEFINED.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/UNDEFINED.java Sun May 22 11:08:57 2005
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ */
+
+/*
+ * UNDEFINED.java
+ *
+ * Created on September 11, 2001
+ */
+
+package org.apache.jdo.impl.jdoql.scope;
+
+/**
+ * An instance of this class represents an undefined value in a ValueTable
+ * (ParameterTable or VariableTable).
+ *
+ * @author  Michael Bouschen
+ */
+public class UNDEFINED
+{
+    /** The singleton UNDEFINED instance. */    
+    private static UNDEFINED undefined = new UNDEFINED();
+    
+    /** 
+     * Get an instance of UNDEFINED
+     * @return an instance of UNDEFINED
+     */    
+    public static UNDEFINED getInstance()
+    {
+        return undefined;
+    }
+
+    /**
+     * Creates new UNDEFINED. This constructor should not be 
+     * called directly; instead, the singleton access method 
+     * {@link #getInstance} should be used.
+     */
+    private UNDEFINED() {}
+
+    /**
+     * Returns a string representation of an UNDEFINED instance.
+     */
+    public String toString()
+    {
+        return "UNDEFINED"; //NOI18N
+    }
+    
+    
+}
+

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/VariableTable.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/VariableTable.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/VariableTable.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/scope/VariableTable.java Sun May 22 11:08:57 2005
@@ -0,0 +1,66 @@
+/*
+ * 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.
+ */
+
+/*
+ * VariableTable.java
+ *
+ * Created on September 11, 2001
+ */
+
+package org.apache.jdo.impl.jdoql.scope;
+
+import javax.jdo.JDOFatalInternalException;
+
+import org.apache.jdo.jdoql.JDOQueryException;
+import org.apache.jdo.jdoql.tree.Declaration;
+
+
+
+/**
+ * The variable table.
+ *
+ * @author  Michael Bouschen
+ * @version 0.1
+ */
+public class VariableTable
+    extends AbstractValueTable
+{
+    /**
+     * Returns a copy of this VariableTable.
+     * @return a copy of this VariableTable.
+     */
+    public VariableTable getCopy()
+    {
+        try {
+            return (VariableTable)clone();
+        }
+        catch (CloneNotSupportedException ex) {
+            throw new JDOFatalInternalException(
+                msg.msg("ERR_UnexpectedCloneProblems", ex)); //NOI18N
+        }
+    }
+ 
+    /**
+     * Internal method to check whether the specified identifier is declared. 
+     */
+    protected void checkDeclaredIdentifier(String name, Declaration decl)
+    {
+        if (decl == null)
+            throw new JDOQueryException(
+                msg.msg("EXC_UndefinedQueryVariable", name)); //NOI18N
+    }
+}
+

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/AndExpr.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/AndExpr.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/AndExpr.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/AndExpr.java Sun May 22 11:08:57 2005
@@ -0,0 +1,94 @@
+/*
+ * 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.impl.jdoql.tree;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.JDOQLTokenTypes;
+import org.apache.jdo.jdoql.tree.AndExpression;
+import org.apache.jdo.jdoql.tree.Expression;
+import org.apache.jdo.jdoql.tree.NodeVisitor;
+
+
+/**
+ * This node represents a logical and operator.
+ * A logical and operator is based on boolean types.
+ * The string representation of this operator is <code>&</code>.
+ *
+ * @author Michael Watzek
+ */
+public final class AndExpr extends BinaryExpr implements AndExpression
+{
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public AndExpr()
+    {}
+
+    /**
+     * The noarg constructor is needed for ANTLR support.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public AndExpr(antlr.Token token)
+    {   initialize( token );
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param left the first child
+     * @param right the second child
+     */
+    AndExpr(Expression left, Expression right)
+    {   super( JDOQLTokenTypes.BAND, "And", Boolean.class, left, right ); //NOI18N
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     */
+    public void arrive(NodeVisitor visitor)
+    {   visitor.arrive( this );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param results the result array
+     * @return the object returned by the visitor instance
+     */
+    public Object leave(NodeVisitor visitor, Object[] results)
+    {   return visitor.leave( this, results );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param resultOfPreviousChild the result computed by leaving the
+     * previous child node
+     * @param indexOfNextChild the index in the children array of the
+     * next child to walk
+     * @return the boolean value returned by the visitor instance
+     */
+    public boolean walkNextChild(NodeVisitor visitor,
+                                 Object resultOfPreviousChild,
+                                 int indexOfNextChild)
+    {   return visitor.walkNextChild( this, resultOfPreviousChild, 
+                                      indexOfNextChild );
+    }
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/AscendingOrderingExpr.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/AscendingOrderingExpr.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/AscendingOrderingExpr.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/AscendingOrderingExpr.java Sun May 22 11:08:57 2005
@@ -0,0 +1,79 @@
+/*
+ * 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.impl.jdoql.tree;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.JDOQLTokenTypes;
+import org.apache.jdo.jdoql.tree.AscendingOrderingExpression;
+import org.apache.jdo.jdoql.tree.Expression;
+import org.apache.jdo.jdoql.tree.NodeVisitor;
+
+
+/**
+ * This node represents an operator defining ascendent ordering of instances
+ * returned by a query execution. The order is determined by an expression
+ * such as <code>FieldAccessExpression</code>. This expression is this node's
+ * child.
+ *
+ * @author Michael Watzek
+ */
+public final class AscendingOrderingExpr 
+    extends OrderingExpr implements AscendingOrderingExpression
+{
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public AscendingOrderingExpr()
+    {}
+
+    /**
+     * The noarg constructor is needed for ANTLR support.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public AscendingOrderingExpr(antlr.Token token)
+    {   initialize( token );
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param expr the expression defining the order
+     */
+    AscendingOrderingExpr(Expression expr)
+    {   super( JDOQLTokenTypes.ASCENDING, "AscendingOrderingExpression", expr ); //NOI18N
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     */
+    public void arrive(NodeVisitor visitor)
+    {   visitor.arrive( this );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param results the result array
+     * @return the object returned by the visitor instance
+     */
+    public Object leave(NodeVisitor visitor, Object[] results)
+    {   return visitor.leave( this, results );
+    }
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/BinaryExpr.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/BinaryExpr.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/BinaryExpr.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/BinaryExpr.java Sun May 22 11:08:57 2005
@@ -0,0 +1,166 @@
+/*
+ * 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.impl.jdoql.tree;
+
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+import org.apache.jdo.jdoql.JDOQueryException;
+import org.apache.jdo.jdoql.tree.BinaryExpression;
+import org.apache.jdo.jdoql.tree.EqualsExpression;
+import org.apache.jdo.jdoql.tree.Expression;
+import org.apache.jdo.jdoql.tree.NotEqualsExpression;
+
+/**
+ * This node represents a binary operator. All binary operators have exactly
+ * two children. Examples of binary operators
+ * are <code>AndExpression</code> and <code>EqualsExpression</code>.
+ *
+ * @author Michael Watzek
+ */
+public abstract class BinaryExpr extends Expr implements BinaryExpression
+{
+    transient Class commonOperandType;
+    String commonOperandTypeName; // needed for serialization support only
+
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public BinaryExpr()
+    {}
+
+    /**
+     * This constructor is called by specialized nodes.
+     * It calls <code>setChildren</code> in order to initialize the node's
+     * children <code>left</code> and <code>right</code>.
+     * @param tokenType the token type
+     * @param tokenName the name of this node
+     * @param clazz the Java type of this node
+     * @param left the first child
+     * @param right the second child
+     */
+    BinaryExpr(int tokenType, String tokenName, Class clazz, Expression left, Expression right)
+    {   super( tokenType, tokenName, clazz );
+        this.commonOperandType = computeJavaClass( left.getJavaClass(), right.getJavaClass() );
+        setChildren( new org.apache.jdo.jdoql.tree.Node[] {left, right} );
+    }
+
+    /**
+     * Returns the first child of this node.
+     * @return the first child
+     */
+    public Expression getLeftExpression()
+    {   ASTToChildren();
+        if( this.children==null ||
+            this.children.length<1 )
+            return null;
+        return (Expression) this.children[0];
+    }
+
+    /**
+     * Returns the second child of this node.
+     * @return the second child
+     */
+    public Expression getRightExpression()
+    {   ASTToChildren();
+        if( this.children==null ||
+            this.children.length<2 )
+            return null;
+        return (Expression) this.children[1];
+    }
+
+    /**
+     * Returns the class instance suiteable for implementing the result
+     * of this expression. In case of integral binary expressions
+     * that class instance is also the result type of the operation retrieved
+     * by method <code>getJavaClass</code>. In case of relational binary
+     * expressions, that class instance differs from the type retrieved by
+     * <code>getJavaClass</code>, because relational binary expressions
+     * have a boolean result type which does not depend of the operand types.
+     * @return the common operand type
+     */
+    public Class getCommonOperandType()
+    {   return this.commonOperandType;
+    }
+
+    /**
+     * Sets the common operand type for this binary expression.
+     * @param clazz the common operand type
+     */
+    public void setCommonOperandType(Class clazz)
+    {   this.commonOperandType = clazz;
+    }
+
+    Class computeJavaClass( Class left, Class right )
+    {   Class clazz = null;
+        if( left!=null && right!=null )
+        {   if( (BigDecimal.class.isAssignableFrom(left) &&
+                 Number.class.isAssignableFrom(right)) ||
+                (BigDecimal.class.isAssignableFrom(right) &&
+                 Number.class.isAssignableFrom(left)) ||
+                (BigInteger.class.isAssignableFrom(left) &&
+                 (right==Float.class || right==Double.class)) ||
+                (BigInteger.class.isAssignableFrom(right) &&
+                 (left==Float.class || left==Double.class)) )
+                clazz = BigDecimal.class;
+            else if( (BigInteger.class.isAssignableFrom(left) &&
+                      Number.class.isAssignableFrom(right)) ||
+                     (BigInteger.class.isAssignableFrom(right) &&
+                      Number.class.isAssignableFrom(left)) )
+                clazz = BigInteger.class;
+            else if( (Double.class.isAssignableFrom(left) &&
+                      Number.class.isAssignableFrom(right)) ||
+                     (Double.class.isAssignableFrom(right) &&
+                      Number.class.isAssignableFrom(left)) )
+                clazz = Double.class;
+            else if( (Float.class.isAssignableFrom(left) &&
+                      Number.class.isAssignableFrom(right)) ||
+                     (Float.class.isAssignableFrom(right) &&
+                      Number.class.isAssignableFrom(left)) )
+                clazz = Float.class;
+            else if( (Long.class.isAssignableFrom(left) &&
+                      Number.class.isAssignableFrom(right)) ||
+                     (Long.class.isAssignableFrom(right) &&
+                      Number.class.isAssignableFrom(left)) )
+                clazz = Long.class;
+            else if( (Integer.class.isAssignableFrom(left) &&
+                      Number.class.isAssignableFrom(right)) ||
+                     (Integer.class.isAssignableFrom(right) &&
+                      Number.class.isAssignableFrom(left)) ||
+                     (Short.class.isAssignableFrom(left) &&
+                      Number.class.isAssignableFrom(right)) ||
+                     (Short.class.isAssignableFrom(right) &&
+                      Number.class.isAssignableFrom(left)) ||
+                     (Byte.class.isAssignableFrom(left) &&
+                      Number.class.isAssignableFrom(right)) )
+                clazz = Integer.class;
+            else if( Boolean.class.isAssignableFrom(left) &&
+                     Boolean.class.isAssignableFrom(right) )
+                clazz = Boolean.class;
+            else if( this instanceof EqualsExpression ||
+                     this instanceof NotEqualsExpression )
+                clazz = Object.class;
+            else
+                throw new JDOQueryException( msg.msg("EXC_IncompatibleTypes", left, right, this) ); //NOI18N
+        }
+        return clazz;
+    }
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/BooleanLiteralExpr.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/BooleanLiteralExpr.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/BooleanLiteralExpr.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/BooleanLiteralExpr.java Sun May 22 11:08:57 2005
@@ -0,0 +1,93 @@
+/*
+ * 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.impl.jdoql.tree;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.JDOQLTokenTypes;
+import org.apache.jdo.jdoql.tree.BooleanLiteralExpression;
+import org.apache.jdo.jdoql.tree.NodeVisitor;
+
+
+/**
+ * This node represents a boolean literal such as <code>true</code> or
+ * <code>false</code>. It does not have any children.
+ *
+ * @author Michael Watzek
+ */
+public final class BooleanLiteralExpr 
+    extends ConstantExpr implements BooleanLiteralExpression
+{
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public BooleanLiteralExpr()
+    {}
+
+    /**
+     * The noarg constructor is needed for ANTLR support.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public BooleanLiteralExpr(antlr.Token token)
+    {   initialize( token );
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param b the boolean value
+     */
+    BooleanLiteralExpr(Boolean b)
+    {   super( JDOQLTokenTypes.BOOLEAN_LITERAL, b.toString(), b ); //NOI18N
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param b the boolean value
+     */
+    BooleanLiteralExpr(boolean b)
+    {   this( new Boolean(b) );
+    }
+
+    /**
+     * Returns the boolean value represented by this expression.
+     * @return the boolean value
+     */
+    public boolean getBoolean()
+    {   return ((Boolean)this.value).booleanValue();
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     */
+    public void arrive(NodeVisitor visitor)
+    {   visitor.arrive( this );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param results the result array
+     * @return the object returned by the visitor instance
+     */
+    public Object leave(NodeVisitor visitor, Object[] results)
+    {   return visitor.leave( this, results );
+    }
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ByteLiteralExpr.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ByteLiteralExpr.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ByteLiteralExpr.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ByteLiteralExpr.java Sun May 22 11:08:57 2005
@@ -0,0 +1,92 @@
+/*
+ * 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.impl.jdoql.tree;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.JDOQLTokenTypes;
+import org.apache.jdo.jdoql.tree.ByteLiteralExpression;
+import org.apache.jdo.jdoql.tree.NodeVisitor;
+
+
+/**
+ * This node represents a byte literal. It does not have any children.
+ *
+ * @author Michael Watzek
+ */
+public final class ByteLiteralExpr
+    extends ConstantExpr implements ByteLiteralExpression
+{
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public ByteLiteralExpr()
+    {}
+
+    /**
+     * The noarg constructor is needed for ANTLR support.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public ByteLiteralExpr(antlr.Token token)
+    {   initialize( token );
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param b the byte value
+     */
+    ByteLiteralExpr(Byte b)
+    {   super( JDOQLTokenTypes.BYTE_LITERAL, b.toString(), b ); //NOI18N
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param b the byte value
+     */
+    ByteLiteralExpr(byte b)
+    {   this( new Byte(b) );
+    }
+
+    /**
+     * Returns the byte value represented by this expression.
+     * @return the byte value
+     */
+    public byte getByte()
+    {   return ((Byte)this.value).byteValue();
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     */
+    public void arrive(NodeVisitor visitor)
+    {   visitor.arrive( this );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param results the result array
+     * @return the object returned by the visitor instance
+     */
+    public Object leave(NodeVisitor visitor, Object[] results)
+    {   return visitor.leave( this, results );
+    }
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CandidateClassImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CandidateClassImpl.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CandidateClassImpl.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CandidateClassImpl.java Sun May 22 11:08:57 2005
@@ -0,0 +1,94 @@
+/*
+ * 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.impl.jdoql.tree;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.JDOQLTokenTypes;
+import org.apache.jdo.jdoql.tree.CandidateClass;
+import org.apache.jdo.jdoql.tree.Node;
+import org.apache.jdo.jdoql.tree.NodeVisitor;
+
+
+/**
+ * This node represents the candidate class of a query.
+ * The candidate class defines the type of instances in the
+ * candidate collection on which the filter expression is applied.
+ *
+ * @author Michael Watzek
+ */
+public final class CandidateClassImpl extends NodeImpl implements CandidateClass
+{
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public CandidateClassImpl()
+    {}
+
+    /**
+     * The noarg constructor is needed for ANTLR support.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public CandidateClassImpl(antlr.Token token)
+    {   initialize( token );
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor and
+     * sets the specified candidate class.
+     * @param type the type instance wrapping the candidate class
+     */
+    CandidateClassImpl(TypeImpl type)
+    {   super( JDOQLTokenTypes.CANDIDATE_CLASS, "CandidateClass", 
+               type.getJavaClass() ); //NOI18N
+        setChildren( new Node[] {type} );
+    }
+
+    /**
+     * Sets the candidate class for this instance.
+     * This method is used by semantic analysis only.
+     * @param clazz the candidate clazz
+     */
+    public void setCandidateClass(Class clazz)
+    {   ASTToChildren();
+        if( this.children==null )
+            setChildren( new Node[] {new TypeImpl(clazz)} );
+        TypeImpl type = (TypeImpl) this.children[0];
+        type.clazz = clazz;
+        this.clazz = clazz;
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     */
+    public void arrive(NodeVisitor visitor)
+    {   visitor.arrive( this );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param results the result array
+     * @return the object returned by the visitor instance
+     */
+    public Object leave(NodeVisitor visitor, Object[] results)
+    {   return visitor.leave( this, results );
+    }
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CastExpr.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CastExpr.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CastExpr.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CastExpr.java Sun May 22 11:08:57 2005
@@ -0,0 +1,116 @@
+/*
+ * 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.impl.jdoql.tree;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.JDOQLTokenTypes;
+import org.apache.jdo.jdoql.JDOQueryException;
+import org.apache.jdo.jdoql.tree.CastExpression;
+import org.apache.jdo.jdoql.tree.Expression;
+import org.apache.jdo.jdoql.tree.Node;
+import org.apache.jdo.jdoql.tree.NodeVisitor;
+import org.apache.jdo.jdoql.tree.Type;
+
+
+
+/**
+ * This node represents a cast expression. It has a result type and a child
+ * which corresponds with the expression to cast.
+ *
+ * @author Michael Watzek
+ */
+public final class CastExpr extends Expr implements CastExpression
+{
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public CastExpr()
+    {}
+
+    /**
+     * The noarg constructor is needed for ANTLR support.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public CastExpr(antlr.Token token)
+    {   initialize( token );
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param type the type instance wrapping the Java class to which
+     * the argument <code>expr</code> is casted
+     * @param expr the expression to cast
+     * @exception JDOQueryException if the result type of expr cannot
+     * be casted to clazz
+     */
+    CastExpr(Type type, Expression expr)
+    {   super( JDOQLTokenTypes.CAST, "Cast", type.getJavaClass() ); //NOI18N
+        setChildren( new Node[] {type, expr} );
+        if( expr.getJavaClass()!=null &&
+            !clazz.isAssignableFrom(expr.getJavaClass()) &&
+            !expr.getJavaClass().isAssignableFrom(clazz) )
+            throw new JDOQueryException( 
+                msg.msg("EXC_IllegalCast", expr.getJavaClass().getName(), 
+                        clazz.getName(), this) ); //NOI18N
+    }
+
+    /**
+     * Returns the string representation of the Java class,
+     * to which this node's expression is casted.
+     * @return the Java type name
+     */
+    public String getTypeName()
+    {   ASTToChildren();
+        if( this.children==null ||
+            this.children.length<1 )
+            return null;
+        return ((Type)this.children[0]).getTypeName();
+    }
+
+    /**
+     * Returns the node's cast expression.
+     * @return the node's cast expression
+     */
+    public Expression getExpression()
+    {   ASTToChildren();
+        if( this.children==null ||
+            this.children.length<2 )
+            return null;
+        return (Expression) this.children[1];
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     */
+    public void arrive(NodeVisitor visitor)
+    {   visitor.arrive( this );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param results the result array
+     * @return the object returned by the visitor instance
+     */
+    public Object leave(NodeVisitor visitor, Object[] results)
+    {   return visitor.leave( this, results );
+    }
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CharLiteralExpr.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CharLiteralExpr.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CharLiteralExpr.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/CharLiteralExpr.java Sun May 22 11:08:57 2005
@@ -0,0 +1,92 @@
+/*
+ * 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.impl.jdoql.tree;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.JDOQLTokenTypes;
+import org.apache.jdo.jdoql.tree.CharLiteralExpression;
+import org.apache.jdo.jdoql.tree.NodeVisitor;
+
+
+/**
+ * This node represents a character literal. It does not have any children.
+ *
+ * @author Michael Watzek
+ */
+public final class CharLiteralExpr 
+    extends ConstantExpr implements CharLiteralExpression
+{
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public CharLiteralExpr()
+    {}
+
+    /**
+     * The noarg constructor is needed for ANTLR support.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public CharLiteralExpr(antlr.Token token)
+    {   initialize( token );
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param c the char value
+     */
+    CharLiteralExpr(Character c)
+    {   super( JDOQLTokenTypes.CHAR_LITERAL, c.toString(), c ); //NOI18N
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param c the char value
+     */
+    CharLiteralExpr(char c)
+    {   this( new Character(c) );
+    }
+
+    /**
+     * Returns the char value represented by this expression.
+     * @return the char value
+     */
+    public char getChar()
+    {   return ((Character)this.value).charValue();
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     */
+    public void arrive(NodeVisitor visitor)
+    {   visitor.arrive( this );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param results the result array
+     * @return the object returned by the visitor instance
+     */
+    public Object leave(NodeVisitor visitor, Object[] results)
+    {   return visitor.leave( this, results );
+    }
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ComplementExpr.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ComplementExpr.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ComplementExpr.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ComplementExpr.java Sun May 22 11:08:57 2005
@@ -0,0 +1,78 @@
+/*
+ * 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.impl.jdoql.tree;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.JDOQLTokenTypes;
+import org.apache.jdo.jdoql.tree.ComplementExpression;
+import org.apache.jdo.jdoql.tree.Expression;
+import org.apache.jdo.jdoql.tree.NodeVisitor;
+
+
+/**
+ * This node represents a bitwise not operator.
+ * A bitwise not operator is a unary expression.
+ * The string representation of this operator is <code>~</code>.
+ *
+ * @author Michael Watzek
+ */
+public final class ComplementExpr 
+    extends UnaryExpr implements ComplementExpression
+{
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public ComplementExpr()
+    {}
+
+    /**
+     * The noarg constructor is needed for ANTLR support.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public ComplementExpr(antlr.Token token)
+    {   initialize( token );
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param expr the expression to compute the complement for
+     */
+    ComplementExpr(Expression expr)
+    {   super( JDOQLTokenTypes.BNOT, "Complement", expr ); //NOI18N
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     */
+    public void arrive(NodeVisitor visitor)
+    {   visitor.arrive( this );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param results the result array
+     * @return the object returned by the visitor instance
+     */
+    public Object leave(NodeVisitor visitor, Object[] results)
+    {   return visitor.leave( this, results );
+    }
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConditionalAndExpr.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConditionalAndExpr.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConditionalAndExpr.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConditionalAndExpr.java Sun May 22 11:08:57 2005
@@ -0,0 +1,96 @@
+/*
+ * 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.impl.jdoql.tree;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.JDOQLTokenTypes;
+import org.apache.jdo.jdoql.tree.ConditionalAndExpression;
+import org.apache.jdo.jdoql.tree.Expression;
+import org.apache.jdo.jdoql.tree.NodeVisitor;
+
+
+/**
+ * This node represents a conditional and operator.
+ * A conditional and operator is a binary expression.
+ * The string representation of this operator is <code>&&</code>.
+ *
+ * @author Michael Watzek
+ */
+public final class ConditionalAndExpr 
+    extends BinaryExpr implements ConditionalAndExpression
+{
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public ConditionalAndExpr()
+    {}
+
+    /**
+     * The noarg constructor is needed for ANTLR support.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public ConditionalAndExpr(antlr.Token token)
+    {   initialize( token );
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param left the left operand
+     * @param right the right operand
+     */
+    ConditionalAndExpr(Expression left, Expression right)
+    {   super( JDOQLTokenTypes.AND, "ConditionalAnd", Boolean.class, 
+               left, right ); //NOI18N
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     */
+    public void arrive(NodeVisitor visitor)
+    {   visitor.arrive( this );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param results the result array
+     * @return the object returned by the visitor instance
+     */
+    public Object leave(NodeVisitor visitor, Object[] results)
+    {   return visitor.leave( this, results );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param resultOfPreviousChild the result computed by leaving the 
+     * previous child node
+     * @param indexOfNextChild the index in the children array of the 
+     * next child to walk 
+     * @return the boolean value returned by the visitor instance
+     */
+    public boolean walkNextChild(NodeVisitor visitor, 
+                                 Object resultOfPreviousChild, 
+                                 int indexOfNextChild)
+    {   return visitor.walkNextChild( this, resultOfPreviousChild, 
+                                      indexOfNextChild );
+    }
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConditionalOrExpr.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConditionalOrExpr.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConditionalOrExpr.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConditionalOrExpr.java Sun May 22 11:08:57 2005
@@ -0,0 +1,96 @@
+/*
+ * 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.impl.jdoql.tree;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.JDOQLTokenTypes;
+import org.apache.jdo.jdoql.tree.ConditionalOrExpression;
+import org.apache.jdo.jdoql.tree.Expression;
+import org.apache.jdo.jdoql.tree.NodeVisitor;
+
+
+/**
+ * This node represents a conditional or operator.
+ * A conditional or operator is a binary expression.
+ * The string representation of this operator is <code>||</code>.
+ *
+ * @author Michael Watzek
+ */
+public final class ConditionalOrExpr
+    extends BinaryExpr implements ConditionalOrExpression
+{
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public ConditionalOrExpr()
+    {}
+
+    /**
+     * The noarg constructor is needed for ANTLR support.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public ConditionalOrExpr(antlr.Token token)
+    {   initialize( token );
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param left the first child
+     * @param right the second child
+     */
+    ConditionalOrExpr(Expression left, Expression right)
+    {   super( JDOQLTokenTypes.OR, "ConditionalOr", Boolean.class, 
+               left, right ); //NOI18N
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     */
+    public void arrive(NodeVisitor visitor)
+    {   visitor.arrive( this );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param results the result array
+     * @return the object returned by the visitor instance
+     */
+    public Object leave(NodeVisitor visitor, Object[] results)
+    {   return visitor.leave( this, results );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param resultOfPreviousChild the result computed by leaving the
+     * previous child node.
+     * @param indexOfNextChild the index in the children array of the
+     * next child to walk
+     * @return the boolean value returned by the visitor instance
+     */
+    public boolean walkNextChild(NodeVisitor visitor,
+                                 Object resultOfPreviousChild,
+                                 int indexOfNextChild)
+    {   return visitor.walkNextChild( this, resultOfPreviousChild,
+                                      indexOfNextChild );
+    }
+}

Added: incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConstantExpr.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConstantExpr.java?rev=171353&view=auto
==============================================================================
--- incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConstantExpr.java (added)
+++ incubator/jdo/trunk/query20/src/java/org/apache/jdo/impl/jdoql/tree/ConstantExpr.java Sun May 22 11:08:57 2005
@@ -0,0 +1,127 @@
+/*
+ * 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.impl.jdoql.tree;
+
+import org.apache.jdo.impl.jdoql.jdoqlc.JDOQLTokenTypes;
+import org.apache.jdo.jdoql.tree.ConstantExpression;
+import org.apache.jdo.jdoql.tree.NodeVisitor;
+
+
+/**
+ * This node represents a constant expression.
+ * Examples of constant expressions are <code>BooleanLiteralExpression</code> or
+ * <code>ByteLiteralExpression</code>. It does not have any children.
+ *
+ * @author Michael Watzek
+ */
+public class ConstantExpr extends Expr implements ConstantExpression
+{
+    /**
+     * Returns an instance of <code>ConstantExpression</code>.
+     * This method handles <code>null</code> as a constant expression.
+     * @param value the object wrapped by the constant expression
+     * @return the constant expression
+     */
+    public static ConstantExpr newConstant(Object value)
+    {   ConstantExpr constant;
+        if( value instanceof Boolean )
+            constant = new BooleanLiteralExpr( (Boolean)value );
+        else if( value instanceof Byte )
+            constant = new ByteLiteralExpr( (Byte)value );
+        else if( value instanceof Character )
+            constant = new CharLiteralExpr( (Character)value );
+        else if( value instanceof Double )
+            constant = new DoubleLiteralExpr( (Double)value );
+        else if( value instanceof Float )
+            constant = new FloatLiteralExpr( (Float)value );
+        else if( value instanceof Integer )
+            constant = new IntLiteralExpr( (Integer)value );
+        else if( value instanceof Long )
+            constant = new LongLiteralExpr( (Long)value );
+        else if( value instanceof Short )
+            constant = new ShortLiteralExpr( (Short)value );
+        else
+            constant = new ConstantExpr( value );
+        return constant;
+    }
+
+    Object value = null;
+
+    /**
+     * The noarg constructor is needed for ANTLR support and deserialization.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public ConstantExpr()
+    {}
+
+    /**
+     * The noarg constructor is needed for ANTLR support.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     */
+    public ConstantExpr(antlr.Token token)
+    {   initialize( token );
+    }
+
+    /**
+     * This constructor is called by specialized nodes.
+     * The caller must make sure to set the ANTLR tree structure himself
+     * or, call <code>setChildren</code> optionally.
+     * @param tokenType the token tpye
+     * @param tokenName the name of this node
+     */
+    ConstantExpr(int tokenType, String tokenName, Object value)
+    {   super( tokenType, tokenName, value==null?null:value.getClass() );
+        this.value = value;
+    }
+
+    /**
+     * This constructor is called by the query tree instance.
+     * It delegates to the super class constructor.
+     * @param value the value represented by this expression
+     */
+    ConstantExpr(Object value)
+        {   this( JDOQLTokenTypes.CONSTANT, "Constant", value ); // NOI18N
+    }
+
+    /**
+     * Returns the value represented by this expression.
+     * @return the value
+     */
+    public Object getValue()
+    {   return this.value;
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     */
+    public void arrive(NodeVisitor visitor)
+    {   visitor.arrive( this );
+    }
+
+    /**
+     * Delegates to the argument <code>visitor</code>.
+     * @param visitor the node visitor
+     * @param results the result array
+     * @return the object returned by the visitor instance
+     */
+    public Object leave(NodeVisitor visitor, Object[] results)
+    {   return visitor.leave( this, results );
+    }
+}