1 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 ; 23 import java.sql.SQLException ; 24 25 34 public class SqlGenerationContext { 35 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 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 FIELD_TABLEALIAS_PREFIX = "fields"; 62 66 public String getNewFieldsTableAlias() { 67 aliasCounter++; 68 final String alias = FIELD_TABLEALIAS_PREFIX + aliasCounter; 69 Table fieldsJoinTable = new Table() { 70 public String getName() { 71 return "thefields"; 72 } 73 74 public String 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 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 COLLECTIONS_TABLEALIAS_PREFIX = "docs_colls"; 91 public String getNewCollectionsTableAlias() { 92 aliasCounter++; 93 final String alias = COLLECTIONS_TABLEALIAS_PREFIX + aliasCounter; 94 Table docCollsJoinTable = new Table() { 95 public String getName() { 96 return " document_collections "; 97 } 98 99 public String 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 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 CUSTOMFIELDS_TABLEALIAS_PREFIX = "customfields"; 115 public String getNewCustomFieldsTableAlias() { 116 aliasCounter++; 117 final String alias = CUSTOMFIELDS_TABLEALIAS_PREFIX + aliasCounter; 118 Table customFieldsJoinTable = new Table() { 119 public String getName() { 120 return "customfields"; 121 } 122 123 public String 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 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 PARTS_TABLEALIAS_PREFIX = "parts"; 139 public String getNewPartsTableAlias() { 140 aliasCounter++; 141 final String alias = PARTS_TABLEALIAS_PREFIX + aliasCounter; 142 Table partsJoinTable = new Table() { 143 public String getName() { 144 return "parts"; 145 } 146 147 public String 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 stmt, int bindPos) { 155 return bindPos; 156 } 157 }; 158 joinTables.add(partsJoinTable); 159 return alias; 160 } 161 162 167 public void needsJoinWithTable(Table table) { 168 if (!joinTables.contains(table)) joinTables.add(table); 170 } 171 172 public void appendDocIdSelectClause(StringBuffer sql) { 173 sql.append("select distinct documents.id, document_variants.branch_id, document_variants.lang_id"); 174 } 175 176 public int bindJoins(PreparedStatement stmt, int bindPos) throws SQLException , 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 191 public void appendFromClause(StringBuffer 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 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 getName(); 210 211 public String getJoinExpression(boolean searchLastVersion); 212 213 public int bindJoin(PreparedStatement stmt, int bindPos) throws SQLException , QueryException; 214 } 215 216 219 public static final class DocsCollectionsTable { 220 public static final String COLLECTION_ID = "collection_id"; 221 } 222 223 226 public static final class VersionsTable implements Table { 227 public final String getName() { 228 return " document_versions"; 229 } 230 231 public final String 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 stmt, int bindPos) { 236 return bindPos; 237 } 238 239 public static final String ID = "id"; 240 public static final String NAME = "name"; 241 public static final String CREATED_ON = "created_on"; 242 public static final String CREATED_BY = "created_by"; 243 public static final String STATE = "state"; 244 public static final String TOTAL_SIZE_OF_PARTS = "total_size_of_parts"; 245 public static final String 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 getName() { 255 return " extracted_links "; 256 } 257 258 public String 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 stmt, int bindPos) { 266 return bindPos; 267 } 268 269 public static final String TARGET_DOC_ID = "target_doc_id"; 270 public static final String TARGET_BRANCH_ID = "target_branch_id"; 271 public static final String TARGET_LANG_ID = "target_lang_id"; 272 public static final String SOURCE_DOC_ID = "source_doc_id"; 273 public static final String SOURCE_BRANCH_ID = "source_branch_id"; 274 public static final String SOURCE_LANG_ID = "source_lang_id"; 275 public static final String IN_LAST_VERSION = "in_last_version"; 276 public static final String IN_LIVE_VERSION = "in_live_version"; 277 public static final String LINKTYPE = "linktype"; 278 } 279 280 public static final class SummariesTable implements Table { 281 public final String getName() { 282 return "summaries"; 283 } 284 285 public String 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 stmt, int bindPos) { 290 return bindPos; 291 } 292 293 public static final String SUMMARY = "summary"; 294 } 295 296 public static final class PartsTable implements Table { 297 public final String getName() { 298 return "parts"; 299 } 300 301 public String 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 stmt, int bindPos) { 306 return bindPos; 307 } 308 309 public static final String MIMETYPE = "mimetype"; 310 public static final String SIZE = "blob_size"; 311 public static final String PARTTYPE_ID = "parttype_id"; 312 } 313 314 public static final class FieldTypesTable implements Table { 315 public String getName() { 316 return "field_types"; 317 } 318 319 public String getJoinExpression(boolean searchLastVersion) { 320 return " left outer join field_types on ("; 321 } 322 323 public int bindJoin(PreparedStatement stmt, int bindPos) { 324 return bindPos; 325 } 326 } 327 328 public static final class LocksTable implements Table { 329 public String getName() { 330 return "locks"; 331 } 332 333 public String 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 stmt, int bindPos) { 338 return bindPos; 339 } 340 341 public static final String LOCKTYPE = "locktype"; 342 public static final String OWNER_ID = "user_id"; 343 public static final String TIME_ACQUIRED = "time_acquired"; 344 public static final String DURATION = "duration"; 345 } 346 347 public static final class FieldsTable { 348 public static final String FIELDTYPE_ID = "fieldtype_id"; 349 public static final String STRINGVALUE = "stringvalue"; 350 public static final String DATEVALUE = "datevalue"; 351 public static final String DATETIMEVALUE = "datetimevalue"; 352 public static final String INTEGERVALUE = "integervalue"; 353 public static final String FLOATVALUE = "floatvalue"; 354 public static final String DECIMALVALUE = "decimalvalue"; 355 public static final String BOOLEANVALUE = "booleanvalue"; 356 public static final String LINK_DOCID = "link_docid"; 357 public static final String LINK_SEARCHBRANCHID = "link_searchbranchid"; 358 public static final String LINK_SEARCHLANGID = "link_searchlangid"; 359 public static final String LINK_SEARCH = "link_search"; 360 361 public static String getValueColumn(QValueType valueType) { 362 String 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 ("Not a valid field value type: " + valueType); 381 return valueColumn; 382 } 383 } 384 385 public static final class DocumentsTable { 386 public static final String TABLE_NAME = "documents"; 387 public static final String CREATED = "created"; 388 public static final String ID = "id"; 389 public static final String PRIVATE = "private"; 390 public static final String OWNER = "owner"; 391 public static final String LAST_MODIFIER = "last_modifier"; 392 public static final String LAST_MODIFIED = "last_modified"; 393 } 394 395 public static final class DocumentVariantsTable { 396 public static final String TABLE_NAME = "document_variants"; 397 public static final String DOCTYPE_ID = "doctype_id"; 398 public static final String RETIRED = "retired"; 399 public static final String LAST_MODIFIER = "last_modifier"; 400 public static final String LAST_MODIFIED = "last_modified"; 401 public static final String BRANCH_ID = "branch_id"; 402 public static final String LANG_ID = "lang_id"; 403 } 404 405 public static class CustomFieldsTable { 406 public static final String NAME = "name"; 407 public static final String VALUE = "value"; 408 } 409 } 410 | Popular Tags |