protected override void FillResult(IList result)
        {
            /*
             * The query that we need to create:
             *   SELECT new list(e) FROM versionsReferencedEntity e
             *   WHERE
             * (all specified conditions, transformed, on the "e" entity) AND
             * e.revision = :revision
             */

            var verEntCfg            = VerCfg.AuditEntCfg;
            var revisionPropertyPath = verEntCfg.RevisionNumberPath;

            QueryBuilder.RootParameters.AddWhereWithParam(revisionPropertyPath, "=", _revision);

            foreach (var criterion in Criterions)
            {
                criterion.AddToQuery(VerCfg, VersionsReader, EntityName, QueryBuilder, QueryBuilder.RootParameters);
            }

            var query = BuildQuery();


            if (HasProjection)
            {
                query.List(result);
                return;
            }
            var queryResult = new List <IDictionary>();

            query.List(queryResult);
            EntityInstantiator.AddInstancesFromVersionsEntities(EntityName, result, queryResult, _revision);
        }
 protected void ApplyProjections(IQuery query, IList resultToFill, long revision)
 {
     if (HasProjection())
     {
         foreach (var qr in query.List())
         {
             if (projections.Count == 1)
             {
                 // qr is the value of the projection itself
                 var projection = projections[0];
                 resultToFill.Add(projection.Item2.ConvertQueryResult(VerCfg, EntityInstantiator, projection.Item1, revision, qr));
             }
             else
             {
                 // qr is an array where each of its components holds the value of corresponding projection
                 var qresults = (object[])qr;
                 var tresults = new object[qresults.Length];
                 for (var i = 0; i < qresults.Length; i++)
                 {
                     var projection = projections[i];
                     tresults[i] = projection.Item2.ConvertQueryResult(VerCfg, EntityInstantiator, projection.Item1, revision, qresults[i]);
                 }
                 resultToFill.Add(tresults);
             }
         }
     }
     else
     {
         var queryResult = new List <IDictionary>();
         query.List(queryResult);
         EntityInstantiator.AddInstancesFromVersionsEntities(EntityName, resultToFill, queryResult, revision);
     }
 }
Esempio n. 3
0
        protected override void FillResult(IList result)
        {
            /*
             * The query that we need to create:
             *   SELECT new list(e) FROM versionsReferencedEntity e
             *   WHERE
             * (all specified conditions, transformed, on the "e" entity) 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 ValidityAuditStrategy:
             *     e.revision <= :revision and (e.endRevision > :revision or e.endRevision is null)
             *
             *     AND
             * (only non-deleted entities)
             *     e.revision_type != DEL
             */
            var verEntCfg              = VerCfg.AuditEntCfg;
            var revisionPropertyPath   = verEntCfg.RevisionNumberPath;
            var originalIdPropertyName = verEntCfg.OriginalIdPropName;

            var referencedIdData = new MiddleIdData(verEntCfg, VerCfg.EntCfg[EntityName].IdMappingData,
                                                    null, EntityName, VerCfg.EntCfg.IsVersioned(EntityName));

            // (selecting e entities at revision :revision)
            // --> based on auditStrategy (see above)
            VerCfg.GlobalCfg.AuditStrategy.AddEntityAtRevisionRestriction(QueryBuilder, QueryBuilder.RootParameters, revisionPropertyPath,
                                                                          verEntCfg.RevisionEndFieldName, true, referencedIdData,
                                                                          revisionPropertyPath, originalIdPropertyName, QueryConstants.ReferencedEntityAlias, QueryConstants.ReferencedEntityAliasDefAudStr);

            // e.revision_type != DEL
            if (!_includeDeletions)
            {
                QueryBuilder.RootParameters.AddWhereWithParam(verEntCfg.RevisionTypePropName, "<>", RevisionType.Deleted);
            }

            // all specified conditions
            foreach (var criterion in Criterions)
            {
                criterion.AddToQuery(VerCfg, VersionsReader, EntityName, QueryBuilder, QueryBuilder.RootParameters);
            }


            var query = BuildQuery();

            // add named parameter (only used for ValidAuditTimeStrategy)
            if (query.NamedParameters.Contains(QueryConstants.RevisionParameter))
            {
                query.SetParameter(QueryConstants.RevisionParameter, _revision);
            }

            if (HasProjection)
            {
                query.List(result);
                return;
            }
            var queryResult = new List <IDictionary>();

            query.List(queryResult);
            EntityInstantiator.AddInstancesFromVersionsEntities(EntityName, result, queryResult, _revision);
        }