Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/objectstyle/cayenne/dba/db2/DB2QualifierTranslator.java


1   /* ====================================================================
2    * 
3    * The ObjectStyle Group Software License, Version 1.0 
4    *
5    * Copyright (c) 2002-2003 The ObjectStyle Group 
6    * and individual authors of the software.  All rights reserved.
7    *
8    * Redistribution and use in source and binary forms, with or without
9    * modification, are permitted provided that the following conditions
10   * are met:
11   *
12   * 1. Redistributions of source code must retain the above copyright
13   *    notice, this list of conditions and the following disclaimer. 
14   *
15   * 2. Redistributions in binary form must reproduce the above copyright
16   *    notice, this list of conditions and the following disclaimer in
17   *    the documentation and/or other materials provided with the
18   *    distribution.
19   *
20   * 3. The end-user documentation included with the redistribution, if
21   *    any, must include the following acknowlegement:  
22   *       "This product includes software developed by the 
23   *        ObjectStyle Group (http://objectstyle.org/)."
24   *    Alternately, this acknowlegement may appear in the software itself,
25   *    if and wherever such third-party acknowlegements normally appear.
26   *
27   * 4. The names "ObjectStyle Group" and "Cayenne" 
28   *    must not be used to endorse or promote products derived
29   *    from this software without prior written permission. For written 
30   *    permission, please contact andrus@objectstyle.org.
31   *
32   * 5. Products derived from this software may not be called "ObjectStyle"
33   *    nor may "ObjectStyle" appear in their names without prior written
34   *    permission of the ObjectStyle Group.
35   *
36   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39   * DISCLAIMED.  IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
40   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47   * SUCH DAMAGE.
48   * ====================================================================
49   *
50   * This software consists of voluntary contributions made by many
51   * individuals on behalf of the ObjectStyle Group.  For more
52   * information on the ObjectStyle Group, please see
53   * <http://objectstyle.org/>.
54   *
55   */
56  
57  package org.objectstyle.cayenne.dba.db2;
58  
59  import java.sql.Types;
60  
61  import org.objectstyle.cayenne.CayenneRuntimeException;
62  import org.objectstyle.cayenne.access.trans.QueryAssembler;
63  import org.objectstyle.cayenne.access.trans.TrimmingQualifierTranslator;
64  import org.objectstyle.cayenne.dba.TypesMapping;
65  import org.objectstyle.cayenne.exp.Expression;
66  import org.objectstyle.cayenne.map.DbAttribute;
67  
68  /**
69   * @author Andrei Adamchik
70   */
71  public class DB2QualifierTranslator extends TrimmingQualifierTranslator {
72  
73      public DB2QualifierTranslator() {
74          super();
75      }
76  
77      public DB2QualifierTranslator(
78          QueryAssembler queryAssembler,
79          String trimFunction) {
80          super(queryAssembler, trimFunction);
81      }
82  
83      protected void appendLiteralDirect(
84          StringBuffer buf,
85          Object val,
86          DbAttribute attr,
87          Expression parentExpression) {
88  
89          boolean castNeeded = false;
90  
91          if (parentExpression != null) {
92              int type = parentExpression.getType();
93  
94              castNeeded =
95                  attr != null
96                      && (type == Expression.LIKE
97                          || type == Expression.LIKE_IGNORE_CASE
98                          || type == Expression.NOT_LIKE
99                          || type == Expression.NOT_LIKE_IGNORE_CASE);
100         }
101 
102         if (castNeeded) {
103             buf.append("CAST (");
104         }
105 
106         super.appendLiteralDirect(buf, val, attr, parentExpression);
107 
108         if (castNeeded) {
109             int jdbcType = attr.getType();
110             int len = attr.getMaxLength();
111 
112             // determine CAST type
113 
114             // LIKE on CHAR may produce unpredictible results
115             // LIKE on LONVARCHAR doesn't seem to be supported 
116             if (jdbcType == Types.CHAR || jdbcType == Types.LONGVARCHAR) {
117                 jdbcType = Types.VARCHAR;
118 
119                 // length is required for VARCHAR
120                 if (len <= 0) {
121                     len = 254;
122                 }
123             }
124 
125             buf.append(" AS ");
126             String[] types =
127                 getQueryAssembler().getAdapter().externalTypesForJdbcType(
128                     jdbcType);
129 
130             if (types == null || types.length == 0) {
131                 throw new CayenneRuntimeException(
132                     "Can't find database type for JDBC type '"
133                         + TypesMapping.getSqlNameByType(jdbcType));
134             }
135 
136             buf.append(types[0]);
137             if (len > 0 && TypesMapping.supportsLength(jdbcType)) {
138                 buf.append("(").append(len).append(")");
139             }
140 
141             buf.append(")");
142         }
143     }
144 }