Skip to content

Commit

Permalink
Merge branch 'master' into 5.26.0-branch
Browse files Browse the repository at this point in the history
  • Loading branch information
gunterze committed Mar 21, 2022
2 parents 54164dd + 2d1d422 commit 89258b4
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -400,21 +400,23 @@ public <T> List<Predicate> patientPredicates(CriteriaQuery<T> q,
}

public <T> List<Predicate> studyPredicates(CriteriaQuery<T> q,
From<Study, Patient> patient, Root<Study> study,
IDWithIssuer[] pids, Issuer issuer, Attributes keys, QueryParam queryParam) {
From<Study, Patient> patient, Root<Study> study,
IDWithIssuer[] pids, Issuer issuer, Attributes keys, QueryParam queryParam,
CodeEntity[] showInstancesRejectedByCodes) {
List<Predicate> predicates = new ArrayList<>();
patientLevelPredicates(predicates, q, patient, pids, issuer, keys, queryParam, QueryRetrieveLevel2.STUDY);
studyLevelPredicates(predicates, q, study, keys, queryParam, QueryRetrieveLevel2.STUDY);
studyLevelPredicates(predicates, q, study, keys, queryParam, QueryRetrieveLevel2.STUDY, showInstancesRejectedByCodes);
return predicates;
}

public <T> List<Predicate> seriesPredicates(CriteriaQuery<T> q,
From<Study, Patient> patient, From<Series, Study> study, Root<Series> series,
IDWithIssuer[] pids, Issuer issuer, Attributes keys, QueryParam queryParam) {
IDWithIssuer[] pids, Issuer issuer, Attributes keys, QueryParam queryParam,
CodeEntity[] showInstancesRejectedByCodes) {
List<Predicate> predicates = new ArrayList<>();
patientLevelPredicates(predicates, q, patient, pids, issuer, keys, queryParam, QueryRetrieveLevel2.SERIES);
studyLevelPredicates(predicates, q, study, keys, queryParam, QueryRetrieveLevel2.SERIES);
seriesLevelPredicates(predicates, q, series, keys, queryParam);
studyLevelPredicates(predicates, q, study, keys, queryParam, QueryRetrieveLevel2.SERIES, showInstancesRejectedByCodes);
seriesLevelPredicates(predicates, q, study, series, keys, queryParam, QueryRetrieveLevel2.SERIES, showInstancesRejectedByCodes);
return predicates;
}

Expand All @@ -424,8 +426,8 @@ public <T> List<Predicate> instancePredicates(CriteriaQuery<T> q,
CodeEntity[] showInstancesRejectedByCodes, CodeEntity[] hideRejectionNoteWithCodes) {
List<Predicate> predicates = new ArrayList<>();
patientLevelPredicates(predicates, q, patient, pids, issuer, keys, queryParam, QueryRetrieveLevel2.IMAGE);
studyLevelPredicates(predicates, q, study, keys, queryParam, QueryRetrieveLevel2.IMAGE);
seriesLevelPredicates(predicates, q, series, keys, queryParam);
studyLevelPredicates(predicates, q, study, keys, queryParam, QueryRetrieveLevel2.IMAGE, showInstancesRejectedByCodes);
seriesLevelPredicates(predicates, q, study, series, keys, queryParam, QueryRetrieveLevel2.SERIES, showInstancesRejectedByCodes);
instanceLevelPredicates(predicates, q, study, series, instance, keys, queryParam,
showInstancesRejectedByCodes, hideRejectionNoteWithCodes);
return predicates;
Expand Down Expand Up @@ -645,7 +647,8 @@ public Predicate[] splitUIDPredicates(Path<String> path, String[] values, int in
}

private <T, Z> List<Predicate> studyLevelPredicates(List<Predicate> predicates, CriteriaQuery<T> q,
From<Z, Study> study, Attributes keys, QueryParam queryParam, QueryRetrieveLevel2 queryRetrieveLevel) {
From<Z, Study> study, Attributes keys, QueryParam queryParam, QueryRetrieveLevel2 queryRetrieveLevel,
CodeEntity[] showInstancesRejectedByCodes) {
boolean combinedDatetimeMatching = queryParam.isCombinedDatetimeMatching();
accessControl(predicates, study, queryParam.getAccessControlIDs());
anyOf(predicates, study.get(Study_.studyInstanceUID), keys.getStrings(Tag.StudyInstanceUID), false);
Expand Down Expand Up @@ -679,8 +682,6 @@ private <T, Z> List<Predicate> studyLevelPredicates(List<Predicate> predicates,
seriesAttributesInStudy(predicates, q, study, keys, queryParam, queryRetrieveLevel, modalitiesInStudy);
}
codes(predicates, q, study, Study_.procedureCodes, keys.getNestedDataset(Tag.ProcedureCodeSequence));
if (queryParam.isHideNotRejectedInstances())
predicates.add(cb.notEqual(study.get(Study_.rejectionState), RejectionState.NONE));
AttributeFilter attrFilter = queryParam.getAttributeFilter(Entity.Study);
wildCard(predicates, study.get(Study_.studyCustomAttribute1),
AttributeFilter.selectStringValue(keys, attrFilter.getCustomAttribute1(), "*"), true);
Expand All @@ -697,6 +698,15 @@ private <T, Z> List<Predicate> studyLevelPredicates(List<Predicate> predicates,
if (queryParam.getExternalRetrieveAETNot() != null)
predicates.add(cb.notEqual(study.get(Study_.externalRetrieveAET), queryParam.getExternalRetrieveAETNot()));
if (queryRetrieveLevel == QueryRetrieveLevel2.STUDY) {
if (queryParam.isHideNotRejectedInstances()) {
Subquery<RejectedInstance> sq = q.subquery(RejectedInstance.class);
Root<RejectedInstance> ri = sq.from(RejectedInstance.class);
Predicate y = cb.equal(ri.get(RejectedInstance_.studyInstanceUID), study.get(Study_.studyInstanceUID));
if (showInstancesRejectedByCodes.length > 0) {
y = cb.and(y, ri.get(RejectedInstance_.rejectionNoteCode).in(showInstancesRejectedByCodes));
}
predicates.add(cb.exists(sq.select(ri).where(y)));
}
if (queryParam.isIncomplete())
predicates.add(cb.notEqual(study.get(Study_.completeness), Completeness.COMPLETE));
if (queryParam.isRetrieveFailed())
Expand Down Expand Up @@ -739,7 +749,8 @@ public static void accessControl(List<Predicate> predicates, Path<Study> study,
}

private <T, Z> List<Predicate> seriesLevelPredicates(List<Predicate> predicates, CriteriaQuery<T> q,
From<Z, Series> series, Attributes keys, QueryParam queryParam) {
From<Series, Study> study, From<Z, Series> series, Attributes keys, QueryParam queryParam,
QueryRetrieveLevel2 queryRetrieveLevel2, CodeEntity[] showInstancesRejectedByCodes) {
anyOf(predicates, series.get(Series_.seriesInstanceUID), keys.getStrings(Tag.SeriesInstanceUID), false);
numberPredicate(predicates, series.get(Series_.seriesNumber), keys.getString(Tag.SeriesNumber, "*"));
anyOf(predicates, series.get(Series_.modality),
Expand Down Expand Up @@ -770,8 +781,16 @@ private <T, Z> List<Predicate> seriesLevelPredicates(List<Predicate> predicates,
code(predicates,
series.get(Series_.institutionalDepartmentTypeCode),
keys.getNestedDataset(Tag.InstitutionalDepartmentTypeCodeSequence));
if (queryParam.isHideNotRejectedInstances())
predicates.add(cb.notEqual(series.get(Series_.rejectionState), RejectionState.NONE));
if (queryRetrieveLevel2 == QueryRetrieveLevel2.SERIES && queryParam.isHideNotRejectedInstances()) {
Subquery<RejectedInstance> sq = q.subquery(RejectedInstance.class);
Root<RejectedInstance> ri = sq.from(RejectedInstance.class);
Predicate y = cb.and(cb.equal(ri.get(RejectedInstance_.studyInstanceUID), study.get(Study_.studyInstanceUID)),
cb.equal(ri.get(RejectedInstance_.seriesInstanceUID), series.get(Series_.seriesInstanceUID)));
if (showInstancesRejectedByCodes.length > 0) {
y = cb.and(y, ri.get(RejectedInstance_.rejectionNoteCode).in(showInstancesRejectedByCodes));
}
predicates.add(cb.exists(sq.select(ri).where(y)));
}
AttributeFilter attrFilter = queryParam.getAttributeFilter(Entity.Series);
wildCard(predicates, series.get(Series_.seriesCustomAttribute1),
AttributeFilter.selectStringValue(keys, attrFilter.getCustomAttribute1(), "*"), true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,9 @@ private CriteriaQuery<Tuple> restrict(CriteriaQuery<Tuple> q, Join<Study, Patien
context.getPatientIDs(),
context.getIssuerOfPatientID(),
context.getQueryKeys(),
context.getQueryParam()
context.getQueryParam(),
codeCache.findOrCreateEntities(
context.getQueryParam().getQueryRetrieveView().getShowInstancesRejectedByCodes())
);
predicates.add(cb.equal(series.get(Series_.instancePurgeState), Series.InstancePurgeState.PURGED));
return q.where(predicates.toArray(new Predicate[0]));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -285,12 +285,12 @@ public Query createPatientQuery(QueryContext ctx) {

@Override
public Query createStudyQuery(QueryContext ctx) {
return new StudyQuery(ctx, em);
return new StudyQuery(ctx, em, codeCache);
}

@Override
public Query createSeriesQuery(QueryContext ctx) {
return new SeriesQuery(ctx, em);
return new SeriesQuery(ctx, em, codeCache);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import org.dcm4che3.data.VR;
import org.dcm4che3.dict.archive.PrivateTag;
import org.dcm4che3.util.StringUtils;
import org.dcm4chee.arc.code.CodeCache;
import org.dcm4chee.arc.conf.Availability;
import org.dcm4chee.arc.entity.*;
import org.dcm4chee.arc.query.QueryContext;
Expand All @@ -63,6 +64,7 @@
*/
class SeriesQuery extends AbstractQuery {

private final CodeCache codeCache;
private Root<Series> series;
private Join<Series, Study> study;
private Join<Study, Patient> patient;
Expand All @@ -75,8 +77,9 @@ class SeriesQuery extends AbstractQuery {
private Long studyPk;
private Attributes studyAttrs;

SeriesQuery(QueryContext context, EntityManager em) {
SeriesQuery(QueryContext context, EntityManager em, CodeCache codeCache) {
super(context, em);
this.codeCache = codeCache;
}

@Override
Expand Down Expand Up @@ -220,7 +223,9 @@ private <T> CriteriaQuery<T> restrict(CriteriaQuery<T> q, Join<Study, Patient> p
context.getPatientIDs(),
context.getIssuerOfPatientID(),
context.getQueryKeys(),
context.getQueryParam());
context.getQueryParam(),
codeCache.findOrCreateEntities(
context.getQueryParam().getQueryRetrieveView().getShowInstancesRejectedByCodes()));
if (!predicates.isEmpty())
q.where(predicates.toArray(new Predicate[0]));
return q;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import org.dcm4che3.data.VR;
import org.dcm4che3.dict.archive.PrivateTag;
import org.dcm4che3.util.StringUtils;
import org.dcm4chee.arc.code.CodeCache;
import org.dcm4chee.arc.conf.Availability;
import org.dcm4chee.arc.entity.*;
import org.dcm4chee.arc.query.QueryContext;
Expand All @@ -65,14 +66,16 @@
*/
class StudyQuery extends AbstractQuery {

private final CodeCache codeCache;
private Join<Study, Patient> patient;
private Root<Study> study;
private CollectionJoin<Study, StudyQueryAttributes> studyQueryAttributes;
private Path<byte[]> patientAttrBlob;
private Path<byte[]> studyAttrBlob;

StudyQuery(QueryContext context, EntityManager em) {
StudyQuery(QueryContext context, EntityManager em, CodeCache codeCache) {
super(context, em);
this.codeCache = codeCache;
}

@Override
Expand Down Expand Up @@ -200,7 +203,9 @@ private <T> CriteriaQuery<T> restrict(CriteriaQuery<T> q, Join<Study, Patient> p
context.getPatientIDs(),
context.getIssuerOfPatientID(),
context.getQueryKeys(),
context.getQueryParam());
context.getQueryParam(),
codeCache.findOrCreateEntities(
context.getQueryParam().getQueryRetrieveView().getShowInstancesRejectedByCodes()));
for (Predicate predicate : extra)
predicates.add(predicate);
if (!predicates.isEmpty())
Expand Down

0 comments on commit 89258b4

Please sign in to comment.