KickJava   Java API By Example, From Geeks To Geeks.

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


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 java.util.*;
13 import org.mmbase.bridge.Field;
14 import org.mmbase.storage.search.*;
15 import org.mmbase.util.logging.*;
16
17 /**
18  * The MySQL query handler, implements {@link
19  * org.mmbase.storage.search.implementation.database.SqlHandler SqlHandler} for standard
20  * MySQL functionality.
21  * <br />
22  * Derived from {@link BasicSqlHandler BasicSqlHandler}, overrides
23  * <ul>
24  * <li>{@link #toSql toSql()}, implements {@link
25  * org.mmbase.storage.search.SearchQueryHandler#FEATURE_MAX_NUMBER
26  * FEATURE_MAX_NUMBER} and {@link
27  * org.mmbase.storage.search.SearchQueryHandler#FEATURE_OFFSET
28  * FEATURE_OFFSET}, by adding a construct like "<code>LIMIT 20</code>" or
29  * "<code>LIMIT 80, 20</code>" after the body, when appropriate.
30  * <li>{@link #getSupportLevel(int,SearchQuery) getSupportLevel(int,SearchQuery)},
31  * returns {@link
32  * org.mmbase.storage.search.SearchQueryHandler#SUPPORT_OPTIMAL
33  * SUPPORT_OPTIMAL} for these features, delegates to the superclass for
34  * other features.
35  * </ul>
36  *
37  * @author Rob van Maris
38  * @version $Id: MySqlSqlHandler.java,v 1.15 2005/12/28 16:07:49 michiel Exp $
39  * @since MMBase-1.7
40  */

41 public class MySqlSqlHandler extends BasicSqlHandler implements SqlHandler {
42
43     private static final Logger log = Logging.getLoggerInstance(MySqlSqlHandler.class);
44
45     /**
46      * Constructor.
47      */

48     public MySqlSqlHandler() {
49         super();
50     }
51
52     // javadoc is inherited
53
public int getSupportLevel(int feature, SearchQuery query) throws SearchQueryException {
54         int result;
55         switch (feature) {
56         case SearchQueryHandler.FEATURE_MAX_NUMBER:
57             result = SearchQueryHandler.SUPPORT_OPTIMAL;
58             break;
59
60         case SearchQueryHandler.FEATURE_OFFSET:
61             result = SearchQueryHandler.SUPPORT_OPTIMAL;
62             break;
63             /*
64         case SearchQueryHandler.FEATURE_REGEXP:
65             result = SearchQueryHandler.SUPPORT_OPTIMAL;
66             break;
67             */

68         default:
69             result = super.getSupportLevel(feature, query);
70         }
71         return result;
72     }
73
74     // javadoc inherited
75
protected boolean useLower(FieldCompareConstraint constraint) {
76         return true; // necessary for the larger strings which are stored in blobs
77
}
78
79     protected StringBuffer JavaDoc appendLikeOperator(StringBuffer JavaDoc sb, boolean caseSensitive) {
80         if (caseSensitive) {
81             sb.append(" LIKE BINARY ");
82         } else {
83             sb.append(" LIKE ");
84         }
85         return sb;
86     }
87
88     /*
89     protected StringBuffer appendRegularExpressionOperator(StringBuffer sb, boolean caseSensitive) {
90         if (caseSensitive) {
91             sb.append(" REGEXP BINARY ");
92         } else {
93             sb.append(" REGEXP ");
94         }
95         return sb;
96     }
97     */

98
99     /**
100      * @javadoc
101      */

102     protected void appendDateField(StringBuffer JavaDoc sb, Step step, String JavaDoc fieldName, boolean multipleSteps, int datePart) {
103         String JavaDoc datePartFunction = null;
104         switch (datePart) {
105         case FieldValueDateConstraint.CENTURY:
106             datePartFunction = "CENTURY";
107             break;
108         case FieldValueDateConstraint.QUARTER:
109             datePartFunction = "QUARTER";
110             break;
111         case FieldValueDateConstraint.WEEK:
112             datePartFunction = "WEEK";
113             break;
114         case FieldValueDateConstraint.DAY_OF_YEAR:
115             datePartFunction = "DAYOFYEAR";
116             break;
117         case FieldValueDateConstraint.DAY_OF_WEEK:
118             datePartFunction = "DAYOFWEEK";
119                 break;
120         default:
121             log.debug("Unknown datePart " + datePart);
122         }
123         if (datePartFunction != null) {
124             sb.append(datePartFunction);
125             sb.append("(");
126             appendField(sb, step, fieldName, multipleSteps);
127             sb.append(")");
128         } else {
129             super.appendDateField(sb, step, fieldName, multipleSteps, datePart);
130         }
131     }
132     protected StringBuffer JavaDoc appendSortOrderField(StringBuffer JavaDoc sb, SortOrder sortOrder, boolean multipleSteps) {
133         if (sortOrder.isCaseSensitive() && sortOrder.getField().getType() == Field.TYPE_STRING) {
134             sb.append("BINARY ");
135         }
136         // Fieldname.
137
Step step = sortOrder.getField().getStep();
138         appendField(sb, step, sortOrder.getField().getFieldName(), multipleSteps);
139         return sb;
140     }
141
142     // javadoc is inherited
143
public String JavaDoc toSql(SearchQuery query, SqlHandler firstInChain) throws SearchQueryException {
144         // XXX should table and field aliases be tested for uniqueness?
145

146         // Test for at least 1 step and 1 field.
147
if (query.getSteps().isEmpty()) {
148             throw new IllegalStateException JavaDoc(
149             "Searchquery has no step (at leas 1 step is required).");
150         }
151         if (query.getFields().isEmpty()) {
152             throw new IllegalStateException JavaDoc(
153             "Searchquery has no field (at least 1 field is required).");
154         }
155
156         // SELECT
157
StringBuffer JavaDoc sbQuery = new StringBuffer JavaDoc("SELECT ");
158
159         // DISTINCT
160
if (query.isDistinct()) {
161             sbQuery.append("DISTINCT ");
162         }
163
164         firstInChain.appendQueryBodyToSql(sbQuery, query, firstInChain);
165
166         // LIMIT
167
if (query.getMaxNumber() != -1) {
168             // Maxnumber set.
169
sbQuery.append(" LIMIT ");
170             if (query.getOffset() != 0) {
171                 sbQuery.append(query.getOffset()).
172                 append(",");
173             }
174             sbQuery.append(query.getMaxNumber());
175         } else {
176             // Offset > 0, maxnumber not set.
177
if (query.getOffset() != 0) {
178                 sbQuery.append(" LIMIT ").
179                 append(query.getOffset()).
180                 append(",").
181                 append(Integer.MAX_VALUE);
182             }
183         }
184
185         String JavaDoc strSQL = sbQuery.toString();
186         if (log.isDebugEnabled()) {
187             log.debug("generated SQL: " + strSQL);
188         }
189         return strSQL;
190     }
191 }
192
Popular Tags