KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > access > trans > InsertBatchQueryBuilder


1 /* ====================================================================
2  *
3  * The ObjectStyle Group Software License, version 1.1
4  * ObjectStyle Group - http://objectstyle.org/
5  *
6  * Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
7  * of the software. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if any,
22  * must include the following acknowlegement:
23  * "This product includes software developed by independent contributors
24  * and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
29  * or promote products derived from this software without prior written
30  * permission. For written permission, email
31  * "andrus at objectstyle dot org".
32  *
33  * 5. Products derived from this software may not be called "ObjectStyle"
34  * or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
35  * names without prior written permission.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals and hosted on ObjectStyle Group web site. For more
53  * information on the ObjectStyle Group, please see
54  * <http://objectstyle.org/>.
55  */

56
57 package org.objectstyle.cayenne.access.trans;
58
59 import java.sql.PreparedStatement JavaDoc;
60 import java.sql.SQLException JavaDoc;
61 import java.util.ArrayList JavaDoc;
62 import java.util.Iterator JavaDoc;
63 import java.util.List JavaDoc;
64
65 import org.objectstyle.cayenne.dba.DbAdapter;
66 import org.objectstyle.cayenne.map.DbAttribute;
67 import org.objectstyle.cayenne.query.BatchQuery;
68
69 /**
70  * Translator of InsertBatchQueries.
71  *
72  * @author Andriy Shapochka
73  * @author Andrei Adamchik
74  */

75 public class InsertBatchQueryBuilder extends BatchQueryBuilder {
76
77     public InsertBatchQueryBuilder(DbAdapter adapter) {
78         super.setAdapter(adapter);
79     }
80
81     /**
82      * Binds parameters for the current batch iteration to the PreparedStatement. Performs
83      * filtering of attributes based on column generation rules.
84      *
85      * @since 1.2
86      */

87     public void bindParameters(PreparedStatement JavaDoc statement, BatchQuery query)
88             throws SQLException JavaDoc, Exception JavaDoc {
89
90         List JavaDoc dbAttributes = query.getDbAttributes();
91         int attributeCount = dbAttributes.size();
92
93         // must use an independent counter "j" for prepared statement index
94
for (int i = 0, j = 0; i < attributeCount; i++) {
95             DbAttribute attribute = (DbAttribute) dbAttributes.get(i);
96             if (includeInBatch(attribute)) {
97                 j++;
98                 Object JavaDoc value = query.getValue(i);
99                 adapter.bindParameter(statement, value, j, attribute.getType(), attribute
100                         .getPrecision());
101             }
102         }
103     }
104
105     /**
106      * Returns a list of values for the current batch iteration. Performs filtering of
107      * attributes based on column generation rules. Used primarily for logging.
108      *
109      * @since 1.2
110      */

111     public List JavaDoc getParameterValues(BatchQuery query) {
112         List JavaDoc attributes = query.getDbAttributes();
113         int len = attributes.size();
114         List JavaDoc values = new ArrayList JavaDoc(len);
115         for (int i = 0; i < len; i++) {
116             DbAttribute attribute = (DbAttribute) attributes.get(i);
117             if (includeInBatch(attribute)) {
118                 values.add(query.getValue(i));
119             }
120         }
121         return values;
122     }
123
124     public String JavaDoc createSqlString(BatchQuery batch) {
125         String JavaDoc table = batch.getDbEntity().getFullyQualifiedName();
126         List JavaDoc dbAttributes = batch.getDbAttributes();
127
128         StringBuffer JavaDoc query = new StringBuffer JavaDoc("INSERT INTO ");
129         query.append(table).append(" (");
130
131         int columnCount = 0;
132         Iterator JavaDoc it = dbAttributes.iterator();
133
134         while (it.hasNext()) {
135             DbAttribute attribute = (DbAttribute) it.next();
136
137             // attribute inclusion rule - one of the rules below must be true:
138
// (1) attribute not generated
139
// (2) attribute is generated and PK and adapter does not support generated
140
// keys
141

142             if (includeInBatch(attribute)) {
143
144                 if (columnCount > 0) {
145                     query.append(", ");
146                 }
147                 query.append(attribute.getName());
148                 columnCount++;
149             }
150         }
151
152         query.append(") VALUES (");
153
154         for (int i = 0; i < columnCount; i++) {
155             if (i > 0) {
156                 query.append(", ");
157             }
158
159             query.append('?');
160         }
161         query.append(')');
162         return query.toString();
163     }
164
165     /**
166      * Returns true if an attribute should be included in the batch.
167      *
168      * @since 1.2
169      */

170     protected boolean includeInBatch(DbAttribute attribute) {
171         // attribute inclusion rule - one of the rules below must be true:
172
// (1) attribute not generated
173
// (2) attribute is generated and PK and adapter does not support generated
174
// keys
175

176         return !attribute.isGenerated()
177                 || (attribute.isPrimaryKey() && !adapter.supportsGeneratedKeys());
178     }
179 }
Popular Tags