/* * Hibernate OGM, Domain model persistence for NoSQL datastores * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.ogm.datastore.neo4j.query.parsing.impl.predicate.impl; import static org.hibernate.ogm.datastore.neo4j.query.parsing.cypherdsl.impl.CypherDSL.compare; import static org.hibernate.ogm.datastore.neo4j.query.parsing.cypherdsl.impl.CypherDSL.identifier; import org.hibernate.hql.ast.spi.predicate.LikePredicate; import org.hibernate.hql.ast.spi.predicate.NegatablePredicate; import org.hibernate.ogm.util.parser.impl.LikeExpressionToRegExpConverter; /** * @author Davide D'Alto <davide@hibernate.org> */ public class Neo4jLikePredicate extends LikePredicate<StringBuilder> implements NegatablePredicate<StringBuilder> { private final String regexp; private final StringBuilder builder; private final String alias; public Neo4jLikePredicate(StringBuilder builder, String alias, String propertyName, String patternValue, Character escapeCharacter) { super( propertyName, patternValue, escapeCharacter ); this.builder = builder; this.alias = alias; LikeExpressionToRegExpConverter converter = new LikeExpressionToRegExpConverter( escapeCharacter ); regexp = converter.getRegExpFromLikeExpression( patternValue ).pattern(); } /** * <pre>{@code n.property =~ '...'}</pre> */ @Override public StringBuilder getQuery() { return compare( identifier( builder, alias, propertyName ), "=~", regexp ); } /** * <pre> * {@code NOT (HAS aslias.property) OR ( NOT ( alias.property =~ '...' )} * </pre> */ @Override public StringBuilder getNegatedQuery() { builder.append( "NOT EXISTS(" ); identifier( builder, alias, propertyName ); builder.append( ") OR NOT(" ); getQuery(); builder.append( ")" ); return builder; } }