use of org.folio.cql2pgjson.model.CqlModifiers in project raml-module-builder by folio-org.
the class CQL2PgJSON method indexNodeForForeignTable.
private String indexNodeForForeignTable(CQLTermNode node, Table targetTable, String[] foreignTarget) throws QueryValidationException {
String foreignTableJsonb = targetTable.getTableName() + "." + JSONB_COLUMN_NAME;
IndexTextAndJsonValues vals = new IndexTextAndJsonValues();
vals.setIndexJson(SqlUtil.Cql2PgUtil.cqlNameAsSqlJson(foreignTableJsonb, foreignTarget[1]));
vals.setIndexText(SqlUtil.Cql2PgUtil.cqlNameAsSqlText(foreignTableJsonb, foreignTarget[1]));
CqlModifiers cqlModifiers = new CqlModifiers(node);
String indexField = foreignTarget[1];
return indexNode(indexField, targetTable, node, vals, cqlModifiers);
}
use of org.folio.cql2pgjson.model.CqlModifiers in project raml-module-builder by folio-org.
the class CQL2PgJSON method toSql.
// suppress "reduce to one continue in for loop"
@SuppressWarnings("squid:S135")
private SqlSelect toSql(CQLSortNode node) throws QueryValidationException {
StringBuilder order = new StringBuilder();
String where = pg(node.getSubtree());
boolean firstIndex = true;
for (ModifierSet modifierSet : node.getSortIndexes()) {
if (firstIndex) {
firstIndex = false;
} else {
order.append(", ");
}
String desc = "";
CqlModifiers modifiers = new CqlModifiers(modifierSet);
if (modifiers.getCqlSort() == CqlSort.DESCENDING) {
desc = " DESC";
}
// ASC not needed, it's Postgres' default
String field = modifierSet.getBase();
DbIndex dbIndex = dbIndexMap.computeIfAbsent(field, f -> DbSchemaUtils.getDbIndex(dbTable, f));
if (dbIndex.isForeignKey() || "id".equals(field)) {
order.append(field).append(desc);
continue;
}
IndexTextAndJsonValues vals = getIndexTextAndJsonValues(field);
// if sort field is marked explicitly as number type
if (modifiers.getCqlTermFormat() == CqlTermFormat.NUMBER) {
order.append(vals.getIndexJson()).append(desc);
continue;
}
// We assume that a CREATE INDEX for this has been installed.
order.append(wrapForLength(wrapInLowerUnaccent(vals.getIndexText(), modifiers))).append(desc).append(", ").append(wrapInLowerUnaccent(vals.getIndexText(), modifiers)).append(desc);
}
return new SqlSelect(where, order.toString());
}
use of org.folio.cql2pgjson.model.CqlModifiers in project raml-module-builder by folio-org.
the class CQL2PgJSONTest method masked.
@Test
public void masked() throws CQLFeatureUnsupportedException {
select("name=/masked Lea # Lea Long");
ModifierSet modifierSet = new ModifierSet("base");
modifierSet.addModifier("masked");
CqlModifiers cqlModifiers = new CqlModifiers(modifierSet);
assertThat(cqlModifiers.getCqlMasking(), is(CqlMasking.MASKED));
}
use of org.folio.cql2pgjson.model.CqlModifiers in project raml-module-builder by folio-org.
the class CQL2PgJSON method index2sql.
/**
* Create an SQL expression where index is applied to all matches.
*
* @param index index to use
* @param node CQLTermNode to use
*
* @return SQL expression
* @throws QueryValidationException
*/
private String index2sql(String index, CQLTermNode node) throws QueryValidationException {
IndexTextAndJsonValues vals = getIndexTextAndJsonValues(index);
CqlModifiers cqlModifiers = new CqlModifiers(node);
return indexNode(index, this.dbTable, node, vals, cqlModifiers);
}
use of org.folio.cql2pgjson.model.CqlModifiers 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());
}
}
Aggregations