コード例 #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();
        }
コード例 #2
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);
        }