private void createValidDataRestrictions(IAuditStrategy auditStrategy, MiddleIdData referencedIdData, String versionsMiddleEntityName, QueryBuilder qb, Parameters rootParameters, bool inclusive, IEnumerable <MiddleComponentData> componentData) { var revisionPropertyPath = VerEntCfg.RevisionNumberPath; var originalIdPropertyName = VerEntCfg.OriginalIdPropName; var eeOriginalIdPropertyPath = QueryConstants.MiddleEntityAlias + "." + originalIdPropertyName; var revisionTypePropName = RevisionTypePath(); // (selecting e entities at revision :revision) // --> based on auditStrategy (see above) auditStrategy.AddEntityAtRevisionRestriction(qb, rootParameters, QueryConstants.ReferencedEntityAlias + "." + revisionPropertyPath, QueryConstants.ReferencedEntityAlias + "." + VerEntCfg.RevisionEndFieldName, false, referencedIdData, revisionPropertyPath, originalIdPropertyName, QueryConstants.ReferencedEntityAlias, QueryConstants.ReferencedEntityAliasDefAudStr); // (with ee association at revision :revision) // --> based on auditStrategy (see above) auditStrategy.AddAssociationAtRevisionRestriction(qb, rootParameters, revisionPropertyPath, VerEntCfg.RevisionEndFieldName, true, ReferencingIdData, versionsMiddleEntityName, eeOriginalIdPropertyPath, revisionPropertyPath, originalIdPropertyName, QueryConstants.MiddleEntityAlias, inclusive, componentData.ToArray()); // ee.revision_type != DEL rootParameters.AddWhereWithNamedParam(revisionTypePropName, "!=", QueryConstants.DelRevisionTypeParameter); // e.revision_type != DEL rootParameters.AddWhereWithNamedParam(QueryConstants.ReferencedEntityAlias + "." + revisionTypePropName, false, "!=", QueryConstants.DelRevisionTypeParameter); }
/// <summary> /// Creates query restrictions used to retrieve only actual data. /// </summary> private void createValidDataRestrictions(IAuditStrategy auditStrategy, MiddleIdData referencedIdData, QueryBuilder qb, Parameters rootParameters) { var revisionPropertyPath = VerEntCfg.RevisionNumberPath; // (selecting e entities at revision :revision) // --> based on auditStrategy (see above) auditStrategy.AddEntityAtRevisionRestriction(qb, rootParameters, revisionPropertyPath, VerEntCfg.RevisionEndFieldName, true, referencedIdData, revisionPropertyPath, VerEntCfg.OriginalIdPropName, QueryConstants.ReferencedEntityAlias, QueryConstants.ReferencedEntityAliasDefAudStr); // e.revision_type != DEL rootParameters.AddWhereWithNamedParam(RevisionTypePath(), false, "!=", QueryConstants.DelRevisionTypeParameter); }
public TwoEntityQueryGenerator(GlobalConfiguration globalCfg, AuditEntitiesConfiguration verEntCfg, IAuditStrategy auditStrategy, 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 versionsReferencedEntity 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 * * (selecting e entities at revision :revision) * --> for DefaultAuditStrategy: * e.revision = (SELECT max(e2.revision) FROM versionsReferencedEntity e2 * WHERE e2.revision <= :revision AND e2.id = e.id) * --> for ValidTimeAuditStrategy: * e.revision <= :revision and (e.endRevision > :revision or e.endRevision is null) * * (the association at revision :revision) * --> for DefaultAuditStrategy: * ee.revision = (SELECT max(ee2.revision) FROM middleEntity ee2 * WHERE ee2.revision <= :revision AND ee2.originalId.* = ee.originalId.*) * --> for ValidityAuditStrategy: * ee.revision <= :revision and (ee.endRevision > :revision or ee.endRevision is null) * * AND * * (only non-deleted entities and associations) * ee.revision_type != DEL AND * e.revision_type != DEL */ var revisionPropertyPath = verEntCfg.RevisionNumberPath; var originalIdPropertyName = verEntCfg.OriginalIdPropName; var eeOriginalIdPropertyPath = "ee." + originalIdPropertyName; // SELECT new list(ee) FROM middleEntity ee var qb = new QueryBuilder(versionsMiddleEntityName, "ee"); qb.AddFrom(referencedIdData.AuditEntityName, "e"); qb.AddProjection("new list", "ee, e", false, false); // WHERE var rootParameters = qb.RootParameters; // ee.id_ref_ed = e.id_ref_ed referencedIdData.PrefixedMapper.AddIdsEqualToQuery(rootParameters, eeOriginalIdPropertyPath, referencedIdData.OriginalMapper, "e." + originalIdPropertyName); // ee.originalId.id_ref_ing = :id_ref_ing referencingIdData.PrefixedMapper.AddNamedIdEqualsToQuery(rootParameters, originalIdPropertyName, true); // (selecting e entities at revision :revision) // --> based on auditStrategy (see above) auditStrategy.AddEntityAtRevisionRestriction(globalCfg, qb, "e." + revisionPropertyPath, "e." + verEntCfg.RevisionEndFieldName, false, referencedIdData, revisionPropertyPath, originalIdPropertyName, "e", "e2"); // (with ee association at revision :revision) // --> based on auditStrategy (see above) auditStrategy.AddAssociationAtRevisionRestriction(qb, revisionPropertyPath, verEntCfg.RevisionEndFieldName, true, referencingIdData, versionsMiddleEntityName, eeOriginalIdPropertyPath, revisionPropertyPath, originalIdPropertyName, componentDatas.ToArray()); // ee.revision_type != DEL rootParameters.AddWhereWithNamedParam(verEntCfg.RevisionTypePropName, "!=", "delrevisiontype"); // e.revision_type != DEL rootParameters.AddWhereWithNamedParam("e." + verEntCfg.RevisionTypePropName, false, "!=", "delrevisiontype"); var sb = new StringBuilder(); qb.Build(sb, null); queryString = sb.ToString(); }