/** * Gets the SQL to use to refer to a column in an expression. * <p> * Needed for Oracle CLOB. * * @param column the column used in an expression * @return the SQL to use to refer to it * * @since 10.10 */ public String getQuotedNameForExpression(Column column) { return column.getQuotedName(); }
@Override public String getNoColumnsInsertString(Column idColumn) { // INSERT INTO foo () VALUES () or DEFAULT VALUES is not legal for Oracle, you need at least one column return String.format("(%s) VALUES (DEFAULT)", idColumn.getQuotedName()); }
protected void visitColumn(Column column) { visitedColumn = column; clause.append(column.getQuotedName()); }
@Override public String getCreateFulltextIndexSql(String indexName, String quotedIndexName, Table table, List<Column> columns, Model model) { return String.format( "CREATE INDEX %s ON %s(%s) INDEXTYPE IS CTXSYS.CONTEXT " + "PARAMETERS('%s SYNC (ON COMMIT) TRANSACTIONAL')", quotedIndexName, table.getQuotedName(), columns.get(0).getQuotedName(), fulltextParameters); }
@Override public String getCreateFulltextIndexSql(String indexName, String quotedIndexName, Table table, List<Column> columns, Model model) { String sql; if (compatibilityFulltextTable) { sql = "CREATE INDEX %s ON %s USING GIN(%s)"; } else { sql = "CREATE INDEX %s ON %s USING GIN(NX_TO_TSVECTOR(%s))"; } return String.format(sql, quotedIndexName.toLowerCase(), table.getQuotedName(), columns.get(0).getQuotedName()); }
@Override public String toSql() { Table table = arrayColumn.getTable(); return String.format("(SELECT %s, UNNEST(%s) AS %s, generate_subscripts(%s, 1) AS %s FROM %s) ", table.getColumn(Model.MAIN_KEY).getQuotedName(), arrayColumn.getQuotedName(), Model.COLL_TABLE_VALUE_KEY, arrayColumn.getQuotedName(), Model.COLL_TABLE_POS_KEY, table.getRealTable().getQuotedName()); } }
@Override public String getCreateFulltextIndexSql(String indexName, String quotedIndexName, Table table, List<Column> columns, Model model) { StringBuilder buf = new StringBuilder(); buf.append(String.format("CREATE FULLTEXT INDEX ON %s (", table.getQuotedName())); Iterator<Column> it = columns.iterator(); while (it.hasNext()) { buf.append(String.format("%s LANGUAGE %s", it.next().getQuotedName(), getQuotedFulltextAnalyzer())); if (it.hasNext()) { buf.append(", "); } } String fulltextUniqueIndex = "[fulltext_pk]"; buf.append(String.format(") KEY INDEX %s ON [%s]", fulltextUniqueIndex, fulltextCatalog)); return buf.toString(); }
@Override public String getUpsertSql(List<Column> columns, List<Serializable> values, List<Column> outColumns, List<Serializable> outValues) { Column keyColumn = columns.get(0); Table table = keyColumn.getTable(); StringBuilder sql = new StringBuilder(); sql.append("MERGE INTO "); sql.append(table.getQuotedName()); sql.append(" KEY ("); sql.append(keyColumn.getQuotedName()); sql.append(") VALUES ("); for (int i = 0; i < columns.size(); i++) { if (i != 0) { sql.append(", "); } sql.append("?"); outColumns.add(columns.get(i)); outValues.add(values.get(i)); } sql.append(")"); return sql.toString(); }
protected void postProcessDelete() { Delete delete = new Delete(table); String wheres = table.getColumns() .stream() .filter(col -> Model.MAIN_KEY.equals(col.getKey())) .map(col -> col.getQuotedName() + " = ?") .collect(Collectors.joining(" AND ")); delete.setWhere(wheres); deleteSqlMap.put(tableName, delete.getStatement()); }
public void removeLinksFor(String column, String entryId, SQLSession session) { String sql = String.format("DELETE FROM %s WHERE %s = ?", table.getQuotedName(), table.getColumn(column) .getQuotedName()); if (session.logger.isLogEnabled()) { session.logger.logSQL(sql, Collections.<Serializable> singleton(entryId)); } try (PreparedStatement ps = session.sqlConnection.prepareStatement(sql)) { ps.setString(1, entryId); ps.execute(); } catch (SQLException e) { throw new DirectoryException("error remove links to " + entryId, e); } }
/** * Adds to buf the column name and its type and constraints for create / alter. */ protected void addOneColumn(StringBuilder buf, Column column) { buf.append(column.getQuotedName()); buf.append(' '); buf.append(column.getSqlTypeString()); String defaultValue = column.getDefaultValue(); if (defaultValue != null) { buf.append(" DEFAULT "); buf.append(defaultValue); } if (column.isNullable()) { buf.append(dialect.getNullColumnString()); } else { buf.append(" NOT NULL"); } }
protected void addFilterWhereClause(StringBuilder clause, List<ColumnAndValue> params) { if (staticFilters.length == 0) { return; } for (SQLStaticFilter filter : staticFilters) { if (clause.length() > 0) { clause.append(" AND "); } Column column = filter.getDirectoryColumn(table, getDirectory().useNativeCase()); clause.append(column.getQuotedName()); clause.append(" "); clause.append(filter.getOperator()); clause.append(" ?"); params.add(new ColumnAndValue(column, filter.getValue())); } }
/** * Returns the clause used to match a given row by id in the given table. * <p> * Takes into account soft deletes. * * @param tableName the table name * @return the clause, like {@code table.id = ?} */ public String getIdEqualsClause(String tableName) { return database.getTable(tableName).getColumn(Model.MAIN_KEY).getQuotedName() + " = ?" + getSoftDeleteClause(tableName); }
public boolean exists(String sourceId, String targetId, SQLSession session) { // "SELECT COUNT(*) FROM %s WHERE %s = ? AND %s = ?", tableName, sourceColumn, targetColumn Select select = new Select(table); select.setFrom(table.getQuotedName()); select.setWhat("count(*)"); String whereString = String.format("%s = ? and %s = ?", table.getColumn(sourceColumn).getQuotedName(), table.getColumn(targetColumn).getQuotedName()); select.setWhere(whereString); String selectSql = select.getStatement(); if (session.logger.isLogEnabled()) { session.logger.logSQL(selectSql, Arrays.<Serializable> asList(sourceId, targetId)); } try (PreparedStatement ps = session.sqlConnection.prepareStatement(selectSql)) { ps.setString(1, sourceId); ps.setString(2, targetId); try (ResultSet rs = ps.executeQuery()) { rs.next(); return rs.getInt(1) > 0; } } catch (SQLException e) { throw new DirectoryException(String.format("error reading link from %s to %s", sourceId, targetId), e); } }
protected String addFilterWhereClause(String whereClause) { if (staticFilters.length == 0) { return whereClause; } if (whereClause != null && whereClause.trim().length() > 0) { whereClause = whereClause + " AND "; } else { whereClause = ""; } for (int i = 0; i < staticFilters.length; i++) { SQLStaticFilter filter = staticFilters[i]; whereClause += filter.getDirectoryColumn(table, getDirectory().useNativeCase()).getQuotedName(); whereClause += " " + filter.getOperator() + " "; whereClause += "? "; if (i < staticFilters.length - 1) { whereClause = whereClause + " AND "; } } return whereClause; }
protected void postProcessRootIdSelect() { String what = null; String where = null; for (Column column : table.getColumns()) { String key = column.getKey(); String qname = column.getQuotedName(); if (key.equals(Model.MAIN_KEY)) { what = qname; selectRootIdWhatColumn = column; } else if (key.equals(Model.REPOINFO_REPONAME_KEY)) { where = qname + " = ?"; } else { throw new RuntimeException(column.toString()); } } Select select = new Select(table); select.setWhat(what); select.setFrom(table.getQuotedName()); select.setWhere(where); selectRootIdSql = select.getStatement(); }
protected void postProcessClusterInvalidations() { clusterInvalidationsColumns = Arrays.asList(table.getColumn(Model.CLUSTER_INVALS_NODEID_KEY), table.getColumn(Model.CLUSTER_INVALS_ID_KEY), table.getColumn(Model.CLUSTER_INVALS_FRAGMENTS_KEY), table.getColumn(Model.CLUSTER_INVALS_KIND_KEY)); Delete delete = new Delete(table); Column column = table.getColumn(Model.CLUSTER_INVALS_NODEID_KEY); delete.setWhere(column.getQuotedName() + " = ?"); deleteClusterInvalsSql = delete.getStatement(); deleteClusterInvalsColumn = column; }
@Override public void deleteEntryWithoutReferences(String id) { // second step: clean stored fields Delete delete = new Delete(table); String whereString = table.getPrimaryColumn().getQuotedName() + " = ?"; delete.setWhere(whereString); String sql = delete.getStatement(); if (logger.isLogEnabled()) { logger.logSQL(sql, Collections.singleton(id)); } try (PreparedStatement ps = sqlConnection.prepareStatement(sql)) { setFieldValue(ps, 1, table.getPrimaryColumn(), id); ps.execute(); } catch (SQLException e) { checkConcurrentUpdate(e); throw new DirectoryException("deleteEntry failed", e); } }
protected void postProcessClusterNodes() { Collection<Column> columns = table.getColumns(); Insert insert = new Insert(table); for (Column column : columns) { insert.addColumn(column); } createClusterNodeSql = insert.getStatement(); createClusterNodeColumns = new ArrayList<>(columns); Delete delete = new Delete(table); Column column = table.getColumn(Model.CLUSTER_NODES_NODEID_KEY); delete.setWhere(column.getQuotedName() + " = ?"); deleteClusterNodeSql = delete.getStatement(); deleteClusterNodeColumn = column; }
protected String getArrayOpSql(Column arrayColumn, String refName, boolean positive, Table dataHierTable, String op) { Table table = arrayColumn.getTable(); String tableAliasName = openQuote() + getTableName(refName) + closeQuote(); String sql = String.format("EXISTS (SELECT 1 FROM %s AS %s WHERE %s = %s AND %s %s ?)", getArraySubQuery(arrayColumn, tableAliasName).toSql(), tableAliasName, dataHierTable.getColumn(Model.MAIN_KEY).getFullQuotedName(), tableAliasName + '.' + table.getColumn(Model.MAIN_KEY).getQuotedName(), tableAliasName + '.' + Model.COLL_TABLE_VALUE_KEY, op); if (!positive) { sql = "NOT(" + sql + ")"; } return sql; }