public void AddAssociationAtRevisionRestriction(QueryBuilder rootQueryBuilder, string revisionProperty, string revisionEndProperty, bool addAlias, MiddleIdData referencingIdData, string versionsMiddleEntityName, string eeOriginalIdPropertyPath, string revisionPropertyPath, string originalIdPropertyName, params MiddleComponentData[] componentDatas) { var rootParameters = rootQueryBuilder.RootParameters; // SELECT max(ee2.revision) FROM middleEntity ee2 var maxEeRevQb = rootQueryBuilder.NewSubQueryBuilder(versionsMiddleEntityName, "ee2"); maxEeRevQb.AddProjection("max", revisionPropertyPath, false); // WHERE var maxEeRevQbParameters = maxEeRevQb.RootParameters; // ee2.revision <= :revision maxEeRevQbParameters.AddWhereWithNamedParam(revisionPropertyPath, "<=", "revision"); // ee2.originalId.* = ee.originalId.* var ee2OriginalIdPropertyPath = "ee2." + originalIdPropertyName; referencingIdData.PrefixedMapper.AddIdsEqualToQuery(maxEeRevQbParameters, eeOriginalIdPropertyPath, ee2OriginalIdPropertyPath); foreach (var componentData in componentDatas) { componentData.ComponentMapper.AddMiddleEqualToQuery(maxEeRevQbParameters, eeOriginalIdPropertyPath, ee2OriginalIdPropertyPath); } // add subquery to rootParameters rootParameters.AddWhere(revisionProperty, addAlias, "=", maxEeRevQb); }
public CommonCollectionMapperData(AuditEntitiesConfiguration verEntCfg, String versionsMiddleEntityName, PropertyData collectionReferencingPropertyData, MiddleIdData referencingIdData, IRelationQueryGenerator queryGenerator) { this._verEntCfg = verEntCfg; this._versionsMiddleEntityName = versionsMiddleEntityName; this._collectionReferencingPropertyData = collectionReferencingPropertyData; this._referencingIdData = referencingIdData; this._queryGenerator = queryGenerator; }
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.AuditStrategy.AddEntityAtRevisionRestriction(VerCfg.GlobalCfg, QueryBuilder, revisionPropertyPath, verEntCfg.RevisionEndFieldName, true, referencedIdData, revisionPropertyPath, originalIdPropertyName, "e", "e2"); // e.revision_type != DEL QueryBuilder.RootParameters.AddWhereWithParam(verEntCfg.RevisionTypePropName, "<>", RevisionType.Deleted); // all specified conditions foreach (var criterion in Criterions) { criterion.AddToQuery(VerCfg, EntityName, QueryBuilder, QueryBuilder.RootParameters); } var query = BuildQuery(); // add named parameter (only used for ValidAuditTimeStrategy) if (query.NamedParameters.Contains("revision")) { query.SetParameter("revision", _revision); } if (HasProjection) { query.List(result); return; } var queryResult = new List<IDictionary>(); query.List(queryResult); EntityInstantiator.AddInstancesFromVersionsEntities(EntityName, result, queryResult, _revision); }
public CommonCollectionMapperData(AuditEntitiesConfiguration verEntCfg, string versionsMiddleEntityName, PropertyData collectionReferencingPropertyData, MiddleIdData referencingIdData, IRelationQueryGenerator queryGenerator) { VerEntCfg = verEntCfg; VersionsMiddleEntityName = versionsMiddleEntityName; CollectionReferencingPropertyData = collectionReferencingPropertyData; ReferencingIdData = referencingIdData; QueryGenerator = queryGenerator; }
public QueryGeneratorBuilder(GlobalConfiguration globalCfg, AuditEntitiesConfiguration verEntCfg, MiddleIdData referencingIdData, String auditMiddleEntityName) { this._globalCfg = globalCfg; this._verEntCfg = verEntCfg; this._referencingIdData = referencingIdData; this._auditMiddleEntityName = auditMiddleEntityName; _idDatas = new List<MiddleIdData>(); }
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 void AddEntityAtRevisionRestriction(GlobalConfiguration globalCfg, QueryBuilder rootQueryBuilder, string revisionProperty, string revisionEndProperty, bool addAlias, MiddleIdData idData, string revisionPropertyPath, string originalIdPropertyName, string alias1, string alias2) { var rootParameters = rootQueryBuilder.RootParameters; // create a subquery builder // SELECT max(e.revision) FROM versionsReferencedEntity e2 var maxERevQb = rootQueryBuilder.NewSubQueryBuilder(idData.AuditEntityName, alias2); maxERevQb.AddProjection("max", revisionPropertyPath, false); // WHERE var maxERevQbParameters = maxERevQb.RootParameters; // e2.revision <= :revision maxERevQbParameters.AddWhereWithNamedParam(revisionPropertyPath, "<=", "revision"); // e2.id_ref_ed = e.id_ref_ed idData.OriginalMapper.AddIdsEqualToQuery(maxERevQbParameters, alias1 + "." + originalIdPropertyName, alias2 + "." + originalIdPropertyName); // add subquery to rootParameters var subqueryOperator = globalCfg.CorrelatedSubqueryOperator; rootParameters.AddWhere(revisionProperty, addAlias, subqueryOperator, maxERevQb); }
public void AddRelation(MiddleIdData idData) { _idDatas.Add(idData); }