コード例 #1
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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>();
        }
コード例 #6
0
        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);
        }
コード例 #8
0
        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);
        }
コード例 #10
0
        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>>();
        }