From ef45d0418152f1e364b7d5bb5ef4700301ff4ee3 Mon Sep 17 00:00:00 2001 From: Adam Warski Date: Wed, 19 Nov 2008 13:10:40 +0000 Subject: [PATCH] HHH-3611: improved query interface git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@15589 1b8cb986-b30d-0410-93ca-fae66ebed9b2 --- .../AuditEntitiesConfiguration.java | 26 +- .../metadata/AuditMetadataGenerator.java | 8 +- .../relation/OneToOneNotOwningMapper.java | 4 +- .../query/OneAuditEntityQueryGenerator.java | 2 +- .../query/OneEntityQueryGenerator.java | 2 +- .../query/ThreeEntityQueryGenerator.java | 2 +- .../query/TwoEntityQueryGenerator.java | 2 +- .../hibernate/envers/query/AuditEntity.java | 122 ++++++++ .../hibernate/envers/query/AuditQuery.java | 4 - .../envers/query/RevisionProperty.java | 143 ---------- ...on.java => AggregatedAuditExpression.java} | 43 +-- .../envers/query/criteria/AuditCriterion.java | 2 +- .../AuditId.java} | 51 ++-- .../envers/query/criteria/AuditProperty.java | 266 ++++++++++++++++++ .../envers/query/criteria/AuditRelatedId.java | 54 ++++ .../criteria/BetweenAuditExpression.java | 12 +- .../criteria/IdentifierEqAuditExpression.java | 9 +- .../query/criteria/InAuditExpression.java | 12 +- .../criteria/NotNullAuditExpression.java | 12 +- .../query/criteria/NullAuditExpression.java | 12 +- .../criteria/PropertyAuditExpression.java | 14 +- .../criteria/RelatedAuditExpression.java | 17 +- .../query/criteria/SimpleAuditExpression.java | 13 +- .../envers/query/impl/AbstractAuditQuery.java | 17 +- .../query/impl/EntitiesAtRevisionQuery.java | 2 +- .../query/impl/RevisionsOfEntityQuery.java | 6 +- .../envers/query/order/AuditOrder.java | 4 +- ...uditOrder.java => PropertyAuditOrder.java} | 15 +- .../query/projection/AuditProjection.java | 5 +- ...tion.java => PropertyAuditProjection.java} | 40 +-- .../query/property/EntityPropertyName.java | 43 +++ .../OriginalIdPropertyName.java} | 21 +- .../query/property/PropertyNameGetter.java | 39 +++ .../property/RevisionNumberPropertyName.java | 37 +++ .../RevisionPropertyPropertyName.java | 43 +++ .../property/RevisionTypePropertyName.java | 37 +++ .../envers/reader/AuditReaderImpl.java | 9 +- .../work/AbstractAuditWorkUnit.java | 2 +- .../PersistentCollectionChangeWorkUnit.java | 2 +- .../integration/query/AggregateQuery.java | 13 +- .../query/CustomRevEntityQuery.java | 29 +- .../integration/query/DeletedEntities.java | 8 +- .../query/MaximalizePropertyQuery.java | 28 +- .../integration/query/OrderByLimitQuery.java | 13 +- .../query/RevisionConstraintQuery.java | 52 ++-- .../test/integration/query/SimpleQuery.java | 48 ++-- .../query/ids/EmbIdOneToManyQuery.java | 44 +-- .../query/ids/MulIdOneToManyQuery.java | 44 +-- 48 files changed, 984 insertions(+), 449 deletions(-) create mode 100644 envers/src/main/java/org/hibernate/envers/query/AuditEntity.java delete mode 100644 envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java rename envers/src/main/java/org/hibernate/envers/query/criteria/{AggregatedFieldAuditExpression.java => AggregatedAuditExpression.java} (73%) rename envers/src/main/java/org/hibernate/envers/query/{RevisionTypeProperty.java => criteria/AuditId.java} (53%) create mode 100644 envers/src/main/java/org/hibernate/envers/query/criteria/AuditProperty.java create mode 100644 envers/src/main/java/org/hibernate/envers/query/criteria/AuditRelatedId.java rename envers/src/main/java/org/hibernate/envers/query/order/{RevisionAuditOrder.java => PropertyAuditOrder.java} (74%) rename envers/src/main/java/org/hibernate/envers/query/projection/{RevisionAuditProjection.java => PropertyAuditProjection.java} (59%) create mode 100644 envers/src/main/java/org/hibernate/envers/query/property/EntityPropertyName.java rename envers/src/main/java/org/hibernate/envers/query/{criteria/RevisionAuditExpression.java => property/OriginalIdPropertyName.java} (67%) create mode 100644 envers/src/main/java/org/hibernate/envers/query/property/PropertyNameGetter.java create mode 100644 envers/src/main/java/org/hibernate/envers/query/property/RevisionNumberPropertyName.java create mode 100644 envers/src/main/java/org/hibernate/envers/query/property/RevisionPropertyPropertyName.java create mode 100644 envers/src/main/java/org/hibernate/envers/query/property/RevisionTypePropertyName.java diff --git a/envers/src/main/java/org/hibernate/envers/configuration/AuditEntitiesConfiguration.java b/envers/src/main/java/org/hibernate/envers/configuration/AuditEntitiesConfiguration.java index 1262095d3a..f6f1ce4231 100644 --- a/envers/src/main/java/org/hibernate/envers/configuration/AuditEntitiesConfiguration.java +++ b/envers/src/main/java/org/hibernate/envers/configuration/AuditEntitiesConfiguration.java @@ -37,8 +37,9 @@ public class AuditEntitiesConfiguration { private final String originalIdPropName; - private final String revisionPropName; - private final String revisionPropPath; + private final String revisionFieldName; + private final String revisionNumberPath; + private final String revisionPropBasePath; private final String revisionTypePropName; private final String revisionTypePropType; @@ -55,26 +56,35 @@ public class AuditEntitiesConfiguration { originalIdPropName = "originalId"; - revisionPropName = properties.getProperty("org.hibernate.envers.revisionFieldName", "REV"); + revisionFieldName = properties.getProperty("org.hibernate.envers.revisionFieldName", "REV"); revisionTypePropName = properties.getProperty("org.hibernate.envers.revisionTypeFieldName", "REVTYPE"); revisionTypePropType = "byte"; customAuditTablesNames = new HashMap(); - revisionPropPath = originalIdPropName + "." + revisionPropName + ".id"; + revisionNumberPath = originalIdPropName + "." + revisionFieldName + ".id"; + revisionPropBasePath = originalIdPropName + "." + revisionFieldName + "."; } public String getOriginalIdPropName() { return originalIdPropName; } - public String getRevisionPropName() { - return revisionPropName; + public String getRevisionFieldName() { + return revisionFieldName; } - public String getRevisionPropPath() { - return revisionPropPath; + public String getRevisionNumberPath() { + return revisionNumberPath; + } + + /** + * @param propertyName Property of the revision entity. + * @return A path to the given property of the revision entity associated with an audit entity. + */ + public String getRevisionPropPath(String propertyName) { + return revisionPropBasePath + propertyName; } public String getRevisionTypePropName() { diff --git a/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java b/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java index bd074ff918..2009cee22d 100644 --- a/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java +++ b/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java @@ -88,8 +88,8 @@ public final class AuditMetadataGenerator { void addRevisionInfoRelation(Element any_mapping) { Element rev_mapping = (Element) revisionInfoRelationMapping.clone(); - rev_mapping.addAttribute("name", verEntCfg.getRevisionPropName()); - MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionPropName(), null); + rev_mapping.addAttribute("name", verEntCfg.getRevisionFieldName()); + MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionFieldName(), null); any_mapping.add(rev_mapping); } @@ -192,7 +192,7 @@ public final class AuditMetadataGenerator { Element joinKey = joinElement.addElement("key"); MetadataTools.addColumns(joinKey, join.getKey().getColumnIterator()); - MetadataTools.addColumn(joinKey, verEntCfg.getRevisionPropName(), null); + MetadataTools.addColumn(joinKey, verEntCfg.getRevisionFieldName(), null); } } @@ -298,7 +298,7 @@ public final class AuditMetadataGenerator { // Adding the "key" element with all columns + the revision number column Element keyMapping = mappingData.getFirst().addElement("key"); MetadataTools.addColumns(keyMapping, pc.getIdentifierProperty().getColumnIterator()); - MetadataTools.addColumn(keyMapping, verEntCfg.getRevisionPropName(), null); + MetadataTools.addColumn(keyMapping, verEntCfg.getRevisionFieldName(), null); break; case TABLE_PER_CLASS: diff --git a/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java b/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java index 259e0856a7..7e31f7b862 100644 --- a/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java +++ b/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java @@ -33,7 +33,7 @@ import org.hibernate.envers.entities.mapper.PersistentCollectionChangeData; import org.hibernate.envers.entities.mapper.PropertyMapper; import org.hibernate.envers.entities.PropertyData; import org.hibernate.envers.exception.AuditException; -import org.hibernate.envers.query.AuditRestrictions; +import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.reader.AuditReaderImplementor; import org.hibernate.envers.tools.reflection.ReflectionTools; @@ -71,7 +71,7 @@ public class OneToOneNotOwningMapper implements PropertyMapper { try { value = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision) - .add(AuditRestrictions.relatedIdEq(owningReferencePropertyName, primaryKey)).getSingleResult(); + .add(AuditEntity.relatedId(owningReferencePropertyName).eq(primaryKey)).getSingleResult(); } catch (NoResultException e) { value = null; } catch (NonUniqueResultException e) { diff --git a/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/OneAuditEntityQueryGenerator.java b/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/OneAuditEntityQueryGenerator.java index 43896842cd..5cefc8544a 100644 --- a/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/OneAuditEntityQueryGenerator.java +++ b/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/OneAuditEntityQueryGenerator.java @@ -62,7 +62,7 @@ public final class OneAuditEntityQueryGenerator implements RelationQueryGenerato * (only non-deleted entities) * e.revision_type != DEL */ - String revisionPropertyPath = verEntCfg.getRevisionPropPath(); + String revisionPropertyPath = verEntCfg.getRevisionNumberPath(); String originalIdPropertyName = verEntCfg.getOriginalIdPropName(); String versionsReferencedEntityName = verEntCfg.getAuditEntityName(referencedEntityName); diff --git a/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/OneEntityQueryGenerator.java b/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/OneEntityQueryGenerator.java index 22e1630dfd..6f484f4e93 100644 --- a/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/OneEntityQueryGenerator.java +++ b/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/OneEntityQueryGenerator.java @@ -61,7 +61,7 @@ public final class OneEntityQueryGenerator implements RelationQueryGenerator { * (only non-deleted entities and associations) * ee.revision_type != DEL */ - String revisionPropertyPath = verEntCfg.getRevisionPropPath(); + String revisionPropertyPath = verEntCfg.getRevisionNumberPath(); String originalIdPropertyName = verEntCfg.getOriginalIdPropName(); // SELECT new list(ee) FROM middleEntity ee diff --git a/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/ThreeEntityQueryGenerator.java b/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/ThreeEntityQueryGenerator.java index 28cef7e9a6..00c0665c99 100644 --- a/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/ThreeEntityQueryGenerator.java +++ b/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/ThreeEntityQueryGenerator.java @@ -78,7 +78,7 @@ public final class ThreeEntityQueryGenerator implements RelationQueryGenerator { * e.revision_type != DEL AND * f.revision_type != DEL */ - String revisionPropertyPath = verEntCfg.getRevisionPropPath(); + String revisionPropertyPath = verEntCfg.getRevisionNumberPath(); String originalIdPropertyName = verEntCfg.getOriginalIdPropName(); String eeOriginalIdPropertyPath = "ee." + originalIdPropertyName; diff --git a/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/TwoEntityQueryGenerator.java b/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/TwoEntityQueryGenerator.java index aa338a18b1..385382da24 100644 --- a/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/TwoEntityQueryGenerator.java +++ b/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/query/TwoEntityQueryGenerator.java @@ -71,7 +71,7 @@ public final class TwoEntityQueryGenerator implements RelationQueryGenerator { * ee.revision_type != DEL AND * e.revision_type != DEL */ - String revisionPropertyPath = verEntCfg.getRevisionPropPath(); + String revisionPropertyPath = verEntCfg.getRevisionNumberPath(); String originalIdPropertyName = verEntCfg.getOriginalIdPropName(); String eeOriginalIdPropertyPath = "ee." + originalIdPropertyName; diff --git a/envers/src/main/java/org/hibernate/envers/query/AuditEntity.java b/envers/src/main/java/org/hibernate/envers/query/AuditEntity.java new file mode 100644 index 0000000000..f827aa1e3b --- /dev/null +++ b/envers/src/main/java/org/hibernate/envers/query/AuditEntity.java @@ -0,0 +1,122 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Middleware LLC. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.envers.query; + +import org.hibernate.envers.query.criteria.AuditCriterion; +import org.hibernate.envers.query.criteria.*; +import org.hibernate.envers.query.property.EntityPropertyName; +import org.hibernate.envers.query.property.RevisionNumberPropertyName; +import org.hibernate.envers.query.property.RevisionPropertyPropertyName; +import org.hibernate.envers.query.property.RevisionTypePropertyName; +import org.hibernate.envers.RevisionType; + +/** + * TODO: ilike + * @author Adam Warski (adam at warski dot org) + * @see org.hibernate.criterion.Restrictions + */ +@SuppressWarnings({"JavaDoc"}) +public class AuditEntity { + private AuditEntity() { } + + public static AuditId id() { + return new AuditId(); + } + + /** + * Create restrictions, projections and specify order for a property of an audited entity. + * @param propertyName Name of the property. + */ + public static AuditProperty property(String propertyName) { + return new AuditProperty(new EntityPropertyName(propertyName)); + } + + /** + * Create restrictions, projections and specify order for the revision number, corresponding to an + * audited entity. + */ + public static AuditProperty revisionNumber() { + return new AuditProperty(new RevisionNumberPropertyName()); + } + + /** + * Create restrictions, projections and specify order for a property of the revision entity, + * corresponding to an audited entity. + * @param propertyName Name of the property. + */ + public static AuditProperty revisionProperty(String propertyName) { + return new AuditProperty(new RevisionPropertyPropertyName(propertyName)); + } + + /** + * Create restrictions, projections and specify order for the revision type, corresponding to an + * audited entity. + */ + public static AuditProperty revisionType() { + return new AuditProperty(new RevisionTypePropertyName()); + } + + /** + * Create restrictions on an id of a related entity. + * @param propertyName Name of the property, which is the relation. + */ + public static AuditRelatedId relatedId(String propertyName) { + return new AuditRelatedId(new EntityPropertyName(propertyName)); + } + + /** + * Return the conjuction of two criterions. + */ + public static AuditCriterion and(AuditCriterion lhs, AuditCriterion rhs) { + return new LogicalAuditExpression(lhs, rhs, "and"); + } + + /** + * Return the disjuction of two criterions. + */ + public static AuditCriterion or(AuditCriterion lhs, AuditCriterion rhs) { + return new LogicalAuditExpression(lhs, rhs, "or"); + } + + /** + * Return the negation of a criterion. + */ + public static AuditCriterion not(AuditCriterion expression) { + return new NotAuditExpression(expression); + } + + /** + * Group criterions together in a single conjunction (A and B and C...). + */ + public static AuditConjunction conjunction() { + return new AuditConjunction(); + } + + /** + * Group criterions together in a single disjunction (A or B or C...). + */ + public static AuditDisjunction disjunction() { + return new AuditDisjunction(); + } +} diff --git a/envers/src/main/java/org/hibernate/envers/query/AuditQuery.java b/envers/src/main/java/org/hibernate/envers/query/AuditQuery.java index f5d867499b..d02e912a43 100644 --- a/envers/src/main/java/org/hibernate/envers/query/AuditQuery.java +++ b/envers/src/main/java/org/hibernate/envers/query/AuditQuery.java @@ -47,12 +47,8 @@ public interface AuditQuery { AuditQuery add(AuditCriterion criterion); - AuditQuery addProjection(String function, String propertyName); - AuditQuery addProjection(AuditProjection projection); - AuditQuery addOrder(String propertyName, boolean asc); - AuditQuery addOrder(AuditOrder order); AuditQuery setMaxResults(int maxResults); diff --git a/envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java b/envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java deleted file mode 100644 index bb7e2dd920..0000000000 --- a/envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as - * indicated by the @author tags or express copyright attribution - * statements applied by the authors. All third-party contributions are - * distributed under license by Red Hat Middleware LLC. - * - * This copyrighted material is made available to anyone wishing to use, modify, - * copy, or redistribute it subject to the terms and conditions of the GNU - * Lesser General Public License, as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this distribution; if not, write to: - * Free Software Foundation, Inc. - * 51 Franklin Street, Fifth Floor - * Boston, MA 02110-1301 USA - */ -package org.hibernate.envers.query; - -import org.hibernate.envers.configuration.AuditConfiguration; -import org.hibernate.envers.query.criteria.RevisionAuditExpression; -import org.hibernate.envers.query.criteria.AuditCriterion; -import org.hibernate.envers.query.order.RevisionAuditOrder; -import org.hibernate.envers.query.order.AuditOrder; -import org.hibernate.envers.query.projection.RevisionAuditProjection; -import org.hibernate.envers.query.projection.AuditProjection; -import org.hibernate.envers.tools.Triple; - -/** - * @author Adam Warski (adam at warski dot org) - */ -@SuppressWarnings({"JavaDoc"}) -public class RevisionProperty implements AuditProjection { - private RevisionProperty() { } - - /** - * Apply a "equal" constraint on the revision number - */ - public static AuditCriterion eq(Integer revision) { - return new RevisionAuditExpression(revision, "="); - } - - /** - * Apply a "not equal" constraint on the revision number - */ - public static AuditCriterion ne(Integer revision) { - return new RevisionAuditExpression(revision, "<>"); - } - - /** - * Apply a "greater than" constraint on the revision number - */ - public static AuditCriterion gt(Integer revision) { - return new RevisionAuditExpression(revision, ">"); - } - - /** - * Apply a "greater than or equal" constraint on the revision number - */ - public static AuditCriterion ge(Integer revision) { - return new RevisionAuditExpression(revision, ">="); - } - - /** - * Apply a "less than" constraint on the revision number - */ - public static AuditCriterion lt(Integer revision) { - return new RevisionAuditExpression(revision, "<"); - } - - /** - * Apply a "less than or equal" constraint on the revision number - */ - public static AuditCriterion le(Integer revision) { - return new RevisionAuditExpression(revision, "<="); - } - - /** - * Sort the results by revision in ascending order - */ - public static AuditOrder asc() { - return new RevisionAuditOrder(true); - } - - /** - * Sort the results by revision in descending order - */ - public static AuditOrder desc() { - return new RevisionAuditOrder(false); - } - - /** - * Select the maximum revision - */ - public static AuditProjection max() { - return new RevisionAuditProjection(RevisionAuditProjection.ProjectionType.MAX); - } - - /** - * Select the minimum revision - */ - public static AuditProjection min() { - return new RevisionAuditProjection(RevisionAuditProjection.ProjectionType.MIN); - } - - /** - * Count revisions - */ - public static AuditProjection count() { - return new RevisionAuditProjection(RevisionAuditProjection.ProjectionType.COUNT); - } - - /** - * Count distinct revisions - */ - public static AuditProjection countDistinct() { - return new RevisionAuditProjection(RevisionAuditProjection.ProjectionType.COUNT_DISTINCT); - } - - /** - * Distinct revisions - */ - public static AuditProjection distinct() { - return new RevisionAuditProjection(RevisionAuditProjection.ProjectionType.DISTINCT); - } - - /** - * Projection the revision number - */ - public static AuditProjection revisionNumber() { - return new RevisionProperty(); - } - - public Triple getData(AuditConfiguration verCfg) { - return Triple.make(null, verCfg.getAuditEntCfg().getRevisionPropPath(), false); - } -} diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/AggregatedFieldAuditExpression.java b/envers/src/main/java/org/hibernate/envers/query/criteria/AggregatedAuditExpression.java similarity index 73% rename from envers/src/main/java/org/hibernate/envers/query/criteria/AggregatedFieldAuditExpression.java rename to envers/src/main/java/org/hibernate/envers/query/criteria/AggregatedAuditExpression.java index 3928f8b3dd..5c2526d1f2 100644 --- a/envers/src/main/java/org/hibernate/envers/query/criteria/AggregatedFieldAuditExpression.java +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/AggregatedAuditExpression.java @@ -23,39 +23,42 @@ */ package org.hibernate.envers.query.criteria; -import java.util.ArrayList; -import java.util.List; - import org.hibernate.envers.configuration.AuditConfiguration; -import org.hibernate.envers.tools.query.Parameters; +import org.hibernate.envers.query.property.PropertyNameGetter; import org.hibernate.envers.tools.query.QueryBuilder; +import org.hibernate.envers.tools.query.Parameters; + +import java.util.List; +import java.util.ArrayList; /** * @author Adam Warski (adam at warski dot org) */ -public class AggregatedFieldAuditExpression implements AuditCriterion, ExtendableCriterion { +public class AggregatedAuditExpression implements AuditCriterion, ExtendableCriterion { + private PropertyNameGetter propertyNameGetter; + private AggregatedMode mode; + private List criterions; + + public AggregatedAuditExpression(PropertyNameGetter propertyNameGetter, AggregatedMode mode) { + this.propertyNameGetter = propertyNameGetter; + this.mode = mode; + criterions = new ArrayList(); + } + public static enum AggregatedMode { MAX, MIN } - private String propertyName; - private AggregatedMode mode; - private List criterions; - - public AggregatedFieldAuditExpression(String propertyName, AggregatedMode mode) { - this.propertyName = propertyName; - this.mode = mode; - criterions = new ArrayList(); - } - - public AggregatedFieldAuditExpression add(AuditCriterion criterion) { + public AggregatedAuditExpression add(AuditCriterion criterion) { criterions.add(criterion); return this; } - public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) { - CriteriaTools.checkPropertyNotARelation(verCfg, entityName, propertyName); + public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) { + String propertyName = propertyNameGetter.get(auditCfg); + + CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName); // This will be the aggregated query, containing all the specified conditions QueryBuilder subQb = qb.newSubQueryBuilder(); @@ -63,8 +66,8 @@ public class AggregatedFieldAuditExpression implements AuditCriterion, Extendabl // Adding all specified conditions both to the main query, as well as to the // aggregated one. for (AuditCriterion versionsCriteria : criterions) { - versionsCriteria.addToQuery(verCfg, entityName, qb, parameters); - versionsCriteria.addToQuery(verCfg, entityName, subQb, subQb.getRootParameters()); + versionsCriteria.addToQuery(auditCfg, entityName, qb, parameters); + versionsCriteria.addToQuery(auditCfg, entityName, subQb, subQb.getRootParameters()); } // Setting the desired projection of the aggregated query diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/AuditCriterion.java b/envers/src/main/java/org/hibernate/envers/query/criteria/AuditCriterion.java index 4f5e1cf5b1..745ad491a2 100644 --- a/envers/src/main/java/org/hibernate/envers/query/criteria/AuditCriterion.java +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/AuditCriterion.java @@ -31,5 +31,5 @@ import org.hibernate.envers.tools.query.QueryBuilder; * @author Adam Warski (adam at warski dot org) */ public interface AuditCriterion { - void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters); + void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters); } diff --git a/envers/src/main/java/org/hibernate/envers/query/RevisionTypeProperty.java b/envers/src/main/java/org/hibernate/envers/query/criteria/AuditId.java similarity index 53% rename from envers/src/main/java/org/hibernate/envers/query/RevisionTypeProperty.java rename to envers/src/main/java/org/hibernate/envers/query/criteria/AuditId.java index 44dcbb7fb0..80db160bcb 100644 --- a/envers/src/main/java/org/hibernate/envers/query/RevisionTypeProperty.java +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/AuditId.java @@ -21,44 +21,41 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.envers.query; -import org.hibernate.envers.configuration.AuditConfiguration; +package org.hibernate.envers.query.criteria; + import org.hibernate.envers.query.projection.AuditProjection; -import org.hibernate.envers.query.criteria.AuditCriterion; -import org.hibernate.envers.query.criteria.RevisionTypeAuditExpression; -import org.hibernate.envers.tools.Triple; -import org.hibernate.envers.RevisionType; +import org.hibernate.envers.query.projection.PropertyAuditProjection; +import org.hibernate.envers.query.property.OriginalIdPropertyName; /** + * Create restrictions and projections for the id of an audited entity. * @author Adam Warski (adam at warski dot org) */ @SuppressWarnings({"JavaDoc"}) -public class RevisionTypeProperty implements AuditProjection { - private RevisionTypeProperty() { } +public class AuditId { + /** + * Apply an "equal" constraint + */ + public AuditCriterion eq(Object id) { + return new IdentifierEqAuditExpression(id, true); + } /** - * Apply a "equal" constraint on the revision type - */ - public static AuditCriterion eq(RevisionType type) { - return new RevisionTypeAuditExpression(type, "="); - } + * Apply a "not equal" constraint + */ + public AuditCriterion ne(Object id) { + return new IdentifierEqAuditExpression(id, false); + } + + // Projections /** - * Apply a "not equal" constraint on the revision type + * Projection counting the values + * TODO: idPropertyName isn't needed, should be read from the configuration + * @param idPropertyName Name of the identifier property */ - public static AuditCriterion ne(RevisionType type) { - return new RevisionTypeAuditExpression(type, "<>"); - } - - /** - * Projection on the revision type - */ - public static AuditProjection revisionType() { - return new RevisionTypeProperty(); - } - - public Triple getData(AuditConfiguration verCfg) { - return Triple.make(null, verCfg.getAuditEntCfg().getRevisionTypePropName(), false); + public AuditProjection count(String idPropertyName) { + return new PropertyAuditProjection(new OriginalIdPropertyName(idPropertyName), "count", false); } } \ No newline at end of file diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/AuditProperty.java b/envers/src/main/java/org/hibernate/envers/query/criteria/AuditProperty.java new file mode 100644 index 0000000000..c1dcf185ed --- /dev/null +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/AuditProperty.java @@ -0,0 +1,266 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Middleware LLC. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ + +package org.hibernate.envers.query.criteria; + +import org.hibernate.envers.query.property.PropertyNameGetter; +import org.hibernate.envers.query.order.AuditOrder; +import org.hibernate.envers.query.order.PropertyAuditOrder; +import org.hibernate.envers.query.projection.AuditProjection; +import org.hibernate.envers.query.projection.PropertyAuditProjection; +import org.hibernate.envers.tools.Triple; +import org.hibernate.envers.configuration.AuditConfiguration; +import org.hibernate.criterion.MatchMode; + +import java.util.Collection; + +/** + * Create restrictions, projections and specify order for a property of an audited entity. + * @author Adam Warski (adam at warski dot org) + */ +@SuppressWarnings({"JavaDoc"}) +public class AuditProperty implements AuditProjection { + private final PropertyNameGetter propertyNameGetter; + + public AuditProperty(PropertyNameGetter propertyNameGetter) { + this.propertyNameGetter = propertyNameGetter; + } + + /** + * Apply an "equal" constraint + */ + public AuditCriterion eq(T value) { + return new SimpleAuditExpression(propertyNameGetter, value, "="); + } + + /** + * Apply a "not equal" constraint + */ + public AuditCriterion ne(T value) { + return new SimpleAuditExpression(propertyNameGetter, value, "<>"); + } + + /** + * Apply a "like" constraint + */ + public AuditCriterion like(T value) { + return new SimpleAuditExpression(propertyNameGetter, value, " like "); + } + + /** + * Apply a "like" constraint + */ + public AuditCriterion like(String value, MatchMode matchMode) { + return new SimpleAuditExpression(propertyNameGetter, matchMode.toMatchString(value), " like " ); + } + + /** + * Apply a "greater than" constraint + */ + public AuditCriterion gt(T value) { + return new SimpleAuditExpression(propertyNameGetter, value, ">"); + } + + /** + * Apply a "less than" constraint + */ + public AuditCriterion lt(T value) { + return new SimpleAuditExpression(propertyNameGetter, value, "<"); + } + + /** + * Apply a "less than or equal" constraint + */ + public AuditCriterion le(T value) { + return new SimpleAuditExpression(propertyNameGetter, value, "<="); + } + + /** + * Apply a "greater than or equal" constraint + */ + public AuditCriterion ge(T value) { + return new SimpleAuditExpression(propertyNameGetter, value, ">="); + } + + /** + * Apply a "between" constraint + */ + public AuditCriterion between(T lo, T hi) { + return new BetweenAuditExpression(propertyNameGetter, lo, hi); + } + + /** + * Apply an "in" constraint + */ + public AuditCriterion in(T[] values) { + return new InAuditExpression(propertyNameGetter, values); + } + + /** + * Apply an "in" constraint + */ + public AuditCriterion in(Collection values) { + return new InAuditExpression(propertyNameGetter, values.toArray()); + } + + /** + * Apply an "is null" constraint + */ + public AuditCriterion isNull() { + return new NullAuditExpression(propertyNameGetter); + } + + /** + * Apply an "equal" constraint to another property + */ + public AuditCriterion eqProperty(String otherPropertyName) { + return new PropertyAuditExpression(propertyNameGetter, otherPropertyName, "="); + } + + /** + * Apply a "not equal" constraint to another property + */ + public AuditCriterion neProperty(String otherPropertyName) { + return new PropertyAuditExpression(propertyNameGetter, otherPropertyName, "<>"); + } + + /** + * Apply a "less than" constraint to another property + */ + public AuditCriterion ltProperty(String otherPropertyName) { + return new PropertyAuditExpression(propertyNameGetter, otherPropertyName, "<"); + } + + /** + * Apply a "less than or equal" constraint to another property + */ + public AuditCriterion leProperty(String otherPropertyName) { + return new PropertyAuditExpression(propertyNameGetter, otherPropertyName, "<="); + } + + /** + * Apply a "greater than" constraint to another property + */ + public AuditCriterion gtProperty(String otherPropertyName) { + return new PropertyAuditExpression(propertyNameGetter, otherPropertyName, ">"); + } + + /** + * Apply a "greater than or equal" constraint to another property + */ + public AuditCriterion geProperty(String otherPropertyName) { + return new PropertyAuditExpression(propertyNameGetter, otherPropertyName, ">="); + } + + /** + * Apply an "is not null" constraint to the another property + */ + public AuditCriterion isNotNull() { + return new NotNullAuditExpression(propertyNameGetter); + } + + /** + * Apply a "maximalize" constraint, with the ability to specify further constraints on the maximized + * property + */ + public AggregatedAuditExpression maximize() { + return new AggregatedAuditExpression(propertyNameGetter, + AggregatedAuditExpression.AggregatedMode.MAX); + } + + /** + * Apply a "minimize" constraint, with the ability to specify further constraints on the minimized + * property + */ + public AggregatedAuditExpression minimize() { + return new AggregatedAuditExpression(propertyNameGetter, + AggregatedAuditExpression.AggregatedMode.MIN); + } + + // Projections + + /** + * Projection on the maximum value + */ + public AuditProjection max() { + return new PropertyAuditProjection(propertyNameGetter, "max", false); + } + + /** + * Projection on the minimum value + */ + public AuditProjection min() { + return new PropertyAuditProjection(propertyNameGetter, "min", false); + } + + /** + * Projection counting the values + */ + public AuditProjection count() { + return new PropertyAuditProjection(propertyNameGetter, "count", false); + } + + /** + * Projection counting distinct values + */ + public AuditProjection countDistinct() { + return new PropertyAuditProjection(propertyNameGetter, "count", true); + } + + /** + * Projection on distinct values + */ + public AuditProjection distinct() { + return new PropertyAuditProjection(propertyNameGetter, null, true); + } + + /** + * Projection using a custom function + */ + public AuditProjection function(String functionName) { + return new PropertyAuditProjection(propertyNameGetter, functionName, false); + } + + // Projection on this property + + public Triple getData(AuditConfiguration auditCfg) { + return Triple.make(null, propertyNameGetter.get(auditCfg), false); + } + + // Order + + /** + * Sort the results by the property in ascending order + */ + public AuditOrder asc() { + return new PropertyAuditOrder(propertyNameGetter, true); + } + + /** + * Sort the results by the property in descending order + */ + public AuditOrder desc() { + return new PropertyAuditOrder(propertyNameGetter, false); + } +} diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/AuditRelatedId.java b/envers/src/main/java/org/hibernate/envers/query/criteria/AuditRelatedId.java new file mode 100644 index 0000000000..b03f359be7 --- /dev/null +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/AuditRelatedId.java @@ -0,0 +1,54 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Middleware LLC. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ + +package org.hibernate.envers.query.criteria; + +import org.hibernate.envers.query.property.PropertyNameGetter; + +/** + * Create restrictions on an id of an entity related to an audited entity. + * @author Adam Warski (adam at warski dot org) + */ +@SuppressWarnings({"JavaDoc"}) +public class AuditRelatedId { + private final PropertyNameGetter propertyNameGetter; + + public AuditRelatedId(PropertyNameGetter propertyNameGetter) { + this.propertyNameGetter = propertyNameGetter; + } + + /** + * Apply an "equal" constraint + */ + public AuditCriterion eq(Object id) { + return new RelatedAuditExpression(propertyNameGetter, id, true); + } + + /** + * Apply a "not equal" constraint + */ + public AuditCriterion ne(Object id) { + return new RelatedAuditExpression(propertyNameGetter, id, false); + } +} \ No newline at end of file diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/BetweenAuditExpression.java b/envers/src/main/java/org/hibernate/envers/query/criteria/BetweenAuditExpression.java index 1023584b53..9443e33dd4 100644 --- a/envers/src/main/java/org/hibernate/envers/query/criteria/BetweenAuditExpression.java +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/BetweenAuditExpression.java @@ -26,23 +26,25 @@ package org.hibernate.envers.query.criteria; import org.hibernate.envers.configuration.AuditConfiguration; import org.hibernate.envers.tools.query.Parameters; import org.hibernate.envers.tools.query.QueryBuilder; +import org.hibernate.envers.query.property.PropertyNameGetter; /** * @author Adam Warski (adam at warski dot org) */ public class BetweenAuditExpression implements AuditCriterion { - private String propertyName; + private PropertyNameGetter propertyNameGetter; private Object lo; private Object hi; - public BetweenAuditExpression(String propertyName, Object lo, Object hi) { - this.propertyName = propertyName; + public BetweenAuditExpression(PropertyNameGetter propertyNameGetter, Object lo, Object hi) { + this.propertyNameGetter = propertyNameGetter; this.lo = lo; this.hi = hi; } - public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) { - CriteriaTools.checkPropertyNotARelation(verCfg, entityName, propertyName); + public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) { + String propertyName = propertyNameGetter.get(auditCfg); + CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName); parameters.addWhereWithParam(propertyName, ">=", lo); parameters.addWhereWithParam(propertyName, "<=", hi); } diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/IdentifierEqAuditExpression.java b/envers/src/main/java/org/hibernate/envers/query/criteria/IdentifierEqAuditExpression.java index 9442944d5f..5994cc8235 100644 --- a/envers/src/main/java/org/hibernate/envers/query/criteria/IdentifierEqAuditExpression.java +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/IdentifierEqAuditExpression.java @@ -28,17 +28,20 @@ import org.hibernate.envers.tools.query.Parameters; import org.hibernate.envers.tools.query.QueryBuilder; /** + * A criterion that expresses that the id of an entity is equal or not equal to some specified value. * @author Adam Warski (adam at warski dot org) */ public class IdentifierEqAuditExpression implements AuditCriterion { - private Object id; + private final Object id; + private final boolean equals; - public IdentifierEqAuditExpression(Object id) { + public IdentifierEqAuditExpression(Object id, boolean equals) { this.id = id; + this.equals = equals; } public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) { verCfg.getEntCfg().get(entityName).getIdMapper() - .addIdEqualsToQuery(parameters, id, verCfg.getAuditEntCfg().getOriginalIdPropName(), true); + .addIdEqualsToQuery(parameters, id, verCfg.getAuditEntCfg().getOriginalIdPropName(), equals); } } diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/InAuditExpression.java b/envers/src/main/java/org/hibernate/envers/query/criteria/InAuditExpression.java index e58ffd9902..68f4765cec 100644 --- a/envers/src/main/java/org/hibernate/envers/query/criteria/InAuditExpression.java +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/InAuditExpression.java @@ -26,21 +26,23 @@ package org.hibernate.envers.query.criteria; import org.hibernate.envers.configuration.AuditConfiguration; import org.hibernate.envers.tools.query.Parameters; import org.hibernate.envers.tools.query.QueryBuilder; +import org.hibernate.envers.query.property.PropertyNameGetter; /** * @author Adam Warski (adam at warski dot org) */ public class InAuditExpression implements AuditCriterion { - private String propertyName; + private PropertyNameGetter propertyNameGetter; private Object[] values; - public InAuditExpression(String propertyName, Object[] values) { - this.propertyName = propertyName; + public InAuditExpression(PropertyNameGetter propertyNameGetter, Object[] values) { + this.propertyNameGetter = propertyNameGetter; this.values = values; } - public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) { - CriteriaTools.checkPropertyNotARelation(verCfg, entityName, propertyName); + public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) { + String propertyName = propertyNameGetter.get(auditCfg); + CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName); parameters.addWhereWithParams(propertyName, "in (", values, ")"); } } diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/NotNullAuditExpression.java b/envers/src/main/java/org/hibernate/envers/query/criteria/NotNullAuditExpression.java index 167b3fd220..01e50a5917 100644 --- a/envers/src/main/java/org/hibernate/envers/query/criteria/NotNullAuditExpression.java +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/NotNullAuditExpression.java @@ -27,19 +27,21 @@ import org.hibernate.envers.configuration.AuditConfiguration; import org.hibernate.envers.entities.RelationDescription; import org.hibernate.envers.tools.query.Parameters; import org.hibernate.envers.tools.query.QueryBuilder; +import org.hibernate.envers.query.property.PropertyNameGetter; /** * @author Adam Warski (adam at warski dot org) */ public class NotNullAuditExpression implements AuditCriterion { - private String propertyName; + private PropertyNameGetter propertyNameGetter; - public NotNullAuditExpression(String propertyName) { - this.propertyName = propertyName; + public NotNullAuditExpression(PropertyNameGetter propertyNameGetter) { + this.propertyNameGetter = propertyNameGetter; } - public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) { - RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(verCfg, entityName, propertyName); + public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) { + String propertyName = propertyNameGetter.get(auditCfg); + RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName); if (relatedEntity == null) { parameters.addWhereWithParam(propertyName, "<>", null); diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/NullAuditExpression.java b/envers/src/main/java/org/hibernate/envers/query/criteria/NullAuditExpression.java index 0ef48f1eed..1aa379324a 100644 --- a/envers/src/main/java/org/hibernate/envers/query/criteria/NullAuditExpression.java +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/NullAuditExpression.java @@ -27,19 +27,21 @@ import org.hibernate.envers.configuration.AuditConfiguration; import org.hibernate.envers.entities.RelationDescription; import org.hibernate.envers.tools.query.Parameters; import org.hibernate.envers.tools.query.QueryBuilder; +import org.hibernate.envers.query.property.PropertyNameGetter; /** * @author Adam Warski (adam at warski dot org) */ public class NullAuditExpression implements AuditCriterion { - private String propertyName; + private PropertyNameGetter propertyNameGetter; - public NullAuditExpression(String propertyName) { - this.propertyName = propertyName; + public NullAuditExpression(PropertyNameGetter propertyNameGetter) { + this.propertyNameGetter = propertyNameGetter; } - public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) { - RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(verCfg, entityName, propertyName); + public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) { + String propertyName = propertyNameGetter.get(auditCfg); + RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName); if (relatedEntity == null) { parameters.addWhereWithParam(propertyName, "=", null); diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/PropertyAuditExpression.java b/envers/src/main/java/org/hibernate/envers/query/criteria/PropertyAuditExpression.java index 9b1a88860d..b414740e4b 100644 --- a/envers/src/main/java/org/hibernate/envers/query/criteria/PropertyAuditExpression.java +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/PropertyAuditExpression.java @@ -26,24 +26,26 @@ package org.hibernate.envers.query.criteria; import org.hibernate.envers.configuration.AuditConfiguration; import org.hibernate.envers.tools.query.Parameters; import org.hibernate.envers.tools.query.QueryBuilder; +import org.hibernate.envers.query.property.PropertyNameGetter; /** * @author Adam Warski (adam at warski dot org) */ public class PropertyAuditExpression implements AuditCriterion { - private String propertyName; + private PropertyNameGetter propertyNameGetter; private String otherPropertyName; private String op; - public PropertyAuditExpression(String propertyName, String otherPropertyName, String op) { - this.propertyName = propertyName; + public PropertyAuditExpression(PropertyNameGetter propertyNameGetter, String otherPropertyName, String op) { + this.propertyNameGetter = propertyNameGetter; this.otherPropertyName = otherPropertyName; this.op = op; } - public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) { - CriteriaTools.checkPropertyNotARelation(verCfg, entityName, propertyName); - CriteriaTools.checkPropertyNotARelation(verCfg, entityName, otherPropertyName); + public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) { + String propertyName = propertyNameGetter.get(auditCfg); + CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, propertyName); + CriteriaTools.checkPropertyNotARelation(auditCfg, entityName, otherPropertyName); parameters.addWhere(propertyName, op, otherPropertyName); } } diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/RelatedAuditExpression.java b/envers/src/main/java/org/hibernate/envers/query/criteria/RelatedAuditExpression.java index c8c7d9350f..89cf344e91 100644 --- a/envers/src/main/java/org/hibernate/envers/query/criteria/RelatedAuditExpression.java +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/RelatedAuditExpression.java @@ -28,23 +28,26 @@ import org.hibernate.envers.entities.RelationDescription; import org.hibernate.envers.exception.AuditException; import org.hibernate.envers.tools.query.Parameters; import org.hibernate.envers.tools.query.QueryBuilder; +import org.hibernate.envers.query.property.PropertyNameGetter; /** * @author Adam Warski (adam at warski dot org) */ public class RelatedAuditExpression implements AuditCriterion { - private String propertyName; - private Object id; - private boolean equals; + private final PropertyNameGetter propertyNameGetter; + private final Object id; + private final boolean equals; - public RelatedAuditExpression(String propertyName, Object id, boolean equals) { - this.propertyName = propertyName; + public RelatedAuditExpression(PropertyNameGetter propertyNameGetter, Object id, boolean equals) { + this.propertyNameGetter = propertyNameGetter; this.id = id; this.equals = equals; } - public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) { - RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(verCfg, entityName, propertyName); + public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) { + String propertyName = propertyNameGetter.get(auditCfg); + + RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName); if (relatedEntity == null) { throw new AuditException("This criterion can only be used on a property that is " + diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/SimpleAuditExpression.java b/envers/src/main/java/org/hibernate/envers/query/criteria/SimpleAuditExpression.java index b7fb5f5ca6..e1302ee014 100644 --- a/envers/src/main/java/org/hibernate/envers/query/criteria/SimpleAuditExpression.java +++ b/envers/src/main/java/org/hibernate/envers/query/criteria/SimpleAuditExpression.java @@ -28,23 +28,26 @@ import org.hibernate.envers.entities.RelationDescription; import org.hibernate.envers.exception.AuditException; import org.hibernate.envers.tools.query.Parameters; import org.hibernate.envers.tools.query.QueryBuilder; +import org.hibernate.envers.query.property.PropertyNameGetter; /** * @author Adam Warski (adam at warski dot org) */ public class SimpleAuditExpression implements AuditCriterion { - private String propertyName; + private PropertyNameGetter propertyNameGetter; private Object value; private String op; - public SimpleAuditExpression(String propertyName, Object value, String op) { - this.propertyName = propertyName; + public SimpleAuditExpression(PropertyNameGetter propertyNameGetter, Object value, String op) { + this.propertyNameGetter = propertyNameGetter; this.value = value; this.op = op; } - public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) { - RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(verCfg, entityName, propertyName); + public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) { + String propertyName = propertyNameGetter.get(auditCfg); + + RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(auditCfg, entityName, propertyName); if (relatedEntity == null) { parameters.addWhereWithParam(propertyName, op, value); diff --git a/envers/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java b/envers/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java index 65a2359ca1..e948653961 100644 --- a/envers/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java +++ b/envers/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java @@ -121,12 +121,6 @@ public abstract class AbstractAuditQuery implements AuditQuery { // Projection and order - public AuditQuery addProjection(String function, String propertyName) { - hasProjection = true; - qb.addProjection(function, propertyName, false); - return this; - } - public AuditQuery addProjection(AuditProjection projection) { Triple projectionData = projection.getData(verCfg); hasProjection = true; @@ -134,15 +128,12 @@ public abstract class AbstractAuditQuery implements AuditQuery { return this; } - public AuditQuery addOrder(String propertyName, boolean asc) { - hasOrder = true; - qb.addOrder(propertyName, asc); - return this; - } - public AuditQuery addOrder(AuditOrder order) { + hasOrder = true; + Pair orderData = order.getData(verCfg); - return addOrder(orderData.getFirst(), orderData.getSecond()); + qb.addOrder(orderData.getFirst(), orderData.getSecond()); + return this; } // Query properties diff --git a/envers/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java b/envers/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java index 9783cb77ec..0e64a4c0a4 100644 --- a/envers/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java +++ b/envers/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java @@ -61,7 +61,7 @@ public class EntitiesAtRevisionQuery extends AbstractAuditQuery { AuditEntitiesConfiguration verEntCfg = verCfg.getAuditEntCfg(); - String revisionPropertyPath = verEntCfg.getRevisionPropPath(); + String revisionPropertyPath = verEntCfg.getRevisionNumberPath(); String originalIdPropertyName = verEntCfg.getOriginalIdPropName(); // SELECT max(e2.revision) diff --git a/envers/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java b/envers/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java index 0e46d02cf4..6249fbff33 100644 --- a/envers/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java +++ b/envers/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java @@ -57,7 +57,7 @@ public class RevisionsOfEntityQuery extends AbstractAuditQuery { AuditEntitiesConfiguration verEntCfg = verCfg.getAuditEntCfg(); String originalId = verEntCfg.getOriginalIdPropName(); - String revisionPropertyName = verEntCfg.getRevisionPropName(); + String revisionPropertyName = verEntCfg.getRevisionFieldName(); Object revisionInfoObject = ((Map) versionsEntity.get(originalId)).get(revisionPropertyName); @@ -92,13 +92,13 @@ public class RevisionsOfEntityQuery extends AbstractAuditQuery { } if (!hasProjection && !hasOrder) { - String revisionPropertyPath = verEntCfg.getRevisionPropPath(); + String revisionPropertyPath = verEntCfg.getRevisionNumberPath(); qb.addOrder(revisionPropertyPath, true); } if (!selectEntitiesOnly) { qb.addFrom(verCfg.getAuditEntCfg().getRevisionInfoEntityName(), "r"); - qb.getRootParameters().addWhere(verCfg.getAuditEntCfg().getRevisionPropPath(), true, "=", "r.id", false); + qb.getRootParameters().addWhere(verCfg.getAuditEntCfg().getRevisionNumberPath(), true, "=", "r.id", false); } List queryResult = buildAndExecuteQuery(); diff --git a/envers/src/main/java/org/hibernate/envers/query/order/AuditOrder.java b/envers/src/main/java/org/hibernate/envers/query/order/AuditOrder.java index 41aff3d1ce..29aec6149c 100644 --- a/envers/src/main/java/org/hibernate/envers/query/order/AuditOrder.java +++ b/envers/src/main/java/org/hibernate/envers/query/order/AuditOrder.java @@ -31,8 +31,8 @@ import org.hibernate.envers.tools.Pair; */ public interface AuditOrder { /** - * @param verCfg Configuration. + * @param auditCfg Configuration. * @return A pair: (property name, ascending?). */ - Pair getData(AuditConfiguration verCfg); + Pair getData(AuditConfiguration auditCfg); } diff --git a/envers/src/main/java/org/hibernate/envers/query/order/RevisionAuditOrder.java b/envers/src/main/java/org/hibernate/envers/query/order/PropertyAuditOrder.java similarity index 74% rename from envers/src/main/java/org/hibernate/envers/query/order/RevisionAuditOrder.java rename to envers/src/main/java/org/hibernate/envers/query/order/PropertyAuditOrder.java index 8d2a1678d8..3fa03a116d 100644 --- a/envers/src/main/java/org/hibernate/envers/query/order/RevisionAuditOrder.java +++ b/envers/src/main/java/org/hibernate/envers/query/order/PropertyAuditOrder.java @@ -21,23 +21,26 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ + package org.hibernate.envers.query.order; import org.hibernate.envers.configuration.AuditConfiguration; import org.hibernate.envers.tools.Pair; +import org.hibernate.envers.query.property.PropertyNameGetter; /** * @author Adam Warski (adam at warski dot org) */ -public class RevisionAuditOrder implements AuditOrder { +public class PropertyAuditOrder implements AuditOrder { + private final PropertyNameGetter propertyNameGetter; private final boolean asc; - public RevisionAuditOrder(boolean asc) { + public PropertyAuditOrder(PropertyNameGetter propertyNameGetter, boolean asc) { + this.propertyNameGetter = propertyNameGetter; this.asc = asc; } - public Pair getData(AuditConfiguration verCfg) { - String revisionPropPath = verCfg.getAuditEntCfg().getRevisionPropPath(); - return Pair.make(revisionPropPath, asc); + public Pair getData(AuditConfiguration auditCfg) { + return Pair.make(propertyNameGetter.get(auditCfg), asc); } -} +} \ No newline at end of file diff --git a/envers/src/main/java/org/hibernate/envers/query/projection/AuditProjection.java b/envers/src/main/java/org/hibernate/envers/query/projection/AuditProjection.java index 1c8c084ffc..a792bf0d36 100644 --- a/envers/src/main/java/org/hibernate/envers/query/projection/AuditProjection.java +++ b/envers/src/main/java/org/hibernate/envers/query/projection/AuditProjection.java @@ -31,9 +31,8 @@ import org.hibernate.envers.tools.Triple; */ public interface AuditProjection { /** - * - * @param verCfg Configuration. + * @param auditCfg Configuration. * @return A triple: (function name - possibly null, property name, add distinct?). */ - Triple getData(AuditConfiguration verCfg); + Triple getData(AuditConfiguration auditCfg); } diff --git a/envers/src/main/java/org/hibernate/envers/query/projection/RevisionAuditProjection.java b/envers/src/main/java/org/hibernate/envers/query/projection/PropertyAuditProjection.java similarity index 59% rename from envers/src/main/java/org/hibernate/envers/query/projection/RevisionAuditProjection.java rename to envers/src/main/java/org/hibernate/envers/query/projection/PropertyAuditProjection.java index cb43e194e7..7c6fa0700f 100644 --- a/envers/src/main/java/org/hibernate/envers/query/projection/RevisionAuditProjection.java +++ b/envers/src/main/java/org/hibernate/envers/query/projection/PropertyAuditProjection.java @@ -21,40 +21,30 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ + package org.hibernate.envers.query.projection; import org.hibernate.envers.configuration.AuditConfiguration; import org.hibernate.envers.tools.Triple; +import org.hibernate.envers.query.property.PropertyNameGetter; /** * @author Adam Warski (adam at warski dot org) */ -public class RevisionAuditProjection implements AuditProjection { - public static enum ProjectionType { - MAX, - MIN, - COUNT, - COUNT_DISTINCT, - DISTINCT +public class PropertyAuditProjection implements AuditProjection { + private final PropertyNameGetter propertyNameGetter; + private final String function; + private final boolean distinct; + + public PropertyAuditProjection(PropertyNameGetter propertyNameGetter, String function, boolean distinct) { + this.propertyNameGetter = propertyNameGetter; + this.function = function; + this.distinct = distinct; } - private final ProjectionType type; + public Triple getData(AuditConfiguration auditCfg) { + String propertyName = propertyNameGetter.get(auditCfg); - public RevisionAuditProjection(ProjectionType type) { - this.type = type; + return Triple.make(function, propertyName, distinct); } - - public Triple getData(AuditConfiguration verCfg) { - String revisionPropPath = verCfg.getAuditEntCfg().getRevisionPropPath(); - - switch (type) { - case MAX: return Triple.make("max", revisionPropPath, false); - case MIN: return Triple.make("min", revisionPropPath, false); - case COUNT: return Triple.make("count", revisionPropPath, false); - case COUNT_DISTINCT: return Triple.make("count", revisionPropPath, true); - case DISTINCT: return Triple.make(null, revisionPropPath, true); - } - - throw new IllegalArgumentException("Unknown type " + type + "."); - } -} +} \ No newline at end of file diff --git a/envers/src/main/java/org/hibernate/envers/query/property/EntityPropertyName.java b/envers/src/main/java/org/hibernate/envers/query/property/EntityPropertyName.java new file mode 100644 index 0000000000..6013151e54 --- /dev/null +++ b/envers/src/main/java/org/hibernate/envers/query/property/EntityPropertyName.java @@ -0,0 +1,43 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Middleware LLC. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ + +package org.hibernate.envers.query.property; + +import org.hibernate.envers.configuration.AuditConfiguration; + +/** + * Used for specifying restrictions on a property of an audited entity. + * @author Adam Warski (adam at warski dot org) + */ +public class EntityPropertyName implements PropertyNameGetter { + private final String propertyName; + + public EntityPropertyName(String propertyName) { + this.propertyName = propertyName; + } + + public String get(AuditConfiguration auditCfg) { + return propertyName; + } +} diff --git a/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionAuditExpression.java b/envers/src/main/java/org/hibernate/envers/query/property/OriginalIdPropertyName.java similarity index 67% rename from envers/src/main/java/org/hibernate/envers/query/criteria/RevisionAuditExpression.java rename to envers/src/main/java/org/hibernate/envers/query/property/OriginalIdPropertyName.java index 838ad3f139..be96298484 100644 --- a/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionAuditExpression.java +++ b/envers/src/main/java/org/hibernate/envers/query/property/OriginalIdPropertyName.java @@ -21,25 +21,24 @@ * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ -package org.hibernate.envers.query.criteria; + +package org.hibernate.envers.query.property; import org.hibernate.envers.configuration.AuditConfiguration; -import org.hibernate.envers.tools.query.Parameters; -import org.hibernate.envers.tools.query.QueryBuilder; /** + * Used for specifying restrictions on the identifier. + * TODO: idPropertyName should be read basing on auditCfg + entityName * @author Adam Warski (adam at warski dot org) */ -public class RevisionAuditExpression implements AuditCriterion { - private Object value; - private String op; +public class OriginalIdPropertyName implements PropertyNameGetter { + private final String idPropertyName; - public RevisionAuditExpression(Object value, String op) { - this.value = value; - this.op = op; + public OriginalIdPropertyName(String idPropertyName) { + this.idPropertyName = idPropertyName; } - public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) { - parameters.addWhereWithParam(verCfg.getAuditEntCfg().getRevisionPropPath(), op, value); + public String get(AuditConfiguration auditCfg) { + return auditCfg.getAuditEntCfg().getOriginalIdPropName() + "." + idPropertyName; } } \ No newline at end of file diff --git a/envers/src/main/java/org/hibernate/envers/query/property/PropertyNameGetter.java b/envers/src/main/java/org/hibernate/envers/query/property/PropertyNameGetter.java new file mode 100644 index 0000000000..55319bba50 --- /dev/null +++ b/envers/src/main/java/org/hibernate/envers/query/property/PropertyNameGetter.java @@ -0,0 +1,39 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Middleware LLC. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ + +package org.hibernate.envers.query.property; + +import org.hibernate.envers.configuration.AuditConfiguration; + +/** + * Provides a function to get the name of a property, which is used in a query, to apply some restrictions on it. + * @author Adam Warski (adam at warski dot org) + */ +public interface PropertyNameGetter { + /** + * @param auditCfg Audit configuration. + * @return Name of the property, to be used in a query. + */ + public String get(AuditConfiguration auditCfg); +} diff --git a/envers/src/main/java/org/hibernate/envers/query/property/RevisionNumberPropertyName.java b/envers/src/main/java/org/hibernate/envers/query/property/RevisionNumberPropertyName.java new file mode 100644 index 0000000000..f742520bab --- /dev/null +++ b/envers/src/main/java/org/hibernate/envers/query/property/RevisionNumberPropertyName.java @@ -0,0 +1,37 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Middleware LLC. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ + +package org.hibernate.envers.query.property; + +import org.hibernate.envers.configuration.AuditConfiguration; + +/** + * Used for specifying restrictions on the revision number, corresponding to an audit entity. + * @author Adam Warski (adam at warski dot org) + */ +public class RevisionNumberPropertyName implements PropertyNameGetter { + public String get(AuditConfiguration auditCfg) { + return auditCfg.getAuditEntCfg().getRevisionNumberPath(); + } +} \ No newline at end of file diff --git a/envers/src/main/java/org/hibernate/envers/query/property/RevisionPropertyPropertyName.java b/envers/src/main/java/org/hibernate/envers/query/property/RevisionPropertyPropertyName.java new file mode 100644 index 0000000000..4b71358d1b --- /dev/null +++ b/envers/src/main/java/org/hibernate/envers/query/property/RevisionPropertyPropertyName.java @@ -0,0 +1,43 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Middleware LLC. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ + +package org.hibernate.envers.query.property; + +import org.hibernate.envers.configuration.AuditConfiguration; + +/** + * Used for specifying restrictions on a property of the revision entity, which is associated with an audit entity. + * @author Adam Warski (adam at warski dot org) + */ +public class RevisionPropertyPropertyName implements PropertyNameGetter { + private final String propertyName; + + public RevisionPropertyPropertyName(String propertyName) { + this.propertyName = propertyName; + } + + public String get(AuditConfiguration auditCfg) { + return auditCfg.getAuditEntCfg().getRevisionPropPath(propertyName); + } +} \ No newline at end of file diff --git a/envers/src/main/java/org/hibernate/envers/query/property/RevisionTypePropertyName.java b/envers/src/main/java/org/hibernate/envers/query/property/RevisionTypePropertyName.java new file mode 100644 index 0000000000..bbf4c98579 --- /dev/null +++ b/envers/src/main/java/org/hibernate/envers/query/property/RevisionTypePropertyName.java @@ -0,0 +1,37 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Middleware LLC. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ + +package org.hibernate.envers.query.property; + +import org.hibernate.envers.configuration.AuditConfiguration; + +/** + * Used for specifying restrictions on the revision number, corresponding to an audit entity. + * @author Adam Warski (adam at warski dot org) + */ +public class RevisionTypePropertyName implements PropertyNameGetter { + public String get(AuditConfiguration auditCfg) { + return auditCfg.getAuditEntCfg().getRevisionTypePropName(); + } +} \ No newline at end of file diff --git a/envers/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java b/envers/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java index 2c304cb22a..19fb1cf9e4 100644 --- a/envers/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java +++ b/envers/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java @@ -31,8 +31,7 @@ import org.hibernate.envers.configuration.AuditConfiguration; import org.hibernate.envers.exception.NotAuditedException; import org.hibernate.envers.exception.RevisionDoesNotExistException; import org.hibernate.envers.exception.AuditException; -import org.hibernate.envers.query.RevisionProperty; -import org.hibernate.envers.query.AuditRestrictions; +import org.hibernate.envers.query.AuditEntity; import static org.hibernate.envers.tools.ArgumentsTools.checkNotNull; import static org.hibernate.envers.tools.ArgumentsTools.checkPositive; @@ -101,7 +100,7 @@ public class AuditReaderImpl implements AuditReaderImplementor { try { // The result is put into the cache by the entity instantiator called from the query result = createQuery().forEntitiesAtRevision(cls, revision) - .add(AuditRestrictions.idEq(primaryKey)).getSingleResult(); + .add(AuditEntity.id().eq(primaryKey)).getSingleResult(); } catch (NoResultException e) { result = null; } catch (NonUniqueResultException e) { @@ -126,8 +125,8 @@ public class AuditReaderImpl implements AuditReaderImplementor { } return createQuery().forRevisionsOfEntity(cls, false, true) - .addProjection(RevisionProperty.revisionNumber()) - .add(AuditRestrictions.idEq(primaryKey)) + .addProjection(AuditEntity.revisionNumber()) + .add(AuditEntity.id().eq(primaryKey)) .getResultList(); } diff --git a/envers/src/main/java/org/hibernate/envers/synchronization/work/AbstractAuditWorkUnit.java b/envers/src/main/java/org/hibernate/envers/synchronization/work/AbstractAuditWorkUnit.java index ac94f850a5..2a09dd30b2 100644 --- a/envers/src/main/java/org/hibernate/envers/synchronization/work/AbstractAuditWorkUnit.java +++ b/envers/src/main/java/org/hibernate/envers/synchronization/work/AbstractAuditWorkUnit.java @@ -54,7 +54,7 @@ public abstract class AbstractAuditWorkUnit implements AuditWorkUnit { AuditEntitiesConfiguration entitiesCfg = verCfg.getAuditEntCfg(); Map originalId = new HashMap(); - originalId.put(entitiesCfg.getRevisionPropName(), revision); + originalId.put(entitiesCfg.getRevisionFieldName(), revision); verCfg.getEntCfg().get(getEntityName()).getIdMapper().mapToMapFromId(originalId, id); data.put(entitiesCfg.getRevisionTypePropName(), revisionType); diff --git a/envers/src/main/java/org/hibernate/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java b/envers/src/main/java/org/hibernate/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java index e4a7515e42..58f9389fdb 100644 --- a/envers/src/main/java/org/hibernate/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java +++ b/envers/src/main/java/org/hibernate/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java @@ -63,7 +63,7 @@ public class PersistentCollectionChangeWorkUnit extends AbstractAuditWorkUnit im for (PersistentCollectionChangeData persistentCollectionChangeData : collectionChanges) { // Setting the revision number ((Map) persistentCollectionChangeData.getData().get(entitiesCfg.getOriginalIdPropName())) - .put(entitiesCfg.getRevisionPropName(), revisionData); + .put(entitiesCfg.getRevisionFieldName(), revisionData); session.save(persistentCollectionChangeData.getEntityName(), persistentCollectionChangeData.getData()); } diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/query/AggregateQuery.java b/envers/src/test/java/org/hibernate/envers/test/integration/query/AggregateQuery.java index d4f87c8739..8a6fb73369 100644 --- a/envers/src/test/java/org/hibernate/envers/test/integration/query/AggregateQuery.java +++ b/envers/src/test/java/org/hibernate/envers/test/integration/query/AggregateQuery.java @@ -27,6 +27,7 @@ import javax.persistence.EntityManager; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.entities.IntTestEntity; +import org.hibernate.envers.query.AuditEntity; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -83,20 +84,20 @@ public class AggregateQuery extends AbstractEntityTest { public void testEntitiesAvgMaxQuery() { Object[] ver1 = (Object[]) getAuditReader().createQuery() .forEntitiesAtRevision(IntTestEntity.class, 1) - .addProjection("max", "number") - .addProjection("avg", "number") + .addProjection(AuditEntity.property("number").max()) + .addProjection(AuditEntity.property("number").function("avg")) .getSingleResult(); Object[] ver2 = (Object[]) getAuditReader().createQuery() .forEntitiesAtRevision(IntTestEntity.class, 2) - .addProjection("max", "number") - .addProjection("avg", "number") + .addProjection(AuditEntity.property("number").max()) + .addProjection(AuditEntity.property("number").function("avg")) .getSingleResult(); Object[] ver3 = (Object[]) getAuditReader().createQuery() .forEntitiesAtRevision(IntTestEntity.class, 3) - .addProjection("max", "number") - .addProjection("avg", "number") + .addProjection(AuditEntity.property("number").max()) + .addProjection(AuditEntity.property("number").function("avg")) .getSingleResult(); assert (Integer) ver1[0] == 10; diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/query/CustomRevEntityQuery.java b/envers/src/test/java/org/hibernate/envers/test/integration/query/CustomRevEntityQuery.java index b6ecbed3ea..500d88d71e 100644 --- a/envers/src/test/java/org/hibernate/envers/test/integration/query/CustomRevEntityQuery.java +++ b/envers/src/test/java/org/hibernate/envers/test/integration/query/CustomRevEntityQuery.java @@ -26,7 +26,7 @@ package org.hibernate.envers.test.integration.query; import java.util.List; import javax.persistence.EntityManager; -import org.hibernate.envers.query.AuditRestrictions; +import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.entities.StrIntTestEntity; import org.hibernate.envers.test.entities.reventity.CustomRevEntity; @@ -42,6 +42,7 @@ import org.hibernate.ejb.Ejb3Configuration; public class CustomRevEntityQuery extends AbstractEntityTest { private Integer id1; private Integer id2; + private Long timestamp; public void configure(Ejb3Configuration cfg) { cfg.addAnnotatedClass(CustomRevEntity.class); @@ -49,7 +50,7 @@ public class CustomRevEntityQuery extends AbstractEntityTest { } @BeforeClass(dependsOnMethods = "init") - public void initData() { + public void initData() throws InterruptedException { // Revision 1 EntityManager em = getEntityManager(); em.getTransaction().begin(); @@ -65,6 +66,12 @@ public class CustomRevEntityQuery extends AbstractEntityTest { em.getTransaction().commit(); + Thread.sleep(100); + + timestamp = System.currentTimeMillis(); + + Thread.sleep(100); + // Revision 2 em.getTransaction().begin(); @@ -79,7 +86,7 @@ public class CustomRevEntityQuery extends AbstractEntityTest { public void testRevisionsOfId1Query() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .add(AuditRestrictions.idEq(id1)) + .add(AuditEntity.id().eq(id1)) .getResultList(); assert result.get(0)[0].equals(new StrIntTestEntity("a", 10, id1)); @@ -95,11 +102,25 @@ public class CustomRevEntityQuery extends AbstractEntityTest { public void testRevisionsOfId2Query() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .add(AuditRestrictions.idEq(id2)) + .add(AuditEntity.id().eq(id2)) .getResultList(); assert result.get(0)[0].equals(new StrIntTestEntity("b", 15, id2)); assert result.get(0)[1] instanceof CustomRevEntity; assert ((CustomRevEntity) result.get(0)[1]).getCustomId() == 1; } + + @Test + public void testRevisionPropertyRestriction() { + List result = getAuditReader().createQuery() + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) + .add(AuditEntity.id().eq(id1)) + .add(AuditEntity.revisionProperty("customTimestamp").ge(timestamp)) + .getResultList(); + + assert result.get(0)[0].equals(new StrIntTestEntity("c", 10, id1)); + assert result.get(0)[1] instanceof CustomRevEntity; + assert ((CustomRevEntity) result.get(0)[1]).getCustomId() == 2; + assert ((CustomRevEntity) result.get(0)[1]).getCustomTimestamp() >= timestamp; + } } \ No newline at end of file diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/query/DeletedEntities.java b/envers/src/test/java/org/hibernate/envers/test/integration/query/DeletedEntities.java index 6e366b6f97..06b8a4de07 100644 --- a/envers/src/test/java/org/hibernate/envers/test/integration/query/DeletedEntities.java +++ b/envers/src/test/java/org/hibernate/envers/test/integration/query/DeletedEntities.java @@ -28,7 +28,7 @@ import javax.persistence.EntityManager; import org.hibernate.envers.DefaultRevisionEntity; import org.hibernate.envers.RevisionType; -import org.hibernate.envers.query.AuditRestrictions; +import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.entities.StrIntTestEntity; import org.testng.annotations.BeforeClass; @@ -79,16 +79,16 @@ public class DeletedEntities extends AbstractEntityTest { .getResultList().size() == 1; assert (Long) getAuditReader().createQuery().forEntitiesAtRevision(StrIntTestEntity.class, 1) - .addProjection("count", "originalId.id").getResultList().get(0) == 2; + .addProjection(AuditEntity.id().count("id")).getResultList().get(0) == 2; assert (Long) getAuditReader().createQuery().forEntitiesAtRevision(StrIntTestEntity.class, 2) - .addProjection("count", "originalId.id").getResultList().get(0) == 1; + .addProjection(AuditEntity.id().count("id")).getResultList().get(0) == 1; } @Test public void testRevisionsOfEntityWithoutDelete() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, false) - .add(AuditRestrictions.idEq(id2)) + .add(AuditEntity.id().eq(id2)) .getResultList(); assert result.size() == 1; diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/query/MaximalizePropertyQuery.java b/envers/src/test/java/org/hibernate/envers/test/integration/query/MaximalizePropertyQuery.java index 1940da550e..3a0231690d 100644 --- a/envers/src/test/java/org/hibernate/envers/test/integration/query/MaximalizePropertyQuery.java +++ b/envers/src/test/java/org/hibernate/envers/test/integration/query/MaximalizePropertyQuery.java @@ -27,8 +27,7 @@ import java.util.Arrays; import java.util.List; import javax.persistence.EntityManager; -import org.hibernate.envers.query.RevisionProperty; -import org.hibernate.envers.query.AuditRestrictions; +import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.entities.StrIntTestEntity; import org.testng.annotations.BeforeClass; @@ -103,9 +102,9 @@ public class MaximalizePropertyQuery extends AbstractEntityTest { public void testMaximizeWithIdEq() { List revs_id1 = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.revisionNumber()) - .add(AuditRestrictions.maximizeProperty("number") - .add(AuditRestrictions.idEq(id2))) + .addProjection(AuditEntity.revisionNumber()) + .add(AuditEntity.property("number").maximize() + .add(AuditEntity.id().eq(id2))) .getResultList(); assert Arrays.asList(2, 3, 4).equals(revs_id1); @@ -115,11 +114,24 @@ public class MaximalizePropertyQuery extends AbstractEntityTest { public void testMinimizeWithPropertyEq() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.revisionNumber()) - .add(AuditRestrictions.minimizeProperty("number") - .add(AuditRestrictions.eq("str1", "a"))) + .addProjection(AuditEntity.revisionNumber()) + .add(AuditEntity.property("number").minimize() + .add(AuditEntity.property("str1").eq("a"))) .getResultList(); assert Arrays.asList(1).equals(result); } + + @Test + public void testMaximizeRevision() { + List result = getAuditReader().createQuery() + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) + .addProjection(AuditEntity.revisionNumber()) + .add(AuditEntity.revisionNumber().maximize() + .add(AuditEntity.property("number").eq(10))) + .getResultList(); + + System.out.println(result); + assert Arrays.asList(2).equals(result); + } } \ No newline at end of file diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/query/OrderByLimitQuery.java b/envers/src/test/java/org/hibernate/envers/test/integration/query/OrderByLimitQuery.java index 4ff3d88234..6d773cac33 100644 --- a/envers/src/test/java/org/hibernate/envers/test/integration/query/OrderByLimitQuery.java +++ b/envers/src/test/java/org/hibernate/envers/test/integration/query/OrderByLimitQuery.java @@ -29,6 +29,7 @@ import javax.persistence.EntityManager; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.entities.IntTestEntity; +import org.hibernate.envers.query.AuditEntity; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -92,21 +93,21 @@ public class OrderByLimitQuery extends AbstractEntityTest { public void testEntitiesOrderLimitByQueryRev1() { List res_0_to_1 = getAuditReader().createQuery() .forEntitiesAtRevision(IntTestEntity.class, 1) - .addOrder("number", false) + .addOrder(AuditEntity.property("number").desc()) .setFirstResult(0) .setMaxResults(2) .getResultList(); List res_2_to_3 = getAuditReader().createQuery() .forEntitiesAtRevision(IntTestEntity.class, 1) - .addOrder("number", false) + .addOrder(AuditEntity.property("number").desc()) .setFirstResult(2) .setMaxResults(2) .getResultList(); List res_empty = getAuditReader().createQuery() .forEntitiesAtRevision(IntTestEntity.class, 1) - .addOrder("number", false) + .addOrder(AuditEntity.property("number").desc()) .setFirstResult(4) .setMaxResults(2) .getResultList(); @@ -120,21 +121,21 @@ public class OrderByLimitQuery extends AbstractEntityTest { public void testEntitiesOrderLimitByQueryRev2() { List res_0_to_1 = getAuditReader().createQuery() .forEntitiesAtRevision(IntTestEntity.class, 2) - .addOrder("number", false) + .addOrder(AuditEntity.property("number").desc()) .setFirstResult(0) .setMaxResults(2) .getResultList(); List res_2_to_3 = getAuditReader().createQuery() .forEntitiesAtRevision(IntTestEntity.class, 2) - .addOrder("number", false) + .addOrder(AuditEntity.property("number").desc()) .setFirstResult(2) .setMaxResults(2) .getResultList(); List res_4 = getAuditReader().createQuery() .forEntitiesAtRevision(IntTestEntity.class, 2) - .addOrder("number", false) + .addOrder(AuditEntity.property("number").desc()) .setFirstResult(4) .setMaxResults(2) .getResultList(); diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/query/RevisionConstraintQuery.java b/envers/src/test/java/org/hibernate/envers/test/integration/query/RevisionConstraintQuery.java index 614fc207a5..8eb48570c0 100644 --- a/envers/src/test/java/org/hibernate/envers/test/integration/query/RevisionConstraintQuery.java +++ b/envers/src/test/java/org/hibernate/envers/test/integration/query/RevisionConstraintQuery.java @@ -27,9 +27,7 @@ import java.util.Arrays; import java.util.List; import javax.persistence.EntityManager; -import org.hibernate.envers.query.RevisionProperty; -import org.hibernate.envers.query.AuditRestrictions; -import org.hibernate.envers.query.RevisionTypeProperty; +import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.entities.StrIntTestEntity; import org.hibernate.envers.RevisionType; @@ -104,8 +102,8 @@ public class RevisionConstraintQuery extends AbstractEntityTest { public void testRevisionsLtQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.distinct()) - .add(RevisionProperty.lt(3)) + .addProjection(AuditEntity.revisionNumber().distinct()) + .add(AuditEntity.revisionNumber().lt(3)) .getResultList(); assert Arrays.asList(1, 2).equals(result); @@ -115,8 +113,8 @@ public class RevisionConstraintQuery extends AbstractEntityTest { public void testRevisionsGeQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.distinct()) - .add(RevisionProperty.ge(2)) + .addProjection(AuditEntity.revisionNumber().distinct()) + .add(AuditEntity.revisionNumber().ge(2)) .getResultList(); assert Arrays.asList(2, 3, 4).equals(result); @@ -126,9 +124,9 @@ public class RevisionConstraintQuery extends AbstractEntityTest { public void testRevisionsLeWithPropertyQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.revisionNumber()) - .add(RevisionProperty.le(3)) - .add(AuditRestrictions.eq("str1", "a")) + .addProjection(AuditEntity.revisionNumber()) + .add(AuditEntity.revisionNumber().le(3)) + .add(AuditEntity.property("str1").eq("a")) .getResultList(); assert Arrays.asList(1).equals(result); @@ -138,9 +136,9 @@ public class RevisionConstraintQuery extends AbstractEntityTest { public void testRevisionsGtWithPropertyQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.revisionNumber()) - .add(RevisionProperty.gt(1)) - .add(AuditRestrictions.lt("number", 10)) + .addProjection(AuditEntity.revisionNumber()) + .add(AuditEntity.revisionNumber().gt(1)) + .add(AuditEntity.property("number").lt(10)) .getResultList(); assert Arrays.asList(3, 4).equals(result); @@ -150,11 +148,11 @@ public class RevisionConstraintQuery extends AbstractEntityTest { public void testRevisionProjectionQuery() { Object[] result = (Object[]) getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.max()) - .addProjection(RevisionProperty.count()) - .addProjection(RevisionProperty.countDistinct()) - .addProjection(RevisionProperty.min()) - .add(AuditRestrictions.idEq(id1)) + .addProjection(AuditEntity.revisionNumber().max()) + .addProjection(AuditEntity.revisionNumber().count()) + .addProjection(AuditEntity.revisionNumber().countDistinct()) + .addProjection(AuditEntity.revisionNumber().min()) + .add(AuditEntity.id().eq(id1)) .getSingleResult(); assert (Integer) result[0] == 4; @@ -167,9 +165,9 @@ public class RevisionConstraintQuery extends AbstractEntityTest { public void testRevisionOrderQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.revisionNumber()) - .add(AuditRestrictions.idEq(id1)) - .addOrder(RevisionProperty.desc()) + .addProjection(AuditEntity.revisionNumber()) + .add(AuditEntity.id().eq(id1)) + .addOrder(AuditEntity.revisionNumber().desc()) .getResultList(); assert Arrays.asList(4, 3, 2, 1).equals(result); @@ -180,8 +178,8 @@ public class RevisionConstraintQuery extends AbstractEntityTest { // The query shouldn't be ordered as always, otherwise - we get an exception. Object result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.count()) - .add(AuditRestrictions.idEq(id1)) + .addProjection(AuditEntity.revisionNumber().count()) + .add(AuditEntity.id().eq(id1)) .getSingleResult(); assert (Long) result == 4; @@ -192,8 +190,8 @@ public class RevisionConstraintQuery extends AbstractEntityTest { // The query shouldn't be ordered as always, otherwise - we get an exception. List results = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, true, true) - .add(AuditRestrictions.idEq(id1)) - .add(RevisionTypeProperty.eq(RevisionType.MOD)) + .add(AuditEntity.id().eq(id1)) + .add(AuditEntity.revisionType().eq(RevisionType.MOD)) .getResultList(); assert results.size() == 3; @@ -207,8 +205,8 @@ public class RevisionConstraintQuery extends AbstractEntityTest { // The query shouldn't be ordered as always, otherwise - we get an exception. List results = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, true, true) - .add(AuditRestrictions.idEq(id1)) - .add(RevisionTypeProperty.ne(RevisionType.MOD)) + .add(AuditEntity.id().eq(id1)) + .add(AuditEntity.revisionType().ne(RevisionType.MOD)) .getResultList(); assert results.size() == 1; diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/query/SimpleQuery.java b/envers/src/test/java/org/hibernate/envers/test/integration/query/SimpleQuery.java index ff3c1527c4..6935b88841 100644 --- a/envers/src/test/java/org/hibernate/envers/test/integration/query/SimpleQuery.java +++ b/envers/src/test/java/org/hibernate/envers/test/integration/query/SimpleQuery.java @@ -30,9 +30,7 @@ import javax.persistence.EntityManager; import org.hibernate.envers.DefaultRevisionEntity; import org.hibernate.envers.RevisionType; -import org.hibernate.envers.query.RevisionProperty; -import org.hibernate.envers.query.RevisionTypeProperty; -import org.hibernate.envers.query.AuditRestrictions; +import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.entities.StrIntTestEntity; import org.hibernate.envers.test.tools.TestTools; @@ -108,7 +106,7 @@ public class SimpleQuery extends AbstractEntityTest { public void testEntitiesIdQuery() { StrIntTestEntity ver2 = (StrIntTestEntity) getAuditReader().createQuery() .forEntitiesAtRevision(StrIntTestEntity.class, 2) - .add(AuditRestrictions.idEq(id2)) + .add(AuditEntity.id().eq(id2)) .getSingleResult(); assert ver2.equals(new StrIntTestEntity("a", 20, id2)); @@ -118,17 +116,17 @@ public class SimpleQuery extends AbstractEntityTest { public void testEntitiesPropertyEqualsQuery() { List ver1 = getAuditReader().createQuery() .forEntitiesAtRevision(StrIntTestEntity.class, 1) - .add(AuditRestrictions.eq("str1", "a")) + .add(AuditEntity.property("str1").eq("a")) .getResultList(); List ver2 = getAuditReader().createQuery() .forEntitiesAtRevision(StrIntTestEntity.class, 2) - .add(AuditRestrictions.eq("str1", "a")) + .add(AuditEntity.property("str1").eq("a")) .getResultList(); List ver3 = getAuditReader().createQuery() .forEntitiesAtRevision(StrIntTestEntity.class, 3) - .add(AuditRestrictions.eq("str1", "a")) + .add(AuditEntity.property("str1").eq("a")) .getResultList(); assert new HashSet(ver1).equals(TestTools.makeSet(new StrIntTestEntity("a", 10, id1), @@ -142,17 +140,17 @@ public class SimpleQuery extends AbstractEntityTest { public void testEntitiesPropertyLeQuery() { List ver1 = getAuditReader().createQuery() .forEntitiesAtRevision(StrIntTestEntity.class, 1) - .add(AuditRestrictions.le("number", 10)) + .add(AuditEntity.property("number").le(10)) .getResultList(); List ver2 = getAuditReader().createQuery() .forEntitiesAtRevision(StrIntTestEntity.class, 2) - .add(AuditRestrictions.le("number", 10)) + .add(AuditEntity.property("number").le(10)) .getResultList(); List ver3 = getAuditReader().createQuery() .forEntitiesAtRevision(StrIntTestEntity.class, 3) - .add(AuditRestrictions.le("number", 10)) + .add(AuditEntity.property("number").le(10)) .getResultList(); assert new HashSet(ver1).equals(TestTools.makeSet(new StrIntTestEntity("a", 10, id1), @@ -167,23 +165,23 @@ public class SimpleQuery extends AbstractEntityTest { public void testRevisionsPropertyEqQuery() { List revs_id1 = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.revisionNumber()) - .add(AuditRestrictions.le("str1", "a")) - .add(AuditRestrictions.idEq(id1)) + .addProjection(AuditEntity.revisionNumber()) + .add(AuditEntity.property("str1").le("a")) + .add(AuditEntity.id().eq(id1)) .getResultList(); List revs_id2 = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.revisionNumber()) - .add(AuditRestrictions.le("str1", "a")) - .add(AuditRestrictions.idEq(id2)) + .addProjection(AuditEntity.revisionNumber()) + .add(AuditEntity.property("str1").le("a")) + .add(AuditEntity.id().eq(id2)) .getResultList(); List revs_id3 = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionProperty.revisionNumber()) - .add(AuditRestrictions.le("str1", "a")) - .add(AuditRestrictions.idEq(id3)) + .addProjection(AuditEntity.revisionNumber()) + .add(AuditEntity.property("str1").le("a")) + .add(AuditEntity.id().eq(id3)) .getResultList(); assert Arrays.asList(1).equals(revs_id1); @@ -195,7 +193,7 @@ public class SimpleQuery extends AbstractEntityTest { public void testSelectEntitiesQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, true, false) - .add(AuditRestrictions.idEq(id1)) + .add(AuditEntity.id().eq(id1)) .getResultList(); assert result.size() == 2; @@ -208,7 +206,7 @@ public class SimpleQuery extends AbstractEntityTest { public void testSelectEntitiesAndRevisionsQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .add(AuditRestrictions.idEq(id1)) + .add(AuditEntity.id().eq(id1)) .getResultList(); assert result.size() == 3; @@ -230,8 +228,8 @@ public class SimpleQuery extends AbstractEntityTest { public void testSelectRevisionTypeQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .addProjection(RevisionTypeProperty.revisionType()) - .add(AuditRestrictions.idEq(id1)) + .addProjection(AuditEntity.revisionType()) + .add(AuditEntity.id().eq(id1)) .getResultList(); assert result.size() == 3; @@ -254,7 +252,7 @@ public class SimpleQuery extends AbstractEntityTest { public void testEmptyConjunctionRevisionOfEntityQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .add(AuditRestrictions.conjunction()) + .add(AuditEntity.conjunction()) .getResultList(); assert result.size() == 7; @@ -264,7 +262,7 @@ public class SimpleQuery extends AbstractEntityTest { public void testEmptyDisjunctionRevisionOfEntityQuery() { List result = getAuditReader().createQuery() .forRevisionsOfEntity(StrIntTestEntity.class, false, true) - .add(AuditRestrictions.disjunction()) + .add(AuditEntity.disjunction()) .getResultList(); assert result.size() == 0; diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/query/ids/EmbIdOneToManyQuery.java b/envers/src/test/java/org/hibernate/envers/test/integration/query/ids/EmbIdOneToManyQuery.java index a97a120007..022138c639 100644 --- a/envers/src/test/java/org/hibernate/envers/test/integration/query/ids/EmbIdOneToManyQuery.java +++ b/envers/src/test/java/org/hibernate/envers/test/integration/query/ids/EmbIdOneToManyQuery.java @@ -28,7 +28,7 @@ import java.util.List; import java.util.Set; import javax.persistence.EntityManager; -import org.hibernate.envers.query.AuditRestrictions; +import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.entities.ids.EmbId; import org.hibernate.envers.test.entities.onetomany.ids.SetRefEdEmbIdEntity; @@ -105,32 +105,32 @@ public class EmbIdOneToManyQuery extends AbstractEntityTest { public void testEntitiesReferencedToId3() { Set rev1_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 1) - .add(AuditRestrictions.relatedIdEq("reference", id3)) + .add(AuditEntity.relatedId("reference").eq(id3)) .getResultList()); Set rev1 = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 1) - .add(AuditRestrictions.eq("reference", new SetRefEdEmbIdEntity(id3, null))) + .add(AuditEntity.property("reference").eq(new SetRefEdEmbIdEntity(id3, null))) .getResultList()); Set rev2_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 2) - .add(AuditRestrictions.relatedIdEq("reference", id3)) + .add(AuditEntity.relatedId("reference").eq(id3)) .getResultList()); Set rev2 = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 2) - .add(AuditRestrictions.eq("reference", new SetRefEdEmbIdEntity(id3, null))) + .add(AuditEntity.property("reference").eq(new SetRefEdEmbIdEntity(id3, null))) .getResultList()); Set rev3_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 3) - .add(AuditRestrictions.relatedIdEq("reference", id3)) + .add(AuditEntity.relatedId("reference").eq(id3)) .getResultList()); Set rev3 = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 3) - .add(AuditRestrictions.eq("reference", new SetRefEdEmbIdEntity(id3, null))) + .add(AuditEntity.property("reference").eq(new SetRefEdEmbIdEntity(id3, null))) .getResultList()); assert rev1.equals(rev1_related); @@ -147,17 +147,17 @@ public class EmbIdOneToManyQuery extends AbstractEntityTest { public void testEntitiesReferencedToId4() { Set rev1_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 1) - .add(AuditRestrictions.relatedIdEq("reference", id4)) + .add(AuditEntity.relatedId("reference").eq(id4)) .getResultList()); Set rev2_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 2) - .add(AuditRestrictions.relatedIdEq("reference", id4)) + .add(AuditEntity.relatedId("reference").eq(id4)) .getResultList()); Set rev3_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 3) - .add(AuditRestrictions.relatedIdEq("reference", id4)) + .add(AuditEntity.relatedId("reference").eq(id4)) .getResultList()); assert rev1_related.equals(TestTools.makeSet()); @@ -169,20 +169,20 @@ public class EmbIdOneToManyQuery extends AbstractEntityTest { public void testEntitiesReferencedByIng1ToId3() { List rev1_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 1) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id1)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id1)) .getResultList(); Object rev2_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 2) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id1)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id1)) .getSingleResult(); Object rev3_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 3) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id1)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id1)) .getSingleResult(); assert rev1_related.size() == 0; @@ -194,20 +194,20 @@ public class EmbIdOneToManyQuery extends AbstractEntityTest { public void testEntitiesReferencedByIng2ToId3() { List rev1_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 1) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id2)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id2)) .getResultList(); List rev2_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 2) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id2)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id2)) .getResultList(); Object rev3_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngEmbIdEntity.class, 3) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id2)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id2)) .getSingleResult(); assert rev1_related.size() == 0; diff --git a/envers/src/test/java/org/hibernate/envers/test/integration/query/ids/MulIdOneToManyQuery.java b/envers/src/test/java/org/hibernate/envers/test/integration/query/ids/MulIdOneToManyQuery.java index 52d18f9ca6..7dd554d5cf 100644 --- a/envers/src/test/java/org/hibernate/envers/test/integration/query/ids/MulIdOneToManyQuery.java +++ b/envers/src/test/java/org/hibernate/envers/test/integration/query/ids/MulIdOneToManyQuery.java @@ -28,7 +28,7 @@ import java.util.List; import java.util.Set; import javax.persistence.EntityManager; -import org.hibernate.envers.query.AuditRestrictions; +import org.hibernate.envers.query.AuditEntity; import org.hibernate.envers.test.AbstractEntityTest; import org.hibernate.envers.test.entities.ids.MulId; import org.hibernate.envers.test.entities.onetomany.ids.SetRefEdMulIdEntity; @@ -105,32 +105,32 @@ public class MulIdOneToManyQuery extends AbstractEntityTest { public void testEntitiesReferencedToId3() { Set rev1_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 1) - .add(AuditRestrictions.relatedIdEq("reference", id3)) + .add(AuditEntity.relatedId("reference").eq(id3)) .getResultList()); Set rev1 = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 1) - .add(AuditRestrictions.eq("reference", new SetRefEdMulIdEntity(id3, null))) + .add(AuditEntity.property("reference").eq(new SetRefEdMulIdEntity(id3, null))) .getResultList()); Set rev2_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 2) - .add(AuditRestrictions.relatedIdEq("reference", id3)) + .add(AuditEntity.relatedId("reference").eq(id3)) .getResultList()); Set rev2 = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 2) - .add(AuditRestrictions.eq("reference", new SetRefEdMulIdEntity(id3, null))) + .add(AuditEntity.property("reference").eq(new SetRefEdMulIdEntity(id3, null))) .getResultList()); Set rev3_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 3) - .add(AuditRestrictions.relatedIdEq("reference", id3)) + .add(AuditEntity.relatedId("reference").eq(id3)) .getResultList()); Set rev3 = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 3) - .add(AuditRestrictions.eq("reference", new SetRefEdMulIdEntity(id3, null))) + .add(AuditEntity.property("reference").eq(new SetRefEdMulIdEntity(id3, null))) .getResultList()); assert rev1.equals(rev1_related); @@ -147,17 +147,17 @@ public class MulIdOneToManyQuery extends AbstractEntityTest { public void testEntitiesReferencedToId4() { Set rev1_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 1) - .add(AuditRestrictions.relatedIdEq("reference", id4)) + .add(AuditEntity.relatedId("reference").eq(id4)) .getResultList()); Set rev2_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 2) - .add(AuditRestrictions.relatedIdEq("reference", id4)) + .add(AuditEntity.relatedId("reference").eq(id4)) .getResultList()); Set rev3_related = new HashSet(getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 3) - .add(AuditRestrictions.relatedIdEq("reference", id4)) + .add(AuditEntity.relatedId("reference").eq(id4)) .getResultList()); assert rev1_related.equals(TestTools.makeSet()); @@ -169,20 +169,20 @@ public class MulIdOneToManyQuery extends AbstractEntityTest { public void testEntitiesReferencedByIng1ToId3() { List rev1_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 1) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id1)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id1)) .getResultList(); Object rev2_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 2) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id1)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id1)) .getSingleResult(); Object rev3_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 3) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id1)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id1)) .getSingleResult(); assert rev1_related.size() == 0; @@ -194,20 +194,20 @@ public class MulIdOneToManyQuery extends AbstractEntityTest { public void testEntitiesReferencedByIng2ToId3() { List rev1_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 1) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id2)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id2)) .getResultList(); List rev2_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 2) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id2)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id2)) .getResultList(); Object rev3_related = getAuditReader().createQuery() .forEntitiesAtRevision(SetRefIngMulIdEntity.class, 3) - .add(AuditRestrictions.relatedIdEq("reference", id3)) - .add(AuditRestrictions.idEq(id2)) + .add(AuditEntity.relatedId("reference").eq(id3)) + .add(AuditEntity.id().eq(id2)) .getSingleResult(); assert rev1_related.size() == 0;