KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > query > model > SqlGenerationContext


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.outerj.daisy.query.model;
17
18 import org.outerj.daisy.repository.query.QueryException;
19 import org.outerj.daisy.jdbcutil.JdbcHelper;
20
21 import java.util.*;
22 import java.sql.PreparedStatement JavaDoc;
23 import java.sql.SQLException JavaDoc;
24
25 /**
26  * Context object used during the generation of SQL from a daisy query.
27  *
28  * <p>The main goal of this class is to keep track of which tables are
29  * required by the conditions, thus which tables will need to be joined in
30  * the "from" clause of the SQL statement. Next to that, it also contains
31  * constants for table and field names so that those aren't scattered
32  * around everywhere in the code.
33  */

34 public class SqlGenerationContext {
35     /** The association table between documents and collections */
36     public static final VersionsTable VERSIONS_TABLE = new VersionsTable();
37     public static final ExtractedLinksTable EXTRACTED_LINKS_TABLE = new ExtractedLinksTable(false);
38     public static final ExtractedLinksTable EXTRACTED_LINKS_TABLE_INVERSE = new ExtractedLinksTable(true);
39     public static final SummariesTable SUMMARIES_TABLE = new SummariesTable();
40     public static final PartsTable PARTS_TABLE = new PartsTable();
41     public static final LocksTable LOCKS_TABLE = new LocksTable();
42
43     private List joinTables = new ArrayList();
44     private int aliasCounter = 0;
45     private final JdbcHelper jdbcHelper;
46
47     public SqlGenerationContext(JdbcHelper jdbcHelper) {
48         this.jdbcHelper = jdbcHelper;
49     }
50
51     public String JavaDoc getNewAliasCounter() {
52         aliasCounter++;
53         return String.valueOf(aliasCounter);
54     }
55
56     public JdbcHelper getJdbcHelper() {
57         return jdbcHelper;
58     }
59
60     private static final ParamString FIELDS_ALIAS_JOIN = new ParamString(" left outer join thefields {alias} on (documents.id = {alias}.doc_id and document_variants.branch_id = {alias}.branch_id and document_variants.lang_id = {alias}.lang_id and document_variants.{versionField} = {alias}.version_id)");
61     private static final String JavaDoc FIELD_TABLEALIAS_PREFIX = "fields";
62     /**
63      * Returns a new alias for a join with the "thefields" table, and adds
64      * a join with it. So no need to call needsJoinWithTable.
65      */

66     public String JavaDoc getNewFieldsTableAlias() {
67         aliasCounter++;
68         final String JavaDoc alias = FIELD_TABLEALIAS_PREFIX + aliasCounter;
69         Table fieldsJoinTable = new Table() {
70             public String JavaDoc getName() {
71                 return "thefields";
72             }
73
74             public String JavaDoc getJoinExpression(boolean searchLastVersion) {
75                 Map params = new HashMap();
76                 params.put("alias", alias);
77                 params.put("versionField", getVersionField(searchLastVersion));
78                 return FIELDS_ALIAS_JOIN.toString(params);
79             }
80
81             public int bindJoin(PreparedStatement JavaDoc stmt, int bindPos) {
82                 return bindPos;
83             }
84         };
85         joinTables.add(fieldsJoinTable);
86         return alias;
87     }
88
89     private static final ParamString COLLECTIONS_ALIAS_JOIN = new ParamString(" left outer join document_collections {alias} on (documents.id = {alias}.document_id and document_variants.branch_id = {alias}.branch_id and document_variants.lang_id = {alias}.lang_id)");
90     private static final String JavaDoc COLLECTIONS_TABLEALIAS_PREFIX = "docs_colls";
91     public String JavaDoc getNewCollectionsTableAlias() {
92         aliasCounter++;
93         final String JavaDoc alias = COLLECTIONS_TABLEALIAS_PREFIX + aliasCounter;
94         Table docCollsJoinTable = new Table() {
95             public String JavaDoc getName() {
96                 return " document_collections ";
97             }
98
99             public String JavaDoc getJoinExpression(boolean searchLastVersion) {
100                 HashMap params = new HashMap();
101                 params.put("alias", alias);
102                 return COLLECTIONS_ALIAS_JOIN.toString(params);
103             }
104
105             public int bindJoin(PreparedStatement JavaDoc stmt, int bindPos) {
106                 return bindPos;
107             }
108         };
109         joinTables.add(docCollsJoinTable);
110         return alias;
111     }
112
113     private static final ParamString CUSTOMFIELDS_ALIAS_JOIN = new ParamString(" left outer join customfields {alias} on (documents.id = {alias}.doc_id and document_variants.branch_id = {alias}.branch_id and document_variants.lang_id = {alias}.lang_id)");
114     private static final String JavaDoc CUSTOMFIELDS_TABLEALIAS_PREFIX = "customfields";
115     public String JavaDoc getNewCustomFieldsTableAlias() {
116         aliasCounter++;
117         final String JavaDoc alias = CUSTOMFIELDS_TABLEALIAS_PREFIX + aliasCounter;
118         Table customFieldsJoinTable = new Table() {
119             public String JavaDoc getName() {
120                 return "customfields";
121             }
122
123             public String JavaDoc getJoinExpression(boolean searchLastVersion) {
124                 Map params = new HashMap();
125                 params.put("alias", alias);
126                 return CUSTOMFIELDS_ALIAS_JOIN.toString(params);
127             }
128
129             public int bindJoin(PreparedStatement JavaDoc stmt, int bindPos) {
130                 return bindPos;
131             }
132         };
133         joinTables.add(customFieldsJoinTable);
134         return alias;
135     }
136
137     private static final ParamString PARTS_ALIAS_JOIN = new ParamString(" left outer join parts {alias} on (documents.id = {alias}.doc_id and document_variants.branch_id = {alias}.branch_id and document_variants.lang_id = {alias}.lang_id and document_variants.{versionField} = {alias}.version_id)");
138     private static final String JavaDoc PARTS_TABLEALIAS_PREFIX = "parts";
139     public String JavaDoc getNewPartsTableAlias() {
140         aliasCounter++;
141         final String JavaDoc alias = PARTS_TABLEALIAS_PREFIX + aliasCounter;
142         Table partsJoinTable = new Table() {
143             public String JavaDoc getName() {
144                 return "parts";
145             }
146
147             public String JavaDoc getJoinExpression(boolean searchLastVersion) {
148                 Map params = new HashMap();
149                 params.put("alias", alias);
150                 params.put("versionField", getVersionField(searchLastVersion));
151                 return PARTS_ALIAS_JOIN.toString(params);
152             }
153
154             public int bindJoin(PreparedStatement JavaDoc stmt, int bindPos) {
155                 return bindPos;
156             }
157         };
158         joinTables.add(partsJoinTable);
159         return alias;
160     }
161
162     /**
163      * Adds a table to join with. If the same Table object is added a second
164      * time, it is ignored. The joins will be performed in the order as added
165      * here.
166      */

167     public void needsJoinWithTable(Table table) {
168         if (!joinTables.contains(table)) // don't join twice on the same table
169
joinTables.add(table);
170     }
171
172     public void appendDocIdSelectClause(StringBuffer JavaDoc sql) {
173         sql.append("select distinct documents.id, document_variants.branch_id, document_variants.lang_id");
174     }
175
176     public int bindJoins(PreparedStatement JavaDoc stmt, int bindPos) throws SQLException JavaDoc, QueryException {
177         Iterator joinedTablesIt = joinTables.iterator();
178         while (joinedTablesIt.hasNext()) {
179             Table table = (Table)joinedTablesIt.next();
180             bindPos = table.bindJoin(stmt, bindPos);
181         }
182         return bindPos;
183     }
184
185     /**
186      * Generates the SQL "from" expression based on the requested field table aliases
187      * (using {@link #getNewFieldsTableAlias()}) and joined tables
188      * (see {@link #needsJoinWithTable(org.outerj.daisy.query.model.SqlGenerationContext.Table)}).
189      * The documents table is always included.
190      */

191     public void appendFromClause(StringBuffer JavaDoc sql, boolean searchLastVersion) {
192         sql.append(" from documents left join document_variants on (documents.id = document_variants.doc_id) ");
193
194         Iterator joinedTablesIt = joinTables.iterator();
195         while (joinedTablesIt.hasNext()) {
196             Table table = (Table)joinedTablesIt.next();
197             sql.append(table.getJoinExpression(searchLastVersion));
198         }
199     }
200
201     public static String JavaDoc getVersionField(boolean searchLastVersion) {
202         if (searchLastVersion)
203             return "lastversion_id";
204         else
205             return "liveversion_id";
206     }
207
208     public interface Table {
209         public String JavaDoc getName();
210
211         public String JavaDoc getJoinExpression(boolean searchLastVersion);
212
213         public int bindJoin(PreparedStatement JavaDoc stmt, int bindPos) throws SQLException JavaDoc, QueryException;
214     }
215
216     /**
217      * Meta information about the association table between documents and collections.
218      */

219     public static final class DocsCollectionsTable {
220         public static final String JavaDoc COLLECTION_ID = "collection_id";
221     }
222
223     /**
224      * Meta information about the table containing version information.
225      */

226     public static final class VersionsTable implements Table {
227         public final String JavaDoc getName() {
228             return " document_versions";
229         }
230
231         public final String JavaDoc getJoinExpression(boolean searchLastVersion) {
232             return " left outer join document_versions on (documents.id = document_versions.doc_id and document_variants.branch_id = document_versions.branch_id and document_variants.lang_id = document_versions.lang_id and document_variants." + getVersionField(searchLastVersion) + " = document_versions.id)";
233         }
234
235         public int bindJoin(PreparedStatement JavaDoc stmt, int bindPos) {
236             return bindPos;
237         }
238
239         public static final String JavaDoc ID = "id";
240         public static final String JavaDoc NAME = "name";
241         public static final String JavaDoc CREATED_ON = "created_on";
242         public static final String JavaDoc CREATED_BY = "created_by";
243         public static final String JavaDoc STATE = "state";
244         public static final String JavaDoc TOTAL_SIZE_OF_PARTS = "total_size_of_parts";
245         public static final String JavaDoc STATE_LAST_MODIFIED = "state_last_modified";
246     }
247
248     public static final class ExtractedLinksTable implements Table {
249         private boolean inverse;
250
251         public ExtractedLinksTable(boolean inverse) {
252             this.inverse = inverse;
253         }
254         public final String JavaDoc getName() {
255             return " extracted_links ";
256         }
257
258         public String JavaDoc getJoinExpression(boolean searchLastVersion) {
259             if (inverse)
260                 return " left outer join extracted_links on (documents.id = extracted_links.target_doc_id and document_variants.branch_id = extracted_links.target_branch_id and document_variants.lang_id = extracted_links.target_lang_id)";
261             else
262                 return " left outer join extracted_links on (documents.id = extracted_links.source_doc_id and document_variants.branch_id = extracted_links.source_branch_id and document_variants.lang_id = extracted_links.source_lang_id)";
263         }
264
265         public int bindJoin(PreparedStatement JavaDoc stmt, int bindPos) {
266             return bindPos;
267         }
268
269         public static final String JavaDoc TARGET_DOC_ID = "target_doc_id";
270         public static final String JavaDoc TARGET_BRANCH_ID = "target_branch_id";
271         public static final String JavaDoc TARGET_LANG_ID = "target_lang_id";
272         public static final String JavaDoc SOURCE_DOC_ID = "source_doc_id";
273         public static final String JavaDoc SOURCE_BRANCH_ID = "source_branch_id";
274         public static final String JavaDoc SOURCE_LANG_ID = "source_lang_id";
275         public static final String JavaDoc IN_LAST_VERSION = "in_last_version";
276         public static final String JavaDoc IN_LIVE_VERSION = "in_live_version";
277         public static final String JavaDoc LINKTYPE = "linktype";
278     }
279
280     public static final class SummariesTable implements Table {
281         public final String JavaDoc getName() {
282             return "summaries";
283         }
284
285         public String JavaDoc getJoinExpression(boolean searchLastVersion) {
286             return " left outer join summaries on (documents.id = summaries.doc_id and document_variants.branch_id = summaries.branch_id and document_variants.lang_id = summaries.lang_id)";
287         }
288
289         public int bindJoin(PreparedStatement JavaDoc stmt, int bindPos) {
290             return bindPos;
291         }
292
293         public static final String JavaDoc SUMMARY = "summary";
294     }
295
296     public static final class PartsTable implements Table {
297         public final String JavaDoc getName() {
298             return "parts";
299         }
300
301         public String JavaDoc getJoinExpression(boolean searchLastVersion) {
302             return " left outer join parts on (documents.id = parts.doc_id and document_variants.branch_id = parts.branch_id and document_variants.lang_id = parts.lang_id and document_variants." + getVersionField(searchLastVersion) + " = parts.version_id)";
303         }
304
305         public int bindJoin(PreparedStatement JavaDoc stmt, int bindPos) {
306             return bindPos;
307         }
308
309         public static final String JavaDoc MIMETYPE = "mimetype";
310         public static final String JavaDoc SIZE = "blob_size";
311         public static final String JavaDoc PARTTYPE_ID = "parttype_id";
312     }
313
314     public static final class FieldTypesTable implements Table {
315         public String JavaDoc getName() {
316             return "field_types";
317         }
318
319         public String JavaDoc getJoinExpression(boolean searchLastVersion) {
320             return " left outer join field_types on (";
321         }
322
323         public int bindJoin(PreparedStatement JavaDoc stmt, int bindPos) {
324             return bindPos;
325         }
326     }
327
328     public static final class LocksTable implements Table {
329         public String JavaDoc getName() {
330             return "locks";
331         }
332
333         public String JavaDoc getJoinExpression(boolean searchLastVersion) {
334             return " left outer join locks on (documents.id = locks.doc_id and document_variants.branch_id = locks.branch_id and document_variants.lang_id = locks.lang_id)";
335         }
336
337         public int bindJoin(PreparedStatement JavaDoc stmt, int bindPos) {
338             return bindPos;
339         }
340
341         public static final String JavaDoc LOCKTYPE = "locktype";
342         public static final String JavaDoc OWNER_ID = "user_id";
343         public static final String JavaDoc TIME_ACQUIRED = "time_acquired";
344         public static final String JavaDoc DURATION = "duration";
345     }
346
347     public static final class FieldsTable {
348         public static final String JavaDoc FIELDTYPE_ID = "fieldtype_id";
349         public static final String JavaDoc STRINGVALUE = "stringvalue";
350         public static final String JavaDoc DATEVALUE = "datevalue";
351         public static final String JavaDoc DATETIMEVALUE = "datetimevalue";
352         public static final String JavaDoc INTEGERVALUE = "integervalue";
353         public static final String JavaDoc FLOATVALUE = "floatvalue";
354         public static final String JavaDoc DECIMALVALUE = "decimalvalue";
355         public static final String JavaDoc BOOLEANVALUE = "booleanvalue";
356         public static final String JavaDoc LINK_DOCID = "link_docid";
357         public static final String JavaDoc LINK_SEARCHBRANCHID = "link_searchbranchid";
358         public static final String JavaDoc LINK_SEARCHLANGID = "link_searchlangid";
359         public static final String JavaDoc LINK_SEARCH = "link_search";
360
361         public static String JavaDoc getValueColumn(QValueType valueType) {
362             String JavaDoc valueColumn;
363             if (valueType == QValueType.STRING)
364                 valueColumn = STRINGVALUE;
365             else if (valueType == QValueType.DATE)
366                 valueColumn = DATEVALUE;
367             else if (valueType == QValueType.DATETIME)
368                 valueColumn = DATETIMEVALUE;
369             else if (valueType == QValueType.DECIMAL)
370                 valueColumn = DECIMALVALUE;
371             else if (valueType == QValueType.DOUBLE)
372                 valueColumn = FLOATVALUE;
373             else if (valueType == QValueType.LONG)
374                 valueColumn = INTEGERVALUE;
375             else if (valueType == QValueType.BOOLEAN)
376                 valueColumn = BOOLEANVALUE;
377             else if (valueType == QValueType.LINK)
378                 valueColumn = LINK_SEARCH;
379             else
380                 throw new RuntimeException JavaDoc("Not a valid field value type: " + valueType);
381             return valueColumn;
382         }
383     }
384
385     public static final class DocumentsTable {
386         public static final String JavaDoc TABLE_NAME = "documents";
387         public static final String JavaDoc CREATED = "created";
388         public static final String JavaDoc ID = "id";
389         public static final String JavaDoc PRIVATE = "private";
390         public static final String JavaDoc OWNER = "owner";
391         public static final String JavaDoc LAST_MODIFIER = "last_modifier";
392         public static final String JavaDoc LAST_MODIFIED = "last_modified";
393     }
394
395     public static final class DocumentVariantsTable {
396         public static final String JavaDoc TABLE_NAME = "document_variants";
397         public static final String JavaDoc DOCTYPE_ID = "doctype_id";
398         public static final String JavaDoc RETIRED = "retired";
399         public static final String JavaDoc LAST_MODIFIER = "last_modifier";
400         public static final String JavaDoc LAST_MODIFIED = "last_modified";
401         public static final String JavaDoc BRANCH_ID = "branch_id";
402         public static final String JavaDoc LANG_ID = "lang_id";
403     }
404
405     public static class CustomFieldsTable {
406         public static final String JavaDoc NAME = "name";
407         public static final String JavaDoc VALUE = "value";
408     }
409 }
410
Popular Tags