Search in sources :

Example 1 with CQLFeatureUnsupportedException

use of org.folio.cql2pgjson.exception.CQLFeatureUnsupportedException in project raml-module-builder by folio-org.

the class CQL2PgJSON method indexNode.

private String indexNode(String index, Table targetTable, CQLTermNode node, IndexTextAndJsonValues vals, CqlModifiers modifiers) throws QueryValidationException {
    // primary key
    if ("id".equals(index)) {
        return pgId(node, index);
    }
    DbIndex dbIndex;
    if (targetTable == null || dbTable.equals(targetTable)) {
        dbIndex = dbIndexMap.computeIfAbsent(index, i -> DbSchemaUtils.getDbIndex(dbTable, index));
    } else {
        // foreign table
        dbIndex = dbIndexMap.computeIfAbsent(vals.getIndexJson(), i -> DbSchemaUtils.getDbIndex(targetTable, index));
    }
    if (dbIndex.isForeignKey()) {
        return pgId(node, index);
    }
    String comparator = node.getRelation().getBase().toLowerCase();
    switch(comparator) {
        case "=":
            if (CqlTermFormat.NUMBER == modifiers.getCqlTermFormat()) {
                return queryBySql(dbIndex, vals, node, comparator, modifiers);
            } else {
                return queryByFt(index, dbIndex, vals, node, comparator, modifiers, targetTable);
            }
        case "adj":
        case "all":
        case "any":
            return queryByFt(index, dbIndex, vals, node, comparator, modifiers, targetTable);
        case "==":
        case "<>":
            if (CqlTermFormat.STRING == modifiers.getCqlTermFormat()) {
                return queryByLike(index, dbIndex, vals, node, comparator, modifiers, targetTable);
            } else {
                return queryBySql(dbIndex, vals, node, comparator, modifiers);
            }
        case "<":
        case ">":
        case "<=":
        case ">=":
            return queryBySql(dbIndex, vals, node, comparator, modifiers);
        default:
            throw new CQLFeatureUnsupportedException("Relation " + comparator + " not implemented yet: " + node.toString());
    }
}
Also used : ModifierSet(org.z3950.zing.cql.ModifierSet) SqlSelect(org.folio.cql2pgjson.model.SqlSelect) Cql2SqlUtil(org.folio.cql2pgjson.util.Cql2SqlUtil) CqlCase(org.folio.cql2pgjson.model.CqlCase) CQLTermNode(org.z3950.zing.cql.CQLTermNode) HashMap(java.util.HashMap) DbIndex(org.folio.cql2pgjson.model.DbIndex) CQLOrNode(org.z3950.zing.cql.CQLOrNode) StringUtils(org.apache.commons.lang3.StringUtils) ArrayList(java.util.ArrayList) Level(java.util.logging.Level) CqlTermFormat(org.folio.cql2pgjson.model.CqlTermFormat) Index(org.folio.dbschema.Index) ObjectMapperTool(org.folio.dbschema.ObjectMapperTool) ObjectUtils(org.apache.commons.lang3.ObjectUtils) CqlSort(org.folio.cql2pgjson.model.CqlSort) DbFkInfo(org.folio.cql2pgjson.model.DbFkInfo) Map(java.util.Map) QueryValidationException(org.folio.cql2pgjson.exception.QueryValidationException) CQLParseException(org.z3950.zing.cql.CQLParseException) Schema(org.folio.dbschema.Schema) Table(org.folio.dbschema.Table) LinkedList(java.util.LinkedList) CQLFeatureUnsupportedException(org.folio.cql2pgjson.exception.CQLFeatureUnsupportedException) CQLSortNode(org.z3950.zing.cql.CQLSortNode) Modifier(org.z3950.zing.cql.Modifier) CQLBooleanNode(org.z3950.zing.cql.CQLBooleanNode) IndexTextAndJsonValues(org.folio.cql2pgjson.model.IndexTextAndJsonValues) SqlUtil(org.folio.dbschema.util.SqlUtil) IOException(java.io.IOException) CqlAccents(org.folio.cql2pgjson.model.CqlAccents) DbSchemaUtils(org.folio.cql2pgjson.util.DbSchemaUtils) Logger(java.util.logging.Logger) FieldException(org.folio.cql2pgjson.exception.FieldException) CqlModifiers(org.folio.cql2pgjson.model.CqlModifiers) List(java.util.List) CQLAndNode(org.z3950.zing.cql.CQLAndNode) CQLParser(org.z3950.zing.cql.CQLParser) ServerChoiceIndexesException(org.folio.cql2pgjson.exception.ServerChoiceIndexesException) ResourceUtil(org.folio.util.ResourceUtil) Pattern(java.util.regex.Pattern) CQLNode(org.z3950.zing.cql.CQLNode) Collections(java.util.Collections) CQLNotNode(org.z3950.zing.cql.CQLNotNode) DbIndex(org.folio.cql2pgjson.model.DbIndex) CQLFeatureUnsupportedException(org.folio.cql2pgjson.exception.CQLFeatureUnsupportedException)

Example 2 with CQLFeatureUnsupportedException

use of org.folio.cql2pgjson.exception.CQLFeatureUnsupportedException in project raml-module-builder by folio-org.

the class CQL2PgJSON method queryByFt.

/**
 * Create an SQL expression using Full Text query syntax.
 *
 * @param hasIndex
 * @param vals
 * @param node
 * @param comparator
 * @param modifiers
 * @return
 * @throws QueryValidationException
 */
private String queryByFt(String index, DbIndex dbIndex, IndexTextAndJsonValues vals, CQLTermNode node, String comparator, CqlModifiers modifiers, Table targetTable) throws QueryValidationException {
    final String indexText = vals.getIndexText();
    if (CqlAccents.RESPECT_ACCENTS == modifiers.getCqlAccents()) {
        logger.log(Level.WARNING, "Ignoring /respectAccents modifier for FT search {0}", indexText);
    }
    if (CqlCase.RESPECT_CASE == modifiers.getCqlCase()) {
        logger.log(Level.WARNING, "Ignoring /respectCase modifier for FT search {0}", indexText);
    }
    // Clean the term. Remove stand-alone ' *', not valid word.
    String term = node.getTerm().replaceAll(" +\\*", "").trim();
    Index schemaIndex = null;
    if (targetTable != null) {
        schemaIndex = DbSchemaUtils.getIndex(index, targetTable.getFullTextIndex());
    }
    String sql = queryByFt(indexText, term, comparator, schemaIndex, targetTable);
    // array modifier
    List<Modifier> relationModifiers = modifiers.getRelationModifiers();
    if (!relationModifiers.isEmpty()) {
        sql += " AND " + arrayNode(index, node, modifiers, relationModifiers, schemaIndex, vals, targetTable);
    }
    if (schemaIndex != null && schemaIndex.isCaseSensitive()) {
        throw new CQLFeatureUnsupportedException("full text index does not support case sensitive: " + index);
    }
    if (!dbIndex.hasFullTextIndex() && !"true".equals(sql)) {
        String s = String.format("%s, CQL >>> SQL: %s >>> %s", indexText, node.toCQL(), sql);
        logger.log(Level.WARNING, "Doing FT search without index for {0}", s);
    }
    return sql;
}
Also used : DbIndex(org.folio.cql2pgjson.model.DbIndex) Index(org.folio.dbschema.Index) Modifier(org.z3950.zing.cql.Modifier) CQLFeatureUnsupportedException(org.folio.cql2pgjson.exception.CQLFeatureUnsupportedException)

Aggregations

CQLFeatureUnsupportedException (org.folio.cql2pgjson.exception.CQLFeatureUnsupportedException)2 DbIndex (org.folio.cql2pgjson.model.DbIndex)2 Index (org.folio.dbschema.Index)2 Modifier (org.z3950.zing.cql.Modifier)2 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 Collections (java.util.Collections)1 HashMap (java.util.HashMap)1 LinkedList (java.util.LinkedList)1 List (java.util.List)1 Map (java.util.Map)1 Level (java.util.logging.Level)1 Logger (java.util.logging.Logger)1 Pattern (java.util.regex.Pattern)1 ObjectUtils (org.apache.commons.lang3.ObjectUtils)1 StringUtils (org.apache.commons.lang3.StringUtils)1 FieldException (org.folio.cql2pgjson.exception.FieldException)1 QueryValidationException (org.folio.cql2pgjson.exception.QueryValidationException)1 ServerChoiceIndexesException (org.folio.cql2pgjson.exception.ServerChoiceIndexesException)1 CqlAccents (org.folio.cql2pgjson.model.CqlAccents)1