HHH-8495 - Support ilike in Hibernate Envers

This commit is contained in:
Becca Gaspard 2013-09-11 23:36:43 -07:00 committed by Lukasz Antoniak
parent 1889562bed
commit 99be129200
4 changed files with 100 additions and 10 deletions

View File

@ -181,6 +181,21 @@ public class Parameters {
expressions.add( expression.toString() ); expressions.add( expression.toString() );
} }
public void addWhereWithFunction(String left, String leftFunction, String op, Object paramValue){
final String paramName = generateQueryParam();
localQueryParamValues.put( paramName, paramValue );
final StringBuilder expression = new StringBuilder();
expression.append( leftFunction ).append( "(" );
expression.append( alias ).append( "." );
expression.append( left ).append( ")" );
expression.append( " " ).append( op ).append( " " );
expression.append( ":" ).append( paramName );
expressions.add( expression.toString() );
}
public void addWhereWithParam(String left, String op, Object paramValue) { public void addWhereWithParam(String left, String op, Object paramValue) {
addWhereWithParam( left, true, op, paramValue ); addWhereWithParam( left, true, op, paramValue );
} }

View File

@ -29,6 +29,7 @@ import org.hibernate.criterion.MatchMode;
import org.hibernate.envers.configuration.spi.AuditConfiguration; import org.hibernate.envers.configuration.spi.AuditConfiguration;
import org.hibernate.envers.internal.tools.Triple; import org.hibernate.envers.internal.tools.Triple;
import org.hibernate.envers.query.criteria.internal.BetweenAuditExpression; import org.hibernate.envers.query.criteria.internal.BetweenAuditExpression;
import org.hibernate.envers.query.criteria.internal.IlikeAuditExpression;
import org.hibernate.envers.query.criteria.internal.InAuditExpression; import org.hibernate.envers.query.criteria.internal.InAuditExpression;
import org.hibernate.envers.query.criteria.internal.NotNullAuditExpression; import org.hibernate.envers.query.criteria.internal.NotNullAuditExpression;
import org.hibernate.envers.query.criteria.internal.NullAuditExpression; import org.hibernate.envers.query.criteria.internal.NullAuditExpression;
@ -91,6 +92,20 @@ public class AuditProperty<T> implements AuditProjection {
return new SimpleAuditExpression( propertyNameGetter, matchMode.toMatchString( value ), " like " ); return new SimpleAuditExpression( propertyNameGetter, matchMode.toMatchString( value ), " like " );
} }
/**
* Apply an "ilike" constraint
*/
public AuditCriterion ilike(T value) {
return new IlikeAuditExpression(propertyNameGetter, value.toString());
}
/**
* Apply an "ilike" constraint
*/
public AuditCriterion ilike(String value, MatchMode matchMode) {
return new IlikeAuditExpression( propertyNameGetter, matchMode.toMatchString( value ));
}
/** /**
* Apply a "greater than" constraint * Apply a "greater than" constraint
*/ */

View File

@ -0,0 +1,34 @@
package org.hibernate.envers.query.criteria.internal;
import org.hibernate.envers.configuration.spi.AuditConfiguration;
import org.hibernate.envers.internal.reader.AuditReaderImplementor;
import org.hibernate.envers.internal.tools.query.Parameters;
import org.hibernate.envers.internal.tools.query.QueryBuilder;
import org.hibernate.envers.query.criteria.AuditCriterion;
import org.hibernate.envers.query.internal.property.PropertyNameGetter;
public class IlikeAuditExpression implements AuditCriterion {
private PropertyNameGetter propertyNameGetter;
private String value;
public IlikeAuditExpression(PropertyNameGetter propertyNameGetter, String value) {
this.propertyNameGetter = propertyNameGetter;
this.value = value;
}
public void addToQuery(AuditConfiguration auditCfg,
AuditReaderImplementor versionsReader, String entityName,
QueryBuilder qb, Parameters parameters) {
String propertyName = CriteriaTools.determinePropertyName(
auditCfg,
versionsReader,
entityName,
propertyNameGetter);
CriteriaTools.checkPropertyNotARelation( auditCfg, entityName, propertyName );
parameters.addWhereWithFunction( propertyName, " lower ", " like ", value.toLowerCase() );
}
}

View File

@ -23,11 +23,13 @@
*/ */
package org.hibernate.envers.test.integration.query; package org.hibernate.envers.test.integration.query;
import javax.persistence.EntityManager;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import javax.persistence.EntityManager;
import org.hibernate.criterion.MatchMode;
import org.hibernate.envers.RevisionType; import org.hibernate.envers.RevisionType;
import org.hibernate.envers.enhanced.SequenceIdRevisionEntity; import org.hibernate.envers.enhanced.SequenceIdRevisionEntity;
import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.query.AuditEntity;
@ -35,12 +37,10 @@ import org.hibernate.envers.test.BaseEnversJPAFunctionalTestCase;
import org.hibernate.envers.test.Priority; import org.hibernate.envers.test.Priority;
import org.hibernate.envers.test.entities.StrIntTestEntity; import org.hibernate.envers.test.entities.StrIntTestEntity;
import org.hibernate.envers.test.tools.TestTools; import org.hibernate.envers.test.tools.TestTools;
import org.hibernate.testing.TestForIssue;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.hibernate.testing.TestForIssue;
/** /**
* @author Adam Warski (adam at warski dot org) * @author Adam Warski (adam at warski dot org)
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
@ -83,7 +83,7 @@ public class SimpleQuery extends BaseEnversJPAFunctionalTestCase {
site1 = em.find( StrIntTestEntity.class, id1 ); site1 = em.find( StrIntTestEntity.class, id1 );
site2 = em.find( StrIntTestEntity.class, id2 ); site2 = em.find( StrIntTestEntity.class, id2 );
site1.setStr1( "c" ); site1.setStr1( "aBc" );
site2.setNumber( 20 ); site2.setNumber( 20 );
em.getTransaction().commit(); em.getTransaction().commit();
@ -174,13 +174,13 @@ public class SimpleQuery extends BaseEnversJPAFunctionalTestCase {
); );
assert new HashSet( ver2 ).equals( assert new HashSet( ver2 ).equals(
TestTools.makeSet( TestTools.makeSet(
new StrIntTestEntity( "c", 10, id1 ), new StrIntTestEntity( "aBc", 10, id1 ),
new StrIntTestEntity( "b", 5, id3 ) new StrIntTestEntity( "b", 5, id3 )
) )
); );
assert new HashSet( ver3 ).equals( assert new HashSet( ver3 ).equals(
TestTools.makeSet( TestTools.makeSet(
new StrIntTestEntity( "c", 10, id1 ), new StrIntTestEntity( "aBc", 10, id1 ),
new StrIntTestEntity( "a", 5, id3 ) new StrIntTestEntity( "a", 5, id3 )
) )
); );
@ -224,7 +224,7 @@ public class SimpleQuery extends BaseEnversJPAFunctionalTestCase {
assert result.size() == 2; assert result.size() == 2;
assert result.get( 0 ).equals( new StrIntTestEntity( "a", 10, id1 ) ); assert result.get( 0 ).equals( new StrIntTestEntity( "a", 10, id1 ) );
assert result.get( 1 ).equals( new StrIntTestEntity( "c", 10, id1 ) ); assert result.get( 1 ).equals( new StrIntTestEntity( "aBc", 10, id1 ) );
} }
@Test @Test
@ -237,7 +237,7 @@ public class SimpleQuery extends BaseEnversJPAFunctionalTestCase {
assert result.size() == 3; assert result.size() == 3;
assert ((Object[]) result.get( 0 ))[0].equals( new StrIntTestEntity( "a", 10, id1 ) ); assert ((Object[]) result.get( 0 ))[0].equals( new StrIntTestEntity( "a", 10, id1 ) );
assert ((Object[]) result.get( 1 ))[0].equals( new StrIntTestEntity( "c", 10, id1 ) ); assert ((Object[]) result.get( 1 ))[0].equals( new StrIntTestEntity( "aBc", 10, id1 ) );
assert ((Object[]) result.get( 2 ))[0].equals( new StrIntTestEntity( null, null, id1 ) ); assert ((Object[]) result.get( 2 ))[0].equals( new StrIntTestEntity( null, null, id1 ) );
assert ((SequenceIdRevisionEntity) ((Object[]) result.get( 0 ))[1]).getId() == 1; assert ((SequenceIdRevisionEntity) ((Object[]) result.get( 0 ))[1]).getId() == 1;
@ -317,7 +317,7 @@ public class SimpleQuery extends BaseEnversJPAFunctionalTestCase {
@Test @Test
public void testEntitiesChangedAtRevision() { public void testEntitiesChangedAtRevision() {
StrIntTestEntity site1 = new StrIntTestEntity( "c", 10, id1 ); StrIntTestEntity site1 = new StrIntTestEntity( "aBc", 10, id1 );
StrIntTestEntity site2 = new StrIntTestEntity( "a", 20, id2 ); StrIntTestEntity site2 = new StrIntTestEntity( "a", 20, id2 );
List result = getAuditReader().createQuery() List result = getAuditReader().createQuery()
@ -385,4 +385,30 @@ public class SimpleQuery extends BaseEnversJPAFunctionalTestCase {
Assert.assertTrue( (number >= 0 && number <= 5) || (number >= 20 && number <= 100) ); Assert.assertTrue( (number >= 0 && number <= 5) || (number >= 20 && number <= 100) );
} }
} }
@Test
@TestForIssue(jiraKey = "HHH-8495")
public void testIlike() {
StrIntTestEntity site1 = new StrIntTestEntity( "aBc", 10, id1 );
StrIntTestEntity result = (StrIntTestEntity) getAuditReader().createQuery()
.forRevisionsOfEntity( StrIntTestEntity.class, true, true )
.add( AuditEntity.property( "str1" ).ilike( "abc" ) )
.getSingleResult();
Assert.assertEquals( site1, result );
}
@Test
@TestForIssue(jiraKey = "HHH-8495")
public void testIlikeWithMatchMode() {
StrIntTestEntity site1 = new StrIntTestEntity( "aBc", 10, id1 );
StrIntTestEntity result = (StrIntTestEntity) getAuditReader().createQuery()
.forRevisionsOfEntity( StrIntTestEntity.class, true, true )
.add( AuditEntity.property( "str1" ).ilike( "BC", MatchMode.ANYWHERE ) )
.getSingleResult();
Assert.assertEquals( site1, result );
}
} }