@Override public String getMatchMixinType( Column mixinsColumn, String mixin, boolean positive, String[] returnParam) { returnParam[0] = mixin; String sql = "ARRAY[?] <@ " + mixinsColumn.getFullQuotedName(); return positive ? sql : "NOT(" + sql + ")"; }
@Override public void setToPreparedStatement( PreparedStatement ps, int index, Serializable value, Column column) throws SQLException { switch (column.getJdbcType()) { case Types.VARCHAR: case Types.CLOB: setToPreparedStatementString(ps, index, value, column); return; case Types.BIT: ps.setBoolean(index, ((Boolean) value).booleanValue()); return; case Types.SMALLINT: ps.setInt(index, ((Long) value).intValue()); return; case Types.INTEGER: case Types.BIGINT: ps.setLong(index, ((Long) value).longValue()); return; case Types.DOUBLE: ps.setDouble(index, ((Double) value).doubleValue()); return; case Types.TIMESTAMP: setToPreparedStatementTimestamp(ps, index, value, column); return; case Types.ARRAY: Array array = createArrayOf(Types.VARCHAR, (Object[]) value, ps.getConnection()); ps.setArray(index, array); return; case Types.OTHER: if (column.getType() == ColumnType.FTSTORED) { ps.setString(index, (String) value); return; } throw new SQLException("Unhandled type: " + column.getType()); default: throw new SQLException("Unhandled JDBC type: " + column.getJdbcType()); } }
@Override @SuppressWarnings("boxing") public Serializable getFromResultSet(ResultSet rs, int index, Column column) throws SQLException { switch (column.getJdbcType()) { case Types.VARCHAR: case Types.CLOB: return getFromResultSetString(rs, index, column); case Types.BIT: return rs.getBoolean(index); case Types.SMALLINT: case Types.INTEGER: case Types.BIGINT: return rs.getLong(index); case Types.DOUBLE: return rs.getDouble(index); case Types.TIMESTAMP: return getFromResultSetTimestamp(rs, index, column); case Types.ARRAY: Array array = rs.getArray(index); return array == null ? null : (Serializable) array.getArray(); } throw new SQLException("Unhandled JDBC type: " + column.getJdbcType()); }
@Override public Map<String, Serializable> getSQLStatementsProperties(Model model, Database database) { Map<String, Serializable> properties = new HashMap<String, Serializable>(); properties.put("idType", "varchar(36)"); properties.put("aclOptimizationsEnabled", Boolean.valueOf(aclOptimizationsEnabled)); properties.put("pathOptimizationsEnabled", Boolean.valueOf(pathOptimizationsEnabled)); properties.put("fulltextAnalyzer", fulltextAnalyzer); properties.put("fulltextEnabled", Boolean.valueOf(!fulltextDisabled)); if (!fulltextDisabled) { Table ft = database.getTable(model.FULLTEXT_TABLE_NAME); properties.put("fulltextTable", ft.getQuotedName()); ModelFulltext fti = model.getFulltextInfo(); List<String> lines = new ArrayList<String>(fti.indexNames.size()); for (String indexName : fti.indexNames) { String suffix = model.getFulltextIndexSuffix(indexName); Column ftft = ft.getColumn(model.FULLTEXT_FULLTEXT_KEY + suffix); Column ftst = ft.getColumn(model.FULLTEXT_SIMPLETEXT_KEY + suffix); Column ftbt = ft.getColumn(model.FULLTEXT_BINARYTEXT_KEY + suffix); String concat; if (compatibilityFulltextTable) { // tsvector concat = " NEW.%s := COALESCE(NEW.%s, ''::TSVECTOR) || COALESCE(NEW.%s, ''::TSVECTOR);"; } else { // text with space at beginning and end concat = " NEW.%s := ' ' || COALESCE(NEW.%s, '') || ' ' || COALESCE(NEW.%s, '') || ' ';"; } String line = String.format(concat, ftft.getQuotedName(), ftst.getQuotedName(), ftbt.getQuotedName()); lines.add(line); } properties.put("fulltextTriggerStatements", StringUtils.join(lines, "\n")); } String[] permissions = NXCore.getSecurityService().getPermissionsToCheck(SecurityConstants.BROWSE); List<String> permsList = new LinkedList<String>(); for (String perm : permissions) { permsList.add("('" + perm + "')"); } properties.put("readPermissions", StringUtils.join(permsList, ", ")); properties.put("usersSeparator", getUsersSeparator()); properties.put("everyone", SecurityConstants.EVERYONE); properties.put("readAclMaxSize", Integer.toString(readAclMaxSize)); return properties; }
// SELECT ..., TS_RANK_CD(fulltext, nxquery, 32) as nxscore // FROM ... LEFT JOIN fulltext ON fulltext.id = hierarchy.id // , TO_TSQUERY('french', ?) as nxquery // WHERE ... // AND NX_TO_TSVECTOR(fulltext) @@ nxquery // AND fulltext LIKE '% foo bar %' -- when phrase search // ORDER BY nxscore DESC @Override public FulltextMatchInfo getFulltextScoredMatchInfo( String fulltextQuery, String indexName, int nthMatch, Column mainColumn, Model model, Database database) { String indexSuffix = model.getFulltextIndexSuffix(indexName); Table ft = database.getTable(model.FULLTEXT_TABLE_NAME); Column ftMain = ft.getColumn(model.MAIN_KEY); Column ftColumn = ft.getColumn(model.FULLTEXT_FULLTEXT_KEY + indexSuffix); String ftColumnName = ftColumn.getFullQuotedName(); String nthSuffix = nthMatch == 1 ? "" : String.valueOf(nthMatch); String queryAlias = "_nxquery" + nthSuffix; FulltextMatchInfo info = new FulltextMatchInfo(); info.joins = new ArrayList<Join>(); if (nthMatch == 1) { // Need only one JOIN involving the fulltext table info.joins.add( new Join( Join.INNER, ft.getQuotedName(), null, null, ftMain.getFullQuotedName(), mainColumn.getFullQuotedName())); } /* * for phrase search, fulltextQuery may contain a LIKE part */ String like; if (fulltextQuery.contains(FT_LIKE_SEP)) { String[] tmp = fulltextQuery.split(FT_LIKE_SEP, 2); fulltextQuery = tmp[0]; like = tmp[1].replace(FT_LIKE_COL, ftColumnName); } else { like = null; } info.joins.add( new Join( Join.IMPLICIT, // String.format("TO_TSQUERY('%s', ?)", fulltextAnalyzer), queryAlias, // alias fulltextQuery, // param null, null)); String tsvector; if (compatibilityFulltextTable) { tsvector = ftColumnName; } else { tsvector = String.format("NX_TO_TSVECTOR(%s)", ftColumnName); } String where = String.format("(%s @@ %s)", queryAlias, tsvector); if (like != null) { where += " AND (" + like + ")"; } info.whereExpr = where; info.scoreExpr = String.format("TS_RANK_CD(%s, %s, 32)", tsvector, queryAlias); info.scoreAlias = "_nxscore" + nthSuffix; info.scoreCol = new Column(mainColumn.getTable(), null, ColumnType.DOUBLE, null); return info; }