private void handleMultipleFilters(final StringBuilder builder, final SearchFields multipleFilter, final Set<String> specificFilters, final boolean enableWordSearch) { final Map<Class<? extends PersistentObject>, Set<String>> allTextFields = multipleFilter.getFields(); final Set<String> fields = new HashSet<>(); for (final Map.Entry<Class<? extends PersistentObject>, Set<String>> entry : allTextFields.entrySet()) { final String alias = classAliasMappings.get(entry.getKey().getName()); for (final String field : entry.getValue()) { fields.add(alias + '.' + field); } } fields.removeAll(specificFilters); if (!fields.isEmpty()) { final List<String> terms = multipleFilter.getTerms(); applyFiltersOnQuery(builder, fields, terms, enableWordSearch); } }
private void applyFiltersOnQuery(final StringBuilder queryBuilder, final Set<String> fields, final List<String> terms, final boolean enableWordSearch) { if (!queryBuilder.toString().contains("WHERE")) { queryBuilder.append(" WHERE "); } else { queryBuilder.append(" AND "); } queryBuilder.append("("); final Iterator<String> fieldIterator = fields.iterator(); while (fieldIterator.hasNext()) { buildLikeClauseForOneFieldMultipleTerms(queryBuilder, fieldIterator.next(), terms, enableWordSearch); if (fieldIterator.hasNext()) { queryBuilder.append(" OR "); } } queryBuilder.append(")"); }
private void buildLikeClauseForOneFieldMultipleTerms(final StringBuilder queryBuilder, final String currentField, final List<String> terms, final boolean enableWordSearch) { final Iterator<String> termIterator = terms.iterator(); while (termIterator.hasNext()) { final String currentTerm = termIterator.next(); buildLikeClauseForOneFieldOneTerm(queryBuilder, currentField, currentTerm, enableWordSearch); if (termIterator.hasNext()) { queryBuilder.append(" OR "); } } }
final QueryOptions queryOptions = selectDescriptor.getQueryOptions(); final boolean enableWordSearch = isWordSearchEnabled(selectDescriptor.getEntityType()); queryBuilder.appendFilters(queryOptions.getFilters(), queryOptions.getMultipleFilter(), enableWordSearch); queryBuilder.appendOrderByClause(selectDescriptor.getQueryOptions().getOrderByOptions(), selectDescriptor.getEntityType()); if (queryBuilder.hasChanged()) { query = queryBuilder.buildQuery(session); queryBuilder.setTenantId(query, getTenantId()); } catch (STenantIdNotSetException e) { throw new SBonitaReadException(e);
fieldValue = processValue(fieldValue); switch (type) { case EQUALS: break; case IN: clause.append(getInClause(completeField, filterOption)); break; case BETWEEN: final Object from = filterOption.getFrom() instanceof String ? "'" + escapeString((String) filterOption.getFrom()) + "'" : filterOption.getFrom(); final Object to = filterOption.getTo() instanceof String ? "'" + escapeString((String) filterOption.getTo()) + "'" : filterOption.getTo(); clause.append("(").append(from).append(" <= ").append(completeField); clause.append(" AND ").append(completeField).append(" <= ").append(to).append(")"); break; case LIKE: clause.append(completeField).append(" LIKE '%").append(escapeTerm((String) filterOption.getValue())).append("%'"); break; case L_PARENTHESIS:
@Override public void deleteByTenant(final Class<? extends PersistentObject> entityClass, final List<FilterOption> filters) throws SPersistenceException { try { final Session session = getSession(true); final String entityClassName = entityClass.getCanonicalName(); final boolean enableWordSearch = isWordSearchEnabled(entityClass); boolean hasFilters = filters != null && !filters.isEmpty(); String baseQuery = "DELETE FROM " + entityClassName + " " + (hasFilters ? getClassAliasMappings().get(entityClassName) : "") + " WHERE tenantId= :tenantId"; QueryBuilder queryBuilder = new HQLQueryBuilder(baseQuery, orderByBuilder, getClassAliasMappings(), interfaceToClassMapping, likeEscapeCharacter); if (hasFilters) { queryBuilder.appendFilters(filters, null, enableWordSearch); } final Query query = queryBuilder.buildQuery(session); query.setLong(TENANT_ID, getTenantId()); query.executeUpdate(); if (logger.isLoggable(getClass(), TechnicalLogSeverity.DEBUG)) { logger.log(this.getClass(), TechnicalLogSeverity.DEBUG, "[Tenant] Deleting all instance of class " + entityClass.getClass().getSimpleName()); } } catch (final STenantIdNotSetException e) { throw new SPersistenceException(e); } }
void appendFilters(List<FilterOption> filters, SearchFields multipleFilter, boolean enableWordSearch) { final Set<String> specificFilters = new HashSet<>(filters.size()); if (!filters.isEmpty()) { FilterOption previousFilter = null; if (!this.stringQueryBuilder.toString().contains("WHERE")) { stringQueryBuilder.append(" WHERE ("); } else { stringQueryBuilder.append(" AND ("); } for (final FilterOption filterOption : filters) { if (previousFilter != null) { final FilterOperationType prevOp = previousFilter.getFilterOperationType(); final FilterOperationType currOp = filterOption.getFilterOperationType(); // Auto add AND if previous operator was normal op or ')' and that current op is normal op or '(' : if ((isNormalOperator(prevOp) || prevOp == R_PARENTHESIS) && (isNormalOperator(currOp) || currOp == L_PARENTHESIS)) { stringQueryBuilder.append(" AND "); } } final StringBuilder aliasBuilder = appendFilterClause(stringQueryBuilder, filterOption); if (aliasBuilder != null) { specificFilters.add(aliasBuilder.toString()); } previousFilter = filterOption; } stringQueryBuilder.append(")"); } if (multipleFilter != null && multipleFilter.getTerms() != null && !multipleFilter.getTerms().isEmpty()) { handleMultipleFilters(stringQueryBuilder, multipleFilter, specificFilters, enableWordSearch); } }
protected Object processValue(Object fieldValue) { if (fieldValue instanceof String) { fieldValue = "'" + escapeString((String) fieldValue) + "'"; } else if (fieldValue instanceof EnumToObjectConvertible) { fieldValue = ((EnumToObjectConvertible) fieldValue).fromEnum(); } return fieldValue; }
void buildLikeClauseForOneFieldOneTerm(final StringBuilder queryBuilder, final String currentField, final String currentTerm, final boolean enableWordSearch) { // Search if a sentence starts with the term queryBuilder.append(currentField).append(buildLikeEscapeClause(currentTerm, "", "%")); if (enableWordSearch) { // Search also if a word starts with the term // We do not want to search for %currentTerm% to ensure we can use Lucene-like library. queryBuilder.append(" OR ").append(currentField).append(buildLikeEscapeClause(currentTerm, "% ", "%")); } }
final Class<? extends PersistentObject> clazz = orderByOption.getClazz(); if (clazz != null) { appendClassAlias(fieldNameBuilder, clazz); stringQueryBuilder.append(','); appendClassAlias(stringQueryBuilder, entityType); stringQueryBuilder.append("id"); stringQueryBuilder.append(' ');
final QueryOptions queryOptions = selectDescriptor.getQueryOptions(); final boolean enableWordSearch = isWordSearchEnabled(selectDescriptor.getEntityType()); queryBuilder.appendFilters(queryOptions.getFilters(), queryOptions.getMultipleFilter(), enableWordSearch); queryBuilder.appendOrderByClause(selectDescriptor.getQueryOptions().getOrderByOptions(), selectDescriptor.getEntityType()); if (queryBuilder.hasChanged()) { query = queryBuilder.buildQuery(session); queryBuilder.setTenantId(query, getTenantId()); } catch (STenantIdNotSetException e) { throw new SBonitaReadException(e);
fieldValue = processValue(fieldValue); switch (type) { case EQUALS: break; case IN: clause.append(getInClause(completeField, filterOption)); break; case BETWEEN: final Object from = filterOption.getFrom() instanceof String ? "'" + escapeString((String) filterOption.getFrom()) + "'" : filterOption.getFrom(); final Object to = filterOption.getTo() instanceof String ? "'" + escapeString((String) filterOption.getTo()) + "'" : filterOption.getTo(); clause.append("(").append(from).append(" <= ").append(completeField); clause.append(" AND ").append(completeField).append(" <= ").append(to).append(")"); break; case LIKE: clause.append(completeField).append(" LIKE '%").append(escapeTerm((String) filterOption.getValue())).append("%'"); break; case L_PARENTHESIS:
@Override public void deleteByTenant(final Class<? extends PersistentObject> entityClass, final List<FilterOption> filters) throws SPersistenceException { try { final Session session = getSession(true); final String entityClassName = entityClass.getCanonicalName(); final boolean enableWordSearch = isWordSearchEnabled(entityClass); boolean hasFilters = filters != null && !filters.isEmpty(); String baseQuery = "DELETE FROM " + entityClassName + " " + (hasFilters ? getClassAliasMappings().get(entityClassName) : "") + " WHERE tenantId= :tenantId"; QueryBuilder queryBuilder = new HQLQueryBuilder(baseQuery, orderByBuilder, getClassAliasMappings(), interfaceToClassMapping, likeEscapeCharacter); if (hasFilters) { queryBuilder.appendFilters(filters, null, enableWordSearch); } final Query query = queryBuilder.buildQuery(session); query.setLong(TENANT_ID, getTenantId()); query.executeUpdate(); if (logger.isLoggable(getClass(), TechnicalLogSeverity.DEBUG)) { logger.log(this.getClass(), TechnicalLogSeverity.DEBUG, "[Tenant] Deleting all instance of class " + entityClass.getClass().getSimpleName()); } } catch (final STenantIdNotSetException e) { throw new SPersistenceException(e); } }
void appendFilters(List<FilterOption> filters, SearchFields multipleFilter, boolean enableWordSearch) { final Set<String> specificFilters = new HashSet<>(filters.size()); if (!filters.isEmpty()) { FilterOption previousFilter = null; if (!this.stringQueryBuilder.toString().contains("WHERE")) { stringQueryBuilder.append(" WHERE ("); } else { stringQueryBuilder.append(" AND ("); } for (final FilterOption filterOption : filters) { if (previousFilter != null) { final FilterOperationType prevOp = previousFilter.getFilterOperationType(); final FilterOperationType currOp = filterOption.getFilterOperationType(); // Auto add AND if previous operator was normal op or ')' and that current op is normal op or '(' : if ((isNormalOperator(prevOp) || prevOp == R_PARENTHESIS) && (isNormalOperator(currOp) || currOp == L_PARENTHESIS)) { stringQueryBuilder.append(" AND "); } } final StringBuilder aliasBuilder = appendFilterClause(stringQueryBuilder, filterOption); if (aliasBuilder != null) { specificFilters.add(aliasBuilder.toString()); } previousFilter = filterOption; } stringQueryBuilder.append(")"); } if (multipleFilter != null && multipleFilter.getTerms() != null && !multipleFilter.getTerms().isEmpty()) { handleMultipleFilters(stringQueryBuilder, multipleFilter, specificFilters, enableWordSearch); } }
protected Object processValue(Object fieldValue) { if (fieldValue instanceof String) { fieldValue = "'" + escapeString((String) fieldValue) + "'"; } else if (fieldValue instanceof EnumToObjectConvertible) { fieldValue = ((EnumToObjectConvertible) fieldValue).fromEnum(); } return fieldValue; }
void buildLikeClauseForOneFieldOneTerm(final StringBuilder queryBuilder, final String currentField, final String currentTerm, final boolean enableWordSearch) { // Search if a sentence starts with the term queryBuilder.append(currentField).append(buildLikeEscapeClause(currentTerm, "", "%")); if (enableWordSearch) { // Search also if a word starts with the term // We do not want to search for %currentTerm% to ensure we can use Lucene-like library. queryBuilder.append(" OR ").append(currentField).append(buildLikeEscapeClause(currentTerm, "% ", "%")); } }
final Class<? extends PersistentObject> clazz = orderByOption.getClazz(); if (clazz != null) { appendClassAlias(fieldNameBuilder, clazz); stringQueryBuilder.append(','); appendClassAlias(stringQueryBuilder, entityType); stringQueryBuilder.append("id"); stringQueryBuilder.append(' ');
private void buildLikeClauseForOneFieldMultipleTerms(final StringBuilder queryBuilder, final String currentField, final List<String> terms, final boolean enableWordSearch) { final Iterator<String> termIterator = terms.iterator(); while (termIterator.hasNext()) { final String currentTerm = termIterator.next(); buildLikeClauseForOneFieldOneTerm(queryBuilder, currentField, currentTerm, enableWordSearch); if (termIterator.hasNext()) { queryBuilder.append(" OR "); } } }
private void applyFiltersOnQuery(final StringBuilder queryBuilder, final Set<String> fields, final List<String> terms, final boolean enableWordSearch) { if (!queryBuilder.toString().contains("WHERE")) { queryBuilder.append(" WHERE "); } else { queryBuilder.append(" AND "); } queryBuilder.append("("); final Iterator<String> fieldIterator = fields.iterator(); while (fieldIterator.hasNext()) { buildLikeClauseForOneFieldMultipleTerms(queryBuilder, fieldIterator.next(), terms, enableWordSearch); if (fieldIterator.hasNext()) { queryBuilder.append(" OR "); } } queryBuilder.append(")"); }
private void handleMultipleFilters(final StringBuilder builder, final SearchFields multipleFilter, final Set<String> specificFilters, final boolean enableWordSearch) { final Map<Class<? extends PersistentObject>, Set<String>> allTextFields = multipleFilter.getFields(); final Set<String> fields = new HashSet<>(); for (final Map.Entry<Class<? extends PersistentObject>, Set<String>> entry : allTextFields.entrySet()) { final String alias = classAliasMappings.get(entry.getKey().getName()); for (final String field : entry.getValue()) { fields.add(alias + '.' + field); } } fields.removeAll(specificFilters); if (!fields.isEmpty()) { final List<String> terms = multipleFilter.getTerms(); applyFiltersOnQuery(builder, fields, terms, enableWordSearch); } }