public TwoEntityOneAuditedQueryGenerator(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 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) * --> 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 */ 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.EntityName, "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"); // ee.originalId.id_ref_ing = :id_ref_ing referencingIdData.PrefixedMapper.AddNamedIdEqualsToQuery(rootParameters, originalIdPropertyName, true); // (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"); var sb = new StringBuilder(); qb.Build(sb, null); queryString = sb.ToString(); }
/// <summary> /// Create query restrictions used to retrieve actual data and deletions that took place at exactly given revision. /// </summary> private void createValidAndRemovedDataRestrictions(IAuditStrategy auditStrategy, MiddleIdData referencedIdData, string versionsMiddleEntityName, QueryBuilder remQb, IEnumerable <MiddleComponentData> componentData) { var disjoint = remQb.RootParameters.AddSubParameters("or"); var valid = disjoint.AddSubParameters("and"); // Restrictions to match all valid rows. var removed = disjoint.AddSubParameters("and"); // Restrictions to match all rows deleted at exactly given revision. var revisionPropertyPath = VerEntCfg.RevisionNumberPath; var revisionTypePropName = RevisionTypePath(); // Excluding current revision, because we need to match data valid at the previous one. createValidDataRestrictions(auditStrategy, referencedIdData, versionsMiddleEntityName, remQb, valid, false, componentData); // ee.revision = :revision removed.AddWhereWithNamedParam(revisionPropertyPath, "=", QueryConstants.RevisionParameter); // e.revision = :revision removed.AddWhereWithNamedParam(QueryConstants.ReferencedEntityAlias + "." + revisionPropertyPath, false, "=", QueryConstants.RevisionParameter); // f.revision = :revision removed.AddWhereWithNamedParam(QueryConstants.IndexEntityAlias + "." + revisionPropertyPath, false, "=", QueryConstants.RevisionParameter); // ee.revision_type = DEL removed.AddWhereWithNamedParam(revisionTypePropName, "=", QueryConstants.DelRevisionTypeParameter); // e.revision_type = DEL removed.AddWhereWithNamedParam(QueryConstants.ReferencedEntityAlias + "." + revisionTypePropName, false, "=", QueryConstants.DelRevisionTypeParameter); // f.revision_type = DEL removed.AddWhereWithNamedParam(QueryConstants.IndexEntityAlias + "." + revisionTypePropName, false, "=", QueryConstants.DelRevisionTypeParameter); }
public OneEntityQueryGenerator(AuditEntitiesConfiguration verEntCfg, IAuditStrategy auditStrategy, string versionsMiddleEntityName, MiddleIdData referencingIdData, bool revisionTypeInId, IEnumerable <MiddleComponentData> componentDatas) : base(verEntCfg, referencingIdData, revisionTypeInId) { /* * The query that we need to create: * SELECT new list(ee) FROM middleEntity ee WHERE * (only entities referenced by the association; id_ref_ing = id of the referencing entity) * ee.originalId.id_ref_ing = :id_ref_ing AND * (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 */ var commonPart = commonQueryPart(versionsMiddleEntityName); var validQuery = (QueryBuilder)commonPart.Clone(); var removedQuery = (QueryBuilder)commonPart.Clone(); createValidDataRestrictions(auditStrategy, versionsMiddleEntityName, validQuery, validQuery.RootParameters, true, componentDatas); createValidAndRemovedDataRestrictions(auditStrategy, versionsMiddleEntityName, removedQuery, componentDatas); _queryString = QueryToString(validQuery); _queryRemovedString = QueryToString(removedQuery); }
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); }
public QueryGeneratorBuilder(GlobalConfiguration globalCfg, AuditEntitiesConfiguration verEntCfg, IAuditStrategy auditStrategy, MiddleIdData referencingIdData, string auditMiddleEntityName) { _globalCfg = globalCfg; _verEntCfg = verEntCfg; _auditStrategy = auditStrategy; _referencingIdData = referencingIdData; _auditMiddleEntityName = auditMiddleEntityName; _idDatas = new List<MiddleIdData>(); }
public QueryGeneratorBuilder(AuditEntitiesConfiguration verEntCfg, IAuditStrategy auditStrategy, MiddleIdData referencingIdData, string auditMiddleEntityName, bool revisionTypeInId) { _verEntCfg = verEntCfg; _auditStrategy = auditStrategy; _referencingIdData = referencingIdData; _auditMiddleEntityName = auditMiddleEntityName; _revisionTypeInId = revisionTypeInId; _idDatas = new List <MiddleIdData>(); }
/// <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); }
private void createValidAndRemovedDataRestrictions(IAuditStrategy auditStrategy, String versionsMiddleEntityName, QueryBuilder remQb, IEnumerable <MiddleComponentData> componentData) { var disjoint = remQb.RootParameters.AddSubParameters("or"); var valid = disjoint.AddSubParameters("and"); // Restrictions to match all valid rows. var removed = disjoint.AddSubParameters("and"); // Restrictions to match all rows deleted at exactly given revision. createValidDataRestrictions(auditStrategy, versionsMiddleEntityName, remQb, valid, componentData); // ee.revision = :revision removed.AddWhereWithNamedParam(VerEntCfg.RevisionNumberPath, "=", QueryConstants.RevisionParameter); // ee.revision_type = DEL removed.AddWhereWithNamedParam(RevisionTypePath(), "=", QueryConstants.DelRevisionTypeParameter); }
/// <summary> /// Create query restrictions used to retrieve actual data and deletions that took place at exactly given revision. /// </summary> private void createValidAndRemovedDataRestrictions(IAuditStrategy auditStrategy, MiddleIdData referencedIdData, QueryBuilder remQb) { var disjoint = remQb.RootParameters.AddSubParameters("or"); var valid = disjoint.AddSubParameters("and"); // Restrictions to match all valid rows. var removed = disjoint.AddSubParameters("and"); // Restrictions to match all rows deleted at exactly given revision. // Excluding current revision, because we need to match data valid at the previous one. createValidDataRestrictions(auditStrategy, referencedIdData, remQb, valid); // e.revision = :revision removed.AddWhereWithNamedParam(VerEntCfg.RevisionNumberPath, false, "=", QueryConstants.RevisionParameter); // e.revision_type = DEL removed.AddWhereWithNamedParam(RevisionTypePath(), false, "=", QueryConstants.DelRevisionTypeParameter); }
public AuditMetadataGenerator(Cfg.Configuration cfg, GlobalConfiguration globalCfg, AuditEntitiesConfiguration verEntCfg, IAuditStrategy auditStrategy, XmlElement revisionInfoRelationMapping, AuditEntityNameRegister auditEntityNameRegister) { Cfg = cfg; GlobalCfg = globalCfg; VerEntCfg = verEntCfg; AuditStrategy = auditStrategy; this.revisionInfoRelationMapping = revisionInfoRelationMapping; BasicMetadataGenerator = new BasicMetadataGenerator(); componentMetadataGenerator = new ComponentMetadataGenerator(this); idMetadataGenerator = new IdMetadataGenerator(this); toOneRelationMetadataGenerator = new ToOneRelationMetadataGenerator(this); AuditEntityNameRegister = auditEntityNameRegister; EntitiesConfigurations = new Dictionary<string, EntityConfiguration>(); NotAuditedEntitiesConfigurations = new Dictionary<string, EntityConfiguration>(); entitiesJoins = new Dictionary<string, IDictionary<Join, XmlElement>>(); }