1 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 41 public class MySqlSqlHandler extends BasicSqlHandler implements SqlHandler { 42 43 private static final Logger log = Logging.getLoggerInstance(MySqlSqlHandler.class); 44 45 48 public MySqlSqlHandler() { 49 super(); 50 } 51 52 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 68 default: 69 result = super.getSupportLevel(feature, query); 70 } 71 return result; 72 } 73 74 protected boolean useLower(FieldCompareConstraint constraint) { 76 return true; } 78 79 protected StringBuffer appendLikeOperator(StringBuffer sb, boolean caseSensitive) { 80 if (caseSensitive) { 81 sb.append(" LIKE BINARY "); 82 } else { 83 sb.append(" LIKE "); 84 } 85 return sb; 86 } 87 88 98 99 102 protected void appendDateField(StringBuffer sb, Step step, String fieldName, boolean multipleSteps, int datePart) { 103 String 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 appendSortOrderField(StringBuffer sb, SortOrder sortOrder, boolean multipleSteps) { 133 if (sortOrder.isCaseSensitive() && sortOrder.getField().getType() == Field.TYPE_STRING) { 134 sb.append("BINARY "); 135 } 136 Step step = sortOrder.getField().getStep(); 138 appendField(sb, step, sortOrder.getField().getFieldName(), multipleSteps); 139 return sb; 140 } 141 142 public String toSql(SearchQuery query, SqlHandler firstInChain) throws SearchQueryException { 144 146 if (query.getSteps().isEmpty()) { 148 throw new IllegalStateException ( 149 "Searchquery has no step (at leas 1 step is required)."); 150 } 151 if (query.getFields().isEmpty()) { 152 throw new IllegalStateException ( 153 "Searchquery has no field (at least 1 field is required)."); 154 } 155 156 StringBuffer sbQuery = new StringBuffer ("SELECT "); 158 159 if (query.isDistinct()) { 161 sbQuery.append("DISTINCT "); 162 } 163 164 firstInChain.appendQueryBodyToSql(sbQuery, query, firstInChain); 165 166 if (query.getMaxNumber() != -1) { 168 sbQuery.append(" LIMIT "); 170 if (query.getOffset() != 0) { 171 sbQuery.append(query.getOffset()). 172 append(","); 173 } 174 sbQuery.append(query.getMaxNumber()); 175 } else { 176 if (query.getOffset() != 0) { 178 sbQuery.append(" LIMIT "). 179 append(query.getOffset()). 180 append(","). 181 append(Integer.MAX_VALUE); 182 } 183 } 184 185 String strSQL = sbQuery.toString(); 186 if (log.isDebugEnabled()) { 187 log.debug("generated SQL: " + strSQL); 188 } 189 return strSQL; 190 } 191 } 192 | Popular Tags |