/// <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);
        }
示例#2
0
        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();
        }
示例#5
0
        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] });
            }
        }