KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > storage > search > implementation > database > HSqlSqlHandler


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10 package org.mmbase.storage.search.implementation.database;
11
12 import org.mmbase.storage.search.*;
13 import org.mmbase.util.logging.*;
14
15 /**
16  * The HSQL query handler, implements {@link
17  * org.mmbase.storage.search.implementation.database.SqlHandler SqlHandler} for standard
18  * hsql functionality.
19
20  * @author Michiel Meeuwissen
21  * @version $Id: HSqlSqlHandler.java,v 1.9 2005/10/07 18:50:27 michiel Exp $
22  * @since MMBase-1.7
23  */

24 public class HSqlSqlHandler extends BasicSqlHandler implements SqlHandler {
25
26     private static final Logger log = Logging.getLoggerInstance(HSqlSqlHandler.class);
27
28     /**
29      * Constructor.
30      */

31     public HSqlSqlHandler() {
32         super();
33     }
34
35     // javadoc is inherited
36
public int getSupportLevel(int feature, SearchQuery query) throws SearchQueryException {
37         int result;
38         switch (feature) {
39         case SearchQueryHandler.FEATURE_MAX_NUMBER:
40             result = SearchQueryHandler.SUPPORT_OPTIMAL;
41             break;
42
43         case SearchQueryHandler.FEATURE_OFFSET:
44             result = SearchQueryHandler.SUPPORT_OPTIMAL;
45             break;
46
47         default:
48             result = super.getSupportLevel(feature, query);
49         }
50         return result;
51     }
52
53     /**
54      * @javadoc
55      */

56     protected void appendDateField(StringBuffer JavaDoc sb, Step step, String JavaDoc fieldName, boolean multipleSteps, int datePart) {
57         String JavaDoc datePartFunction = null;
58         switch (datePart) {
59         case FieldValueDateConstraint.CENTURY:
60             datePartFunction = "CENTURY";
61             break;
62         case FieldValueDateConstraint.QUARTER:
63             datePartFunction = "QUARTER";
64             break;
65         case FieldValueDateConstraint.WEEK:
66             datePartFunction = "WEEK";
67             break;
68         case FieldValueDateConstraint.DAY_OF_YEAR:
69             datePartFunction = "DAYOFYEAR";
70             break;
71         case FieldValueDateConstraint.DAY_OF_WEEK:
72             datePartFunction = "DAYOFWEEK";
73             break;
74         default:
75             log.debug("Unknown datePart " + datePart);
76         }
77         if (datePartFunction != null) {
78             sb.append(datePartFunction);
79             sb.append("(");
80             appendField(sb, step, fieldName, multipleSteps);
81             sb.append(")");
82         } else {
83             super.appendDateField(sb, step, fieldName, multipleSteps, datePart);
84         }
85     }
86
87     // javadoc is inherited
88
public String JavaDoc toSql(SearchQuery query, SqlHandler firstInChain) throws SearchQueryException {
89         // XXX should table and field aliases be tested for uniqueness?
90

91         // Test for at least 1 step and 1 field.
92
if (query.getSteps().isEmpty()) {
93             throw new IllegalStateException JavaDoc( "Searchquery has no step (at leas 1 step is required).");
94         }
95         if (query.getFields().isEmpty()) {
96             throw new IllegalStateException JavaDoc("Searchquery has no field (at least 1 field is required).");
97         }
98
99         // SELECT
100
StringBuffer JavaDoc sbQuery = new StringBuffer JavaDoc("SELECT ");
101
102
103
104         // OFFSET & LIMIT
105
int offset = query.getOffset();
106         int limit = query.getMaxNumber();
107         if (offset != 0 || limit > -1) {
108             if (offset == 0) {
109                 sbQuery.append("TOP ").append(limit).append(' ');
110             } else {
111                 if (limit == -1) {
112                     sbQuery.append("LIMIT ").append(offset).append(" 0 ");
113                 } else {
114                     sbQuery.append("LIMIT ").append(offset).append(' ').append(limit).append(' ');
115                     // what if 'limit' == 0?
116
// logically, that should give no results, but it will now be interpreted as -1
117
}
118             }
119
120         }
121         // DISTINCT
122
if (query.isDistinct()) {
123             sbQuery.append("DISTINCT ");
124         }
125
126         firstInChain.appendQueryBodyToSql(sbQuery, query, firstInChain);
127
128         String JavaDoc strSQL = sbQuery.toString();
129         if (log.isDebugEnabled()) {
130             log.debug("generated SQL: " + query + " -- >" + strSQL);
131         }
132         return strSQL;
133     }
134 }
135
Popular Tags