/// <summary> /// Compute common part for both queries. /// </summary> private QueryBuilder commonQueryPart(MiddleIdData referencedIdData, MiddleIdData indexIdData, string versionsMiddleEntityName, string originalIdPropertyName) { var eeOriginalIdPropertyPath = QueryConstants.MiddleEntityAlias + "." + originalIdPropertyName; // SELECT new list(ee) FROM middleEntity ee var qb = new QueryBuilder(versionsMiddleEntityName, QueryConstants.MiddleEntityAlias); qb.AddFrom(referencedIdData.AuditEntityName, QueryConstants.ReferencedEntityAlias, false); qb.AddFrom(indexIdData.AuditEntityName, QueryConstants.IndexEntityAlias, false); qb.AddProjection("new list", QueryConstants.MiddleEntityAlias + ", " + QueryConstants.ReferencedEntityAlias + ", " + QueryConstants.IndexEntityAlias, null, false); // WHERE var rootParameters = qb.RootParameters; // ee.id_ref_ed = e.id_ref_ed referencedIdData.PrefixedMapper.AddIdsEqualToQuery(rootParameters, eeOriginalIdPropertyPath, referencedIdData.OriginalMapper, QueryConstants.ReferencedEntityAlias + "." + originalIdPropertyName); // ee.id_ref_ind = f.id_ref_ind indexIdData.PrefixedMapper.AddIdsEqualToQuery(rootParameters, eeOriginalIdPropertyPath, indexIdData.OriginalMapper, QueryConstants.IndexEntityAlias + "." + originalIdPropertyName); // ee.originalId.id_ref_ing = :id_ref_ing ReferencingIdData.PrefixedMapper.AddNamedIdEqualsToQuery(rootParameters, originalIdPropertyName, true); return(qb); }
public override IEnumerable <IRevisionEntityInfo <TEntity, TRevisionEntity> > Results() { var auditEntitiesConfiguration = AuditConfiguration.AuditEntCfg; /* * The query that should be executed in the versions table: * SELECT e FROM ent_ver e, rev_entity r WHERE * e.revision_type != DEL (if selectDeletedEntities == false) AND * e.revision = r.revision AND * (all specified conditions, transformed, on the "e" entity) * ORDER BY e.revision ASC (unless another order is specified) */ SetIncludeDeletationClause(); AddCriterions(); AddOrders(); QueryBuilder.AddFrom(auditEntitiesConfiguration.RevisionInfoEntityFullClassName(), QueryConstants.RevisionAlias, true); QueryBuilder.RootParameters.AddWhere(auditEntitiesConfiguration.RevisionNumberPath, true, "=", QueryConstants.RevisionAlias + ".id", false); var revisionTypePropertyName = auditEntitiesConfiguration.RevisionTypePropName; return(from resultRow in BuildAndExecuteQuery <object[]>() let versionsEntity = (IDictionary)resultRow[0] let revisionData = (TRevisionEntity)resultRow[1] let revision = GetRevisionNumberFromDynamicEntity(versionsEntity) let entity = (TEntity)EntityInstantiator.CreateInstanceFromVersionsEntity(EntityName, versionsEntity, revision) select new RevisionEntityInfo <TEntity, TRevisionEntity>(entity, revisionData, (RevisionType)versionsEntity[revisionTypePropertyName])); }
public void AddCriterionsToQuery(IAuditReaderImplementor versionsReader) { if (hasCriterions() || hasOrders() || hasProjections()) { if (_auditConfiguration.EntCfg.IsVersioned(_entityName)) { var verEntCfg = _auditConfiguration.AuditEntCfg; var auditEntityName = verEntCfg.GetAuditEntityName(_entityName); _queryBuilder.AddFrom(auditEntityName, _alias, false); // owner.reference_id = target.originalId.Id var originalIdPropertyName = verEntCfg.OriginalIdPropName; var idMapperTarget = _auditConfiguration.EntCfg[_entityName].IdMapper; var prefix = _alias + "." + originalIdPropertyName; _ownerAssociationIdMapper.AddIdsEqualToQuery(_queryBuilder.RootParameters, _ownerAlias, idMapperTarget, prefix); //filter reference of target entity var revisionPropertyPath = verEntCfg.RevisionNumberPath; var referencedIdData = new MiddleIdData( verEntCfg, _auditConfiguration.EntCfg[_entityName].IdMappingData, prefix: null, _entityName, _auditConfiguration.EntCfg.IsVersioned(_entityName)); _auditConfiguration.GlobalCfg.AuditStrategy.AddEntityAtRevisionRestriction(_queryBuilder, _parameters, revisionPropertyPath, verEntCfg.RevisionEndFieldName, true, referencedIdData, revisionPropertyPath, originalIdPropertyName, _alias, _queryBuilder.GenerateAlias()); } else { _queryBuilder.AddFrom(_entityName, _alias, false); //owner.reference_id = target.id var idMapperTarget = _auditConfiguration.EntCfg.GetNotVersionEntityConfiguration(_entityName).IdMapper; _ownerAssociationIdMapper.AddIdsEqualToQuery(_queryBuilder.RootParameters, _ownerAlias, idMapperTarget, _alias); } foreach (var criterion in _criterions) { criterion.AddToQuery(_auditConfiguration, versionsReader, _entityName, _queryBuilder, _parameters); } foreach (var sub in _associationQueries) { sub.AddCriterionsToQuery(versionsReader); } } }
public TwoEntityOneAuditedQueryGenerator( AuditEntitiesConfiguration verEntCfg, String versionsMiddleEntityName, MiddleIdData referencingIdData, MiddleIdData referencedIdData, IEnumerable <MiddleComponentData> componentDatas) { this.referencingIdData = referencingIdData; /* * The query that we need to create: * SELECT new list(ee, e) FROM referencedEntity e, middleEntity ee * WHERE * (entities referenced by the middle table; id_ref_ed = id of the referenced entity) * ee.id_ref_ed = e.id_ref_ed AND * (only entities referenced by the association; id_ref_ing = id of the referencing entity) * ee.id_ref_ing = :id_ref_ing AND * (the association at revision :revision) * ee.revision = (SELECT max(ee2.revision) FROM middleEntity ee2 * WHERE ee2.revision <= :revision AND ee2.originalId.* = ee.originalId.*) AND * (only non-deleted entities and associations) * ee.revision_type != DEL */ String revisionPropertyPath = verEntCfg.RevisionNumberPath; String originalIdPropertyName = verEntCfg.OriginalIdPropName; String eeOriginalIdPropertyPath = "ee." + originalIdPropertyName; // SELECT new list(ee) FROM middleEntity ee QueryBuilder qb = new QueryBuilder(versionsMiddleEntityName, "ee"); qb.AddFrom(referencedIdData.EntityName, "e"); qb.AddProjection("new list", "ee, e", false, false); // WHERE Parameters rootParameters = qb.RootParameters; // ee.id_ref_ed = e.id_ref_ed referencedIdData.PrefixedMapper.AddIdsEqualToQuery(rootParameters, eeOriginalIdPropertyPath, referencedIdData.OriginalMapper, "e"); // ee.originalId.id_ref_ing = :id_ref_ing referencingIdData.PrefixedMapper.AddNamedIdEqualsToQuery(rootParameters, originalIdPropertyName, true); // ee.revision = (SELECT max(...) ...) QueryGeneratorTools.AddAssociationAtRevision(qb, rootParameters, referencingIdData, versionsMiddleEntityName, eeOriginalIdPropertyPath, revisionPropertyPath, originalIdPropertyName, componentDatas); // ee.revision_type != DEL rootParameters.AddWhereWithNamedParam(verEntCfg.RevisionTypePropName, "!=", "delrevisiontype"); StringBuilder sb = new StringBuilder(); qb.Build(sb, EmptyDictionary <String, Object> .Instance); queryString = sb.ToString(); }
protected override void FillResult(IList result) { var verEntCfg = VerCfg.AuditEntCfg; /* * The query that should be executed in the versions table: * SELECT e (unless another projection is specified) FROM ent_ver e, rev_entity r WHERE * e.revision_type != DEL (if selectDeletedEntities == false) AND * e.revision = r.revision AND * (all specified conditions, transformed, on the "e" entity) * ORDER BY e.revision ASC (unless another order or projection is specified) */ if (!_selectDeletedEntities) { // e.revision_type != DEL AND QueryBuilder.RootParameters.AddWhereWithParam(verEntCfg.RevisionTypePropName, "<>", RevisionType.Deleted); } // all specified conditions, transformed foreach (var criterion in Criterions) { criterion.AddToQuery(VerCfg, VersionsReader, EntityName, QueryBuilder, QueryBuilder.RootParameters); } if (!HasProjection() && !HasOrder) { var revisionPropertyPath = verEntCfg.RevisionNumberPath; QueryBuilder.AddOrder(QueryConstants.ReferencedEntityAlias, revisionPropertyPath, true); } if (!_selectEntitiesOnly) { QueryBuilder.AddFrom(VerCfg.AuditEntCfg.RevisionInfoEntityFullClassName(), QueryConstants.RevisionAlias, true); QueryBuilder.RootParameters.AddWhere(VerCfg.AuditEntCfg.RevisionNumberPath, true, "=", QueryConstants.RevisionAlias + ".id", false); } if (HasProjection()) { BuildAndExecuteQuery(result); return; } var internalResult = new ArrayList(); BuildAndExecuteQuery(internalResult); var revisionTypePropertyName = verEntCfg.RevisionTypePropName; foreach (var resultRow in internalResult) { IDictionary versionsEntity; object revisionData = null; if (_selectEntitiesOnly) { versionsEntity = (IDictionary)resultRow; } else { var arrayResultRow = (Object[])resultRow; versionsEntity = (IDictionary)arrayResultRow[0]; revisionData = arrayResultRow[1]; } var revision = revisionNumber(versionsEntity); var entity = EntityInstantiator.CreateInstanceFromVersionsEntity(EntityName, versionsEntity, revision); result.Add(_selectEntitiesOnly ? entity : new[] { entity, revisionData, versionsEntity[revisionTypePropertyName] }); } }