001: /*
002: * Copyright (c) 1998 - 2005 Versant Corporation
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * Versant Corporation - initial API and implementation
010: */
011: package com.versant.core.jdbc.sql.exp;
012:
013: import com.versant.core.jdbc.metadata.JdbcField;
014: import com.versant.core.jdbc.metadata.JdbcColumn;
015:
016: import java.util.Map;
017:
018: /**
019: * This tracks usage of this parameter in an SqlExp tree.
020: * A parameter may be used several times in the same tree if it is
021: * used more than once in the original filter expression. This will be
022: * null if the param is not used.<p>
023: *
024: * A parameter may also have to be split into more than one SqlExp
025: * if it is compared to a field with multiple columns. The first
026: * expression is expList. The expcount field specifies how far down
027: * the list to go as expList may be part of a larger list.
028: *
029: * @see com.versant.core.jdo.query.ParamNode#usageList
030: */
031: public class SqlParamUsage {
032:
033: /**
034: * The field for this parameter or null if it is not being compared
035: * to a field.
036: * @see #javaTypeCode
037: * @see #jdbcType
038: */
039: public JdbcField jdbcField;
040:
041: public JdbcColumn col;
042: /**
043: * The java type code of this usage of the parameter. This is not
044: * set if jdbcField is not null.
045: * @see #jdbcField
046: */
047: public int javaTypeCode;
048: /**
049: * The JDBC type of this usage of the parameter. This is not
050: * set if jdbcField is not null.
051: * @see java.sql.Types
052: * @see #jdbcField
053: */
054: public int jdbcType;
055: /**
056: * The class index of the class for this parameter (-1 if unknown).
057: * This is used for OID parameters compared to columns that are
058: * not associated with a field e.g. in a link table.
059: */
060: public int classIndex;
061: /**
062: * The first expression for this usage of the parameter. This is
063: * the parent of the first ParamExp instance for this usage.
064: */
065: public SqlExp expList;
066: /**
067: * The number of expressions in expList for this usage of the
068: * parameter. If a param is used with a field split over multiple
069: * columns then this will be more than 1. This will be zero if
070: * the parameter never has to be converted into a 'is null' or
071: * 'is not null' expression.
072: */
073: public int expCount;
074: /**
075: * How must the parameter value be modified before being set? This is
076: * used for startsWith and endsWith for databases that do not allow
077: * expressions on the right hand side of a LIKE (e.g. Informix).
078: * @see com.versant.core.jdbc.query.SqlStruct.Param#MOD_APPEND_PERCENT
079: */
080: public int mod;
081: /**
082: * The next usage in the list.
083: */
084: public SqlParamUsage next;
085:
086: public SqlParamUsage getClone(Map cloneMap) {
087: SqlParamUsage sqlUsage = new SqlParamUsage();
088: sqlUsage.jdbcField = jdbcField;
089: sqlUsage.javaTypeCode = javaTypeCode;
090: sqlUsage.jdbcType = jdbcType;
091: sqlUsage.classIndex = classIndex;
092: sqlUsage.expCount = expCount;
093: sqlUsage.mod = mod;
094: sqlUsage.expList = SqlExp.createClone(expList, cloneMap);
095: if (next != null) {
096: sqlUsage.next = next.getClone(cloneMap);
097: }
098: return sqlUsage;
099: }
100: }
|