From a2f733e6365d24cf822639f5f76dc5da2abcec3f Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Wed, 23 Oct 2024 15:59:57 -0400 Subject: [PATCH 01/14] Lab and Morbidity report query --- .../search/ElasticsearchPatientSearcher.java | 15 +- .../PatientDemographicQueryResolver.java | 361 ++++++++++++++++++ .../search/PatientEventQueryResolver.java | 33 ++ .../cdc/nbs/patient/search/PatientFilter.java | 28 ++ .../PatientSearchCriteriaQueryResolver.java | 361 +----------------- .../resources/graphql/patient-search.graphqls | 8 + .../search/PatientSearchEventIdSteps.java | 37 ++ .../search/PatientSearch.eventId.feature | 25 ++ 8 files changed, 508 insertions(+), 360 deletions(-) create mode 100644 apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientDemographicQueryResolver.java create mode 100644 apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java create mode 100644 apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java create mode 100644 apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/ElasticsearchPatientSearcher.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/ElasticsearchPatientSearcher.java index 22e63248b1..6aab183c12 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/ElasticsearchPatientSearcher.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/ElasticsearchPatientSearcher.java @@ -31,8 +31,7 @@ class ElasticsearchPatientSearcher implements SearchResolver search( final PatientFilter criteria, - final Pageable pageable - ) { + final Pageable pageable) { Query filter = filterResolver.resolve(criteria); Query query = queryResolver.resolve(criteria); @@ -60,8 +58,7 @@ public SearchResult search( .sort(sorting) .from((int) pageable.getOffset()) .size(pageable.getPageSize()), - SearchablePatient.class - ); + SearchablePatient.class); HitsMetadata hits = response.hits(); @@ -78,8 +75,7 @@ public SearchResult search( private SearchResult paged( final HitsMetadata hits, - final Pageable pageable - ) { + final Pageable pageable) { List ids = hits.hits() .stream() .map(hit -> Long.parseLong(hit.id())) @@ -93,7 +89,6 @@ private SearchResult paged( return resultResolver.resolve( results, pageable, - hits.total().value() - ); + hits.total().value()); } } diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientDemographicQueryResolver.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientDemographicQueryResolver.java new file mode 100644 index 0000000000..137bffc671 --- /dev/null +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientDemographicQueryResolver.java @@ -0,0 +1,361 @@ +package gov.cdc.nbs.patient.search; + +import java.time.LocalDate; +import java.util.Optional; +import java.util.stream.Stream; +import org.apache.commons.codec.language.Soundex; +import org.springframework.stereotype.Component; +import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery; +import co.elastic.clients.elasticsearch._types.query_dsl.ChildScoreMode; +import co.elastic.clients.elasticsearch._types.query_dsl.MatchQuery; +import co.elastic.clients.elasticsearch._types.query_dsl.NestedQuery; +import co.elastic.clients.elasticsearch._types.query_dsl.Operator; +import co.elastic.clients.elasticsearch._types.query_dsl.PrefixQuery; +import co.elastic.clients.elasticsearch._types.query_dsl.Query; +import co.elastic.clients.elasticsearch._types.query_dsl.QueryVariant; +import co.elastic.clients.elasticsearch._types.query_dsl.RangeQuery; +import co.elastic.clients.elasticsearch._types.query_dsl.TermQuery; +import co.elastic.clients.json.JsonData; +import gov.cdc.nbs.patient.identifier.PatientLocalIdentifierResolver; +import gov.cdc.nbs.search.AdjustStrings; +import gov.cdc.nbs.search.WildCards; +import gov.cdc.nbs.time.FlexibleInstantConverter; + +@Component +class PatientDemographicQueryResolver { + private static final String NAMES = "name"; + private static final String PHONES = "phone"; + private static final String EMAILS = "email"; + private static final String IDENTIFICATIONS = "entity_id"; + private static final String BIRTHDAY = "birth_time"; + private static final String ADDRESSES = "address"; + private final PatientSearchSettings settings; + private final PatientLocalIdentifierResolver resolver; + private final Soundex soundex; + + PatientDemographicQueryResolver( + final PatientSearchSettings settings, + final PatientLocalIdentifierResolver resolver) { + this.settings = settings; + this.resolver = resolver; + this.soundex = new Soundex(); + } + + Stream resolve(final PatientFilter criteria) { + return Stream.of( + applyPatientIdentifierCriteria(criteria), + applyFirstNameCriteria(criteria), + applyLastNameCriteria(criteria), + applyPhoneNumberCriteria(criteria), + applyEmailCriteria(criteria), + applyIdentificationCriteria(criteria), + applyDateOfBirthCriteria(criteria), + applyStreetAddressCriteria(criteria), + applyCityCriteria(criteria), + applyZipcodeCriteria(criteria)).flatMap(Optional::stream) + .map(QueryVariant::_toQuery); + } + + private Optional applyPatientIdentifierCriteria(final PatientFilter criteria) { + if (criteria.getId() != null) { + String shortOrLongIdStripped = criteria.getId().strip(); + + if (shortOrLongIdStripped.isEmpty()) { + return Optional.empty(); + } + + if (Character.isDigit(shortOrLongIdStripped.charAt(0))) { + // This may be a short id, resolve the local id and then search for it + try { + long shortId = Long.parseLong(shortOrLongIdStripped); + + String localId = resolver.resolve(shortId); + + return applyLocalId(localId); + + } catch (NumberFormatException exception) { + // skip these criteria. it's not a short id or long id + } + } else { + return applyLocalId(shortOrLongIdStripped); + } + } + + return Optional.empty(); + } + + private Optional applyLocalId(final String local) { + return Optional.of( + TermQuery.of( + query -> query.field("local_id") + .value(local))); + } + + private Optional applyFirstNameCriteria(final PatientFilter criteria) { + String name = criteria.getFirstName(); + + if (name != null && !name.isBlank()) { + + String encoded; + if (criteria.isDisableSoundex()) { + encoded = ""; + } else { + encoded = soundex.encode(name.trim()); + } + + return Optional.of( + BoolQuery.of( + bool -> bool.should( + should -> should.nested( + nested -> nested.path(NAMES) + .scoreMode(ChildScoreMode.Max) + .query( + query -> query.bool( + legal -> legal.filter( + filter -> filter.term( + term -> term.field("name.nm_use_cd.keyword") + .value("L"))) + .must( + primary -> primary.match( + match -> match + .field("name.firstNm") + .query(name) + .boost(settings.first().primary()) + + )))))).should( + should -> should.nested( + nested -> nested.path(NAMES) + .scoreMode(ChildScoreMode.Avg) + .query( + nonPrimary -> nonPrimary.simpleQueryString( + queryString -> queryString + .fields("name.firstNm") + .query(WildCards.startsWith(name)) + .boost(settings.first().nonPrimary()))))) + .should( + should -> should.nested( + nested -> nested.path(NAMES) + .scoreMode(ChildScoreMode.Avg) + .boost(settings.first().soundex()) + .query( + query -> query.term( + term -> term + .field("name.firstNmSndx.keyword") + .value(encoded))))))); + } + return Optional.empty(); + } + + private Optional applyLastNameCriteria(final PatientFilter criteria) { + String name = AdjustStrings.withoutHyphens(criteria.getLastName()); + + if (name != null && !name.isBlank()) { + String encoded; + if (criteria.isDisableSoundex()) { + encoded = ""; + } else { + encoded = soundex.encode(name.trim()); + } + + return Optional.of( + BoolQuery.of( + bool -> bool.should( + should -> should.nested( + nested -> nested.path(NAMES) + .scoreMode(ChildScoreMode.Max) + .query( + query -> query.bool( + legal -> legal.filter( + filter -> filter.term( + term -> term.field("name.nm_use_cd.keyword") + .value("L"))) + .must( + primary -> primary.match( + match -> match + .field("name.lastNm") + .query(name) + .boost(settings.first().primary()))))))) + .should( + should -> should.nested( + nested -> nested.path(NAMES) + .scoreMode(ChildScoreMode.Avg) + .query( + query -> query.simpleQueryString( + nonPrimary -> nonPrimary + .fields("name.lastNm") + .query(WildCards.startsWith(name)) + .boost(settings.first().nonPrimary()))))) + .should( + should -> should.nested( + nested -> nested.path(NAMES) + .scoreMode(ChildScoreMode.Avg) + .boost(settings.first().soundex()) + .query( + query -> query.term( + term -> term + .field("name.lastNmSndx.keyword") + .value(encoded))))))); + } + return Optional.empty(); + } + + private Optional applyPhoneNumberCriteria(final PatientFilter criteria) { + + String number = AdjustStrings.withoutSpecialCharacters(criteria.getPhoneNumber()); + + if (number != null && !number.isEmpty()) { + + return Optional.of( + NestedQuery.of( + nested -> nested.path(PHONES) + .scoreMode(ChildScoreMode.Avg) + .query( + query -> query.wildcard( + wildcard -> wildcard.field("phone.telephoneNbr") + .value(WildCards.contains(number)))))); + + } + + return Optional.empty(); + } + + private Optional applyEmailCriteria(final PatientFilter criteria) { + + String email = criteria.getEmail(); + if (email != null && !email.isEmpty()) { + + return Optional.of( + NestedQuery.of( + nested -> nested.path(EMAILS) + .scoreMode(ChildScoreMode.Avg) + .query( + query -> query.simpleQueryString( + queryString -> queryString.fields("email.emailAddress") + .defaultOperator(Operator.And) + .query(email))))); + } + + return Optional.empty(); + } + + private Optional applyIdentificationCriteria(final PatientFilter criteria) { + + PatientFilter.Identification identification = criteria.getIdentification(); + + String type = identification.getIdentificationType(); + String value = AdjustStrings.withoutSpecialCharacters(identification.getIdentificationNumber()); + + if (type != null && (value != null && !value.isEmpty())) { + return Optional.of( + NestedQuery.of( + nested -> nested.path(IDENTIFICATIONS) + .scoreMode(ChildScoreMode.Avg) + .query( + query -> query.bool( + bool -> bool.filter( + filter -> filter.term( + term -> term.field("entity_id.typeCd.keyword") + .value(type))) + .must( + must -> must.prefix( + prefix -> prefix.field("entity_id.rootExtensionTxt").caseInsensitive(true) + .value(value))))))); + } + return Optional.empty(); + } + + private Optional applyDateOfBirthCriteria(final PatientFilter criteria) { + + LocalDate dateOfBirth = criteria.getDateOfBirth(); + + if (dateOfBirth != null) { + String operator = resolveDateOperator(criteria.getDateOfBirthOperator()); + String value = FlexibleInstantConverter.toString(dateOfBirth); + + return switch (operator) { + case "before" -> Optional.of( + RangeQuery.of( + range -> range.field(BIRTHDAY) + .lt(JsonData.of(value)))); + case "after" -> Optional.of( + RangeQuery.of( + range -> range.field(BIRTHDAY) + .gt(JsonData.of(value)))); + default -> Optional.of( + MatchQuery.of( + match -> match.field(BIRTHDAY) + .query(value))); + }; + + } + + return Optional.empty(); + } + + private String resolveDateOperator(final String operator) { + return operator == null ? "equal" : operator.toLowerCase(); + } + + private Optional applyStreetAddressCriteria(final PatientFilter criteria) { + + String address = criteria.getAddress(); + if (address != null && !address.isEmpty()) { + + String result = address.replace("(", "").replace(")", ""); + + return Optional.of( + NestedQuery.of( + nested -> nested.path(ADDRESSES) + .scoreMode(ChildScoreMode.Avg) + .query( + query -> query.simpleQueryString( + queryString -> queryString.fields("address.streetAddr1") + .defaultOperator(Operator.And) + .query(WildCards.startsWith(result)))))); + } + + return Optional.empty(); + } + + private Optional applyCityCriteria(final PatientFilter criteria) { + + String city = criteria.getCity(); + if (city != null && !city.isEmpty()) { + + return Optional.of( + NestedQuery.of( + nested -> nested.path(ADDRESSES) + .scoreMode(ChildScoreMode.Avg) + .query( + query -> query.simpleQueryString( + queryString -> queryString.fields("address.city") + .defaultOperator(Operator.And) + .query(WildCards.startsWith(city)))))); + } + + return Optional.empty(); + } + + private Optional applyZipcodeCriteria(final PatientFilter criteria) { + + String zipcode = criteria.getZip(); + if (zipcode != null && !zipcode.isEmpty()) { + + QueryVariant q = zipcode.length() < 5 + ? PrefixQuery.of( + prefix -> prefix.field("address.zip") + .value(zipcode)) + : MatchQuery.of( + match -> match.field("address.zip") + .query(zipcode)); + + return Optional.of( + NestedQuery.of( + nested -> nested.path(ADDRESSES) + .scoreMode(ChildScoreMode.Avg) + .query(q._toQuery()))); + } + + return Optional.empty(); + } +} diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java new file mode 100644 index 0000000000..432eec451f --- /dev/null +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java @@ -0,0 +1,33 @@ +package gov.cdc.nbs.patient.search; + +import java.util.Optional; +import java.util.stream.Stream; +import org.springframework.stereotype.Component; +import co.elastic.clients.elasticsearch._types.query_dsl.MatchQuery; +import co.elastic.clients.elasticsearch._types.query_dsl.Query; +import co.elastic.clients.elasticsearch._types.query_dsl.QueryVariant; + +@Component +class PatientEventQueryResolver { + private static final String LAB_REPORT_ID = "lab_report_ids"; + private static final String MORBIDITY_REPORT_ID = "morbidity_report_ids"; + + Stream resolve(final PatientFilter criteria) { + return Stream.of( + applyLabIdCriteria(criteria), + applyMorbidityIdCriteria(criteria)) + .flatMap(Optional::stream) + .map(QueryVariant::_toQuery); + } + + private Optional applyLabIdCriteria(final PatientFilter criteria) { + return criteria.maybeLabReportId() + .map(identifier -> MatchQuery.of(match -> match.field(LAB_REPORT_ID).query(criteria.getLabReportId()))); + } + + private Optional applyMorbidityIdCriteria(final PatientFilter criteria) { + return criteria.maybeMorbidityId() + .map(identifier -> MatchQuery.of(match -> match.field(MORBIDITY_REPORT_ID).query(criteria.getMorbidityId()))); + } + +} diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java index 036073330a..8399810e72 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java @@ -18,6 +18,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Optional; @Getter @Setter @@ -57,8 +58,17 @@ public static class Identification { private String mortalityStatus; private String ethnicity; private List recordStatus; + private String morbidityId; + private String documentId; + private String stateCaseId; + private String abcCaseId; + private String cityCountyCaseId; + private String notificationId; private String treatmentId; private String vaccinationId; + private String labReportId; + private String accessionNumberId; + private boolean disableSoundex; @JsonIgnore @Getter(AccessLevel.NONE) @@ -102,4 +112,22 @@ public PatientFilter withId(final String id) { this.id = id; return this; } + + public PatientFilter withLabReportId(final String identifier) { + this.labReportId = identifier; + return this; + } + + public Optional maybeLabReportId() { + return Optional.ofNullable(labReportId); + } + + public PatientFilter withMorbidityId(final String identifier) { + this.morbidityId = identifier; + return this; + } + + public Optional maybeMorbidityId() { + return Optional.ofNullable(morbidityId); + } } diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientSearchCriteriaQueryResolver.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientSearchCriteriaQueryResolver.java index 07ec2a0e51..6eab46c6e7 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientSearchCriteriaQueryResolver.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientSearchCriteriaQueryResolver.java @@ -1,369 +1,30 @@ package gov.cdc.nbs.patient.search; +import java.util.stream.Stream; +import org.springframework.stereotype.Component; import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery; -import co.elastic.clients.elasticsearch._types.query_dsl.ChildScoreMode; -import co.elastic.clients.elasticsearch._types.query_dsl.MatchQuery; -import co.elastic.clients.elasticsearch._types.query_dsl.NestedQuery; -import co.elastic.clients.elasticsearch._types.query_dsl.Operator; -import co.elastic.clients.elasticsearch._types.query_dsl.PrefixQuery; import co.elastic.clients.elasticsearch._types.query_dsl.Query; -import co.elastic.clients.elasticsearch._types.query_dsl.QueryVariant; -import co.elastic.clients.elasticsearch._types.query_dsl.RangeQuery; -import co.elastic.clients.elasticsearch._types.query_dsl.TermQuery; -import co.elastic.clients.json.JsonData; -import gov.cdc.nbs.patient.identifier.PatientLocalIdentifierResolver; -import gov.cdc.nbs.search.AdjustStrings; -import gov.cdc.nbs.search.WildCards; -import gov.cdc.nbs.time.FlexibleInstantConverter; -import org.apache.commons.codec.language.Soundex; -import org.springframework.stereotype.Component; - -import java.time.LocalDate; -import java.util.Optional; -import java.util.stream.Stream; @Component class PatientSearchCriteriaQueryResolver { + private final PatientDemographicQueryResolver demographicQueryResolver; + private final PatientEventQueryResolver eventQueryResolver; - private static final String NAMES = "name"; - private static final String PHONES = "phone"; - private static final String EMAILS = "email"; - private static final String IDENTIFICATIONS = "entity_id"; - private static final String BIRTHDAY = "birth_time"; - private static final String ADDRESSES = "address"; - private final PatientSearchSettings settings; - private final PatientLocalIdentifierResolver resolver; - private final Soundex soundex; PatientSearchCriteriaQueryResolver( - final PatientSearchSettings settings, - final PatientLocalIdentifierResolver resolver) { - this.settings = settings; - this.resolver = resolver; - this.soundex = new Soundex(); + final PatientDemographicQueryResolver demographicQueryResolver, + final PatientEventQueryResolver eventQueryResolver) { + this.demographicQueryResolver = demographicQueryResolver; + this.eventQueryResolver = eventQueryResolver; } Query resolve(final PatientFilter criteria) { - return Stream.of( - applyPatientIdentifierCriteria(criteria), - applyFirstNameCriteria(criteria), - applyLastNameCriteria(criteria), - applyPhoneNumberCriteria(criteria), - applyEmailCriteria(criteria), - applyIdentificationCriteria(criteria), - applyDateOfBirthCriteria(criteria), - applyStreetAddressCriteria(criteria), - applyCityCriteria(criteria), - applyZipcodeCriteria(criteria)).flatMap(Optional::stream) - .map(QueryVariant::_toQuery) - .reduce( + return Stream.concat( + demographicQueryResolver.resolve(criteria), + eventQueryResolver.resolve(criteria)).reduce( new BoolQuery.Builder(), BoolQuery.Builder::must, (one, two) -> one.must(two.build().must())) .build()._toQuery(); } - - private Optional applyPatientIdentifierCriteria(final PatientFilter criteria) { - if (criteria.getId() != null) { - String shortOrLongIdStripped = criteria.getId().strip(); - - if (shortOrLongIdStripped.isEmpty()) { - return Optional.empty(); - } - - if (Character.isDigit(shortOrLongIdStripped.charAt(0))) { - // This may be a short id, resolve the local id and then search for it - try { - long shortId = Long.parseLong(shortOrLongIdStripped); - - String localId = resolver.resolve(shortId); - - return applyLocalId(localId); - - } catch (NumberFormatException exception) { - // skip these criteria. it's not a short id or long id - } - } else { - return applyLocalId(shortOrLongIdStripped); - } - } - - return Optional.empty(); - } - - private Optional applyLocalId(final String local) { - return Optional.of( - TermQuery.of( - query -> query.field("local_id") - .value(local))); - } - - private Optional applyFirstNameCriteria(final PatientFilter criteria) { - String name = criteria.getFirstName(); - - if (name != null && !name.isBlank()) { - - String encoded; - if (criteria.isDisableSoundex()) { - encoded = ""; - } else { - encoded = soundex.encode(name.trim()); - } - - return Optional.of( - BoolQuery.of( - bool -> bool.should( - should -> should.nested( - nested -> nested.path(NAMES) - .scoreMode(ChildScoreMode.Max) - .query( - query -> query.bool( - legal -> legal.filter( - filter -> filter.term( - term -> term.field("name.nm_use_cd.keyword") - .value("L"))) - .must( - primary -> primary.match( - match -> match - .field("name.firstNm") - .query(name) - .boost(settings.first().primary()) - - )))))).should( - should -> should.nested( - nested -> nested.path(NAMES) - .scoreMode(ChildScoreMode.Avg) - .query( - nonPrimary -> nonPrimary.simpleQueryString( - queryString -> queryString - .fields("name.firstNm") - .query(WildCards.startsWith(name)) - .boost(settings.first().nonPrimary()))))) - .should( - should -> should.nested( - nested -> nested.path(NAMES) - .scoreMode(ChildScoreMode.Avg) - .boost(settings.first().soundex()) - .query( - query -> query.term( - term -> term - .field("name.firstNmSndx.keyword") - .value(encoded))))))); - } - return Optional.empty(); - } - - private Optional applyLastNameCriteria(final PatientFilter criteria) { - String name = AdjustStrings.withoutHyphens(criteria.getLastName()); - - if (name != null && !name.isBlank()) { - String encoded; - if (criteria.isDisableSoundex()) { - encoded = ""; - } else { - encoded = soundex.encode(name.trim()); - } - - return Optional.of( - BoolQuery.of( - bool -> bool.should( - should -> should.nested( - nested -> nested.path(NAMES) - .scoreMode(ChildScoreMode.Max) - .query( - query -> query.bool( - legal -> legal.filter( - filter -> filter.term( - term -> term.field("name.nm_use_cd.keyword") - .value("L"))) - .must( - primary -> primary.match( - match -> match - .field("name.lastNm") - .query(name) - .boost(settings.first().primary()))))))) - .should( - should -> should.nested( - nested -> nested.path(NAMES) - .scoreMode(ChildScoreMode.Avg) - .query( - query -> query.simpleQueryString( - nonPrimary -> nonPrimary - .fields("name.lastNm") - .query(WildCards.startsWith(name)) - .boost(settings.first().nonPrimary()))))) - .should( - should -> should.nested( - nested -> nested.path(NAMES) - .scoreMode(ChildScoreMode.Avg) - .boost(settings.first().soundex()) - .query( - query -> query.term( - term -> term - .field("name.lastNmSndx.keyword") - .value(encoded))))))); - } - return Optional.empty(); - } - - private Optional applyPhoneNumberCriteria(final PatientFilter criteria) { - - String number = AdjustStrings.withoutSpecialCharacters(criteria.getPhoneNumber()); - - if (number != null && !number.isEmpty()) { - - return Optional.of( - NestedQuery.of( - nested -> nested.path(PHONES) - .scoreMode(ChildScoreMode.Avg) - .query( - query -> query.wildcard( - wildcard -> wildcard.field("phone.telephoneNbr") - .value(WildCards.contains(number)))))); - - } - - return Optional.empty(); - } - - private Optional applyEmailCriteria(final PatientFilter criteria) { - - String email = criteria.getEmail(); - if (email != null && !email.isEmpty()) { - - return Optional.of( - NestedQuery.of( - nested -> nested.path(EMAILS) - .scoreMode(ChildScoreMode.Avg) - .query( - query -> query.simpleQueryString( - queryString -> queryString.fields("email.emailAddress") - .defaultOperator(Operator.And) - .query(email))))); - } - - return Optional.empty(); - } - - private Optional applyIdentificationCriteria(final PatientFilter criteria) { - - PatientFilter.Identification identification = criteria.getIdentification(); - - String type = identification.getIdentificationType(); - String value = AdjustStrings.withoutSpecialCharacters(identification.getIdentificationNumber()); - - if (type != null && (value != null && !value.isEmpty())) { - return Optional.of( - NestedQuery.of( - nested -> nested.path(IDENTIFICATIONS) - .scoreMode(ChildScoreMode.Avg) - .query( - query -> query.bool( - bool -> bool.filter( - filter -> filter.term( - term -> term.field("entity_id.typeCd.keyword") - .value(type))) - .must( - must -> must.prefix( - prefix -> prefix.field("entity_id.rootExtensionTxt").caseInsensitive(true) - .value(value))))))); - } - return Optional.empty(); - } - - private Optional applyDateOfBirthCriteria(final PatientFilter criteria) { - - LocalDate dateOfBirth = criteria.getDateOfBirth(); - - if (dateOfBirth != null) { - String operator = resolveDateOperator(criteria.getDateOfBirthOperator()); - String value = FlexibleInstantConverter.toString(dateOfBirth); - - return switch (operator) { - case "before" -> Optional.of( - RangeQuery.of( - range -> range.field(BIRTHDAY) - .lt(JsonData.of(value)))); - case "after" -> Optional.of( - RangeQuery.of( - range -> range.field(BIRTHDAY) - .gt(JsonData.of(value)))); - default -> Optional.of( - MatchQuery.of( - match -> match.field(BIRTHDAY) - .query(value))); - }; - - } - - return Optional.empty(); - } - - private String resolveDateOperator(final String operator) { - return operator == null ? "equal" : operator.toLowerCase(); - } - - private Optional applyStreetAddressCriteria(final PatientFilter criteria) { - - String address = criteria.getAddress(); - if (address != null && !address.isEmpty()) { - - String result = address.replace("(", "").replace(")", ""); - - return Optional.of( - NestedQuery.of( - nested -> nested.path(ADDRESSES) - .scoreMode(ChildScoreMode.Avg) - .query( - query -> query.simpleQueryString( - queryString -> queryString.fields("address.streetAddr1") - .defaultOperator(Operator.And) - .query(WildCards.startsWith(result)))))); - } - - return Optional.empty(); - } - - private Optional applyCityCriteria(final PatientFilter criteria) { - - String city = criteria.getCity(); - if (city != null && !city.isEmpty()) { - - return Optional.of( - NestedQuery.of( - nested -> nested.path(ADDRESSES) - .scoreMode(ChildScoreMode.Avg) - .query( - query -> query.simpleQueryString( - queryString -> queryString.fields("address.city") - .defaultOperator(Operator.And) - .query(WildCards.startsWith(city)))))); - } - - return Optional.empty(); - } - - private Optional applyZipcodeCriteria(final PatientFilter criteria) { - - String zipcode = criteria.getZip(); - if (zipcode != null && !zipcode.isEmpty()) { - - QueryVariant q = zipcode.length() < 5 - ? PrefixQuery.of( - prefix -> prefix.field("address.zip") - .value(zipcode)) - : MatchQuery.of( - match -> match.field("address.zip") - .query(zipcode)); - - return Optional.of( - NestedQuery.of( - nested -> nested.path(ADDRESSES) - .scoreMode(ChildScoreMode.Avg) - .query(q._toQuery()))); - } - - return Optional.empty(); - } - } diff --git a/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls b/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls index 0e59febda2..81478afa60 100644 --- a/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls +++ b/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls @@ -24,7 +24,15 @@ input PersonFilter { mortalityStatus: String ethnicity: String vaccinationId: String + morbidityId: String + documentId: String + stateCaseId: String + abcCaseId: String + cityCountyCaseId: String + notificationId: String treatmentId: String + labReportId: String + accessionNumberId: String disableSoundex: Boolean recordStatus: [RecordStatus!]! } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java new file mode 100644 index 0000000000..be10bca78c --- /dev/null +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java @@ -0,0 +1,37 @@ +package gov.cdc.nbs.patient.search; + +import gov.cdc.nbs.event.report.lab.LabReportIdentifier; +import gov.cdc.nbs.event.report.morbidity.MorbidityReportIdentifier; +import gov.cdc.nbs.testing.support.Active; +import io.cucumber.java.en.Given; + +public class PatientSearchEventIdSteps { + private final Active activeCriteria; + private final Active activeMorbidityReport; + private final Active activeLabReport; + + PatientSearchEventIdSteps( + final Active activeCriteria, + final Active activeLabReport, + final Active activeMorbidityReport) { + this.activeCriteria = activeCriteria; + this.activeMorbidityReport = activeMorbidityReport; + this.activeLabReport = activeLabReport; + } + + @Given("I would like to search for a patient using the Morbidity Report ID") + public void i_would_like_to_search_for_a_patient_using_the_morbidity_report_ID() { + this.activeMorbidityReport.maybeActive() + .map(MorbidityReportIdentifier::local) + .ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withMorbidityId(identifier))); + } + + @Given("I would like to search for a patient using the Lab Report ID") + public void i_would_like_to_search_for_a_patient_using_the_lab_report_ID() { + this.activeLabReport.maybeActive() + .map(LabReportIdentifier::local) + .ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withLabReportId(identifier))); + } +} diff --git a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature new file mode 100644 index 0000000000..d34956fe5f --- /dev/null +++ b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature @@ -0,0 +1,25 @@ +@patient @patient-search @patient-search-event +Feature: Patient Search by Event ID + + Background: + Given I am logged into NBS + And I can "find" any "patient" + And I have a patient + + Scenario: I can find a patient with a Morbidity Report ID + Given I have another patient + And the patient has a Morbidity Report + And patients are available for search + And I would like to search for a patient using the Morbidity Report ID + When I search for patients + Then the patient is in the search results + And there is only one patient search result + + Scenario: I can find a patient with a Lab Report ID + Given I have another patient + And the patient has a Lab Report + And patients are available for search + And I would like to search for a patient using the Lab Report ID + When I search for patients + Then the patient is in the search results + And there is only one patient search result \ No newline at end of file From e5d0f329d3dfcbc52b4822b15857ce6e632866a4 Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Wed, 23 Oct 2024 16:28:37 -0400 Subject: [PATCH 02/14] generated types --- .../src/apps/search/patient/criteria.ts | 13 +- .../src/apps/search/patient/transformer.ts | 30 ++- .../src/generated/graphql/schema.ts | 200 +++++++++--------- apps/modernization-ui/src/generated/index.ts | 11 +- .../src/generated/models/CreatedPatient.ts | 2 + .../src/generated/models/Edit.ts | 8 - .../generated/models/EthnicityDemographic.ts | 11 + .../models/GeneralInformationDemographic.ts | 17 ++ .../src/generated/models/Library.ts | 8 - .../src/generated/models/Management.ts | 11 - .../generated/models/MortalityDemographic.ts | 14 ++ .../generated/models/{Create.ts => Name.ts} | 5 +- .../src/generated/models/NewPatient.ts | 6 + .../src/generated/models/Page.ts | 11 - .../src/generated/models/Table.ts | 8 - .../src/generated/models/View.ts | 10 - .../src/generated/schema.graphqls | 8 + 17 files changed, 209 insertions(+), 164 deletions(-) delete mode 100644 apps/modernization-ui/src/generated/models/Edit.ts create mode 100644 apps/modernization-ui/src/generated/models/EthnicityDemographic.ts create mode 100644 apps/modernization-ui/src/generated/models/GeneralInformationDemographic.ts delete mode 100644 apps/modernization-ui/src/generated/models/Library.ts delete mode 100644 apps/modernization-ui/src/generated/models/Management.ts create mode 100644 apps/modernization-ui/src/generated/models/MortalityDemographic.ts rename apps/modernization-ui/src/generated/models/{Create.ts => Name.ts} (69%) delete mode 100644 apps/modernization-ui/src/generated/models/Page.ts delete mode 100644 apps/modernization-ui/src/generated/models/Table.ts delete mode 100644 apps/modernization-ui/src/generated/models/View.ts diff --git a/apps/modernization-ui/src/apps/search/patient/criteria.ts b/apps/modernization-ui/src/apps/search/patient/criteria.ts index 244e5e6a20..45cb1fbdb2 100644 --- a/apps/modernization-ui/src/apps/search/patient/criteria.ts +++ b/apps/modernization-ui/src/apps/search/patient/criteria.ts @@ -42,7 +42,18 @@ type Identification = { identificationType?: Selectable; }; -type PatientCriteriaEntry = BasicInformation & Address & Contact & RaceEthnicity & Identification; +type EventIds = { + morbidityId?: string; + documentId?: string; + stateCaseId?: string; + abcCaseId?: string; + cityCountyCaseId?: string; + notificationId?: string; + labReportId?: string; + accessionNumberId?: string; +}; + +type PatientCriteriaEntry = BasicInformation & Address & Contact & RaceEthnicity & Identification & EventIds; export type { PatientCriteriaEntry, BasicInformation, Identification, RaceEthnicity, Contact }; diff --git a/apps/modernization-ui/src/apps/search/patient/transformer.ts b/apps/modernization-ui/src/apps/search/patient/transformer.ts index 1496dcee93..ad9e8c1e5a 100644 --- a/apps/modernization-ui/src/apps/search/patient/transformer.ts +++ b/apps/modernization-ui/src/apps/search/patient/transformer.ts @@ -13,8 +13,26 @@ const resolveIdentification = (data: PatientCriteriaEntry): IdentificationCriter : undefined; export const transform = (data: PatientCriteriaEntry): PersonFilter => { - const { includeSimilar, lastName, firstName, id, address, city, phoneNumber, email, dateOfBirth, ...remaining } = - data; + const { + includeSimilar, + lastName, + firstName, + id, + address, + city, + phoneNumber, + email, + dateOfBirth, + morbidityId, + documentId, + stateCaseId, + abcCaseId, + cityCountyCaseId, + notificationId, + labReportId, + accessionNumberId, + ...remaining + } = data; return { disableSoundex: !includeSimilar, lastName, @@ -24,6 +42,14 @@ export const transform = (data: PatientCriteriaEntry): PersonFilter => { city, phoneNumber, email, + morbidityId, + documentId, + stateCaseId, + abcCaseId, + cityCountyCaseId, + notificationId, + labReportId, + accessionNumberId, recordStatus: asValues(remaining.status) as RecordStatus[], gender: asValue(remaining.gender), state: asValue(remaining.state), diff --git a/apps/modernization-ui/src/generated/graphql/schema.ts b/apps/modernization-ui/src/generated/graphql/schema.ts index 8be212083e..cc0c13ee54 100644 --- a/apps/modernization-ui/src/generated/graphql/schema.ts +++ b/apps/modernization-ui/src/generated/graphql/schema.ts @@ -1637,25 +1637,33 @@ export type PatientVaccinationResults = { }; export type PersonFilter = { + abcCaseId?: InputMaybe; + accessionNumberId?: InputMaybe; address?: InputMaybe; city?: InputMaybe; + cityCountyCaseId?: InputMaybe; country?: InputMaybe; dateOfBirth?: InputMaybe; dateOfBirthOperator?: InputMaybe; deceased?: InputMaybe; disableSoundex?: InputMaybe; + documentId?: InputMaybe; email?: InputMaybe; ethnicity?: InputMaybe; firstName?: InputMaybe; gender?: InputMaybe; id?: InputMaybe; identification?: InputMaybe; + labReportId?: InputMaybe; lastName?: InputMaybe; + morbidityId?: InputMaybe; mortalityStatus?: InputMaybe; + notificationId?: InputMaybe; phoneNumber?: InputMaybe; race?: InputMaybe; recordStatus: Array; state?: InputMaybe; + stateCaseId?: InputMaybe; treatmentId?: InputMaybe; vaccinationId?: InputMaybe; zip?: InputMaybe; @@ -3437,8 +3445,8 @@ export function useAddressTypesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptio const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(AddressTypesDocument, options); } -export function useAddressTypesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useAddressTypesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(AddressTypesDocument, options); } export type AddressTypesQueryHookResult = ReturnType; @@ -3477,8 +3485,8 @@ export function useAddressUsesLazyQuery(baseOptions?: Apollo.LazyQueryHookOption const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(AddressUsesDocument, options); } -export function useAddressUsesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useAddressUsesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(AddressUsesDocument, options); } export type AddressUsesQueryHookResult = ReturnType; @@ -3517,8 +3525,8 @@ export function useAssigningAuthoritiesLazyQuery(baseOptions?: Apollo.LazyQueryH const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(AssigningAuthoritiesDocument, options); } -export function useAssigningAuthoritiesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useAssigningAuthoritiesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(AssigningAuthoritiesDocument, options); } export type AssigningAuthoritiesQueryHookResult = ReturnType; @@ -3559,8 +3567,8 @@ export function useCountiesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions(CountiesDocument, options); } -export function useCountiesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useCountiesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(CountiesDocument, options); } export type CountiesQueryHookResult = ReturnType; @@ -3599,8 +3607,8 @@ export function useCountriesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions< const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(CountriesDocument, options); } -export function useCountriesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useCountriesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(CountriesDocument, options); } export type CountriesQueryHookResult = ReturnType; @@ -3639,8 +3647,8 @@ export function useDegreesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions(DegreesDocument, options); } -export function useDegreesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useDegreesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(DegreesDocument, options); } export type DegreesQueryHookResult = ReturnType; @@ -3679,8 +3687,8 @@ export function useDetailedEthnicitiesLazyQuery(baseOptions?: Apollo.LazyQueryHo const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(DetailedEthnicitiesDocument, options); } -export function useDetailedEthnicitiesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useDetailedEthnicitiesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(DetailedEthnicitiesDocument, options); } export type DetailedEthnicitiesQueryHookResult = ReturnType; @@ -3721,8 +3729,8 @@ export function useDetailedRacesLazyQuery(baseOptions?: Apollo.LazyQueryHookOpti const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(DetailedRacesDocument, options); } -export function useDetailedRacesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useDetailedRacesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(DetailedRacesDocument, options); } export type DetailedRacesQueryHookResult = ReturnType; @@ -3761,8 +3769,8 @@ export function useEducationLevelsLazyQuery(baseOptions?: Apollo.LazyQueryHookOp const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(EducationLevelsDocument, options); } -export function useEducationLevelsSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useEducationLevelsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(EducationLevelsDocument, options); } export type EducationLevelsQueryHookResult = ReturnType; @@ -3801,8 +3809,8 @@ export function useEthnicGroupsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptio const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(EthnicGroupsDocument, options); } -export function useEthnicGroupsSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useEthnicGroupsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(EthnicGroupsDocument, options); } export type EthnicGroupsQueryHookResult = ReturnType; @@ -3841,8 +3849,8 @@ export function useEthnicityUnknownReasonsLazyQuery(baseOptions?: Apollo.LazyQue const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(EthnicityUnknownReasonsDocument, options); } -export function useEthnicityUnknownReasonsSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useEthnicityUnknownReasonsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(EthnicityUnknownReasonsDocument, options); } export type EthnicityUnknownReasonsQueryHookResult = ReturnType; @@ -3882,8 +3890,8 @@ export function useFindAllConditionCodesLazyQuery(baseOptions?: Apollo.LazyQuery const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindAllConditionCodesDocument, options); } -export function useFindAllConditionCodesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindAllConditionCodesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindAllConditionCodesDocument, options); } export type FindAllConditionCodesQueryHookResult = ReturnType; @@ -3928,8 +3936,8 @@ export function useFindAllEthnicityValuesLazyQuery(baseOptions?: Apollo.LazyQuer const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindAllEthnicityValuesDocument, options); } -export function useFindAllEthnicityValuesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindAllEthnicityValuesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindAllEthnicityValuesDocument, options); } export type FindAllEthnicityValuesQueryHookResult = ReturnType; @@ -3988,8 +3996,8 @@ export function useFindAllJurisdictionsLazyQuery(baseOptions?: Apollo.LazyQueryH const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindAllJurisdictionsDocument, options); } -export function useFindAllJurisdictionsSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindAllJurisdictionsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindAllJurisdictionsDocument, options); } export type FindAllJurisdictionsQueryHookResult = ReturnType; @@ -4035,8 +4043,8 @@ export function useFindAllOutbreaksLazyQuery(baseOptions?: Apollo.LazyQueryHookO const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindAllOutbreaksDocument, options); } -export function useFindAllOutbreaksSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindAllOutbreaksSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindAllOutbreaksDocument, options); } export type FindAllOutbreaksQueryHookResult = ReturnType; @@ -4081,8 +4089,8 @@ export function useFindAllPatientIdentificationTypesLazyQuery(baseOptions?: Apol const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindAllPatientIdentificationTypesDocument, options); } -export function useFindAllPatientIdentificationTypesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindAllPatientIdentificationTypesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindAllPatientIdentificationTypesDocument, options); } export type FindAllPatientIdentificationTypesQueryHookResult = ReturnType; @@ -4127,8 +4135,8 @@ export function useFindAllProgramAreasLazyQuery(baseOptions?: Apollo.LazyQueryHo const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindAllProgramAreasDocument, options); } -export function useFindAllProgramAreasSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindAllProgramAreasSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindAllProgramAreasDocument, options); } export type FindAllProgramAreasQueryHookResult = ReturnType; @@ -4173,8 +4181,8 @@ export function useFindAllRaceValuesLazyQuery(baseOptions?: Apollo.LazyQueryHook const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindAllRaceValuesDocument, options); } -export function useFindAllRaceValuesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindAllRaceValuesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindAllRaceValuesDocument, options); } export type FindAllRaceValuesQueryHookResult = ReturnType; @@ -4220,8 +4228,8 @@ export function useFindAllUsersLazyQuery(baseOptions?: Apollo.LazyQueryHookOptio const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindAllUsersDocument, options); } -export function useFindAllUsersSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindAllUsersSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindAllUsersDocument, options); } export type FindAllUsersQueryHookResult = ReturnType; @@ -4283,8 +4291,8 @@ export function useFindContactsNamedByPatientLazyQuery(baseOptions?: Apollo.Lazy const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindContactsNamedByPatientDocument, options); } -export function useFindContactsNamedByPatientSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindContactsNamedByPatientSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindContactsNamedByPatientDocument, options); } export type FindContactsNamedByPatientQueryHookResult = ReturnType; @@ -4323,8 +4331,8 @@ export function useFindDistinctCodedResultsLazyQuery(baseOptions?: Apollo.LazyQu const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindDistinctCodedResultsDocument, options); } -export function useFindDistinctCodedResultsSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindDistinctCodedResultsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindDistinctCodedResultsDocument, options); } export type FindDistinctCodedResultsQueryHookResult = ReturnType; @@ -4363,8 +4371,8 @@ export function useFindDistinctResultedTestLazyQuery(baseOptions?: Apollo.LazyQu const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindDistinctResultedTestDocument, options); } -export function useFindDistinctResultedTestSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindDistinctResultedTestSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindDistinctResultedTestDocument, options); } export type FindDistinctResultedTestQueryHookResult = ReturnType; @@ -4418,8 +4426,8 @@ export function useFindDocumentsForPatientLazyQuery(baseOptions?: Apollo.LazyQue const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindDocumentsForPatientDocument, options); } -export function useFindDocumentsForPatientSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindDocumentsForPatientSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindDocumentsForPatientDocument, options); } export type FindDocumentsForPatientQueryHookResult = ReturnType; @@ -4483,8 +4491,8 @@ export function useFindDocumentsRequiringReviewForPatientLazyQuery(baseOptions?: const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindDocumentsRequiringReviewForPatientDocument, options); } -export function useFindDocumentsRequiringReviewForPatientSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindDocumentsRequiringReviewForPatientSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindDocumentsRequiringReviewForPatientDocument, options); } export type FindDocumentsRequiringReviewForPatientQueryHookResult = ReturnType; @@ -4548,8 +4556,8 @@ export function useFindInvestigationsByFilterLazyQuery(baseOptions?: Apollo.Lazy const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindInvestigationsByFilterDocument, options); } -export function useFindInvestigationsByFilterSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindInvestigationsByFilterSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindInvestigationsByFilterDocument, options); } export type FindInvestigationsByFilterQueryHookResult = ReturnType; @@ -4608,8 +4616,8 @@ export function useFindInvestigationsForPatientLazyQuery(baseOptions?: Apollo.La const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindInvestigationsForPatientDocument, options); } -export function useFindInvestigationsForPatientSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindInvestigationsForPatientSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindInvestigationsForPatientDocument, options); } export type FindInvestigationsForPatientQueryHookResult = ReturnType; @@ -4691,8 +4699,8 @@ export function useFindLabReportsByFilterLazyQuery(baseOptions?: Apollo.LazyQuer const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindLabReportsByFilterDocument, options); } -export function useFindLabReportsByFilterSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindLabReportsByFilterSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindLabReportsByFilterDocument, options); } export type FindLabReportsByFilterQueryHookResult = ReturnType; @@ -4763,8 +4771,8 @@ export function useFindLabReportsForPatientLazyQuery(baseOptions?: Apollo.LazyQu const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindLabReportsForPatientDocument, options); } -export function useFindLabReportsForPatientSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindLabReportsForPatientSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindLabReportsForPatientDocument, options); } export type FindLabReportsForPatientQueryHookResult = ReturnType; @@ -4827,8 +4835,8 @@ export function useFindMorbidityReportsForPatientLazyQuery(baseOptions?: Apollo. const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindMorbidityReportsForPatientDocument, options); } -export function useFindMorbidityReportsForPatientSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindMorbidityReportsForPatientSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindMorbidityReportsForPatientDocument, options); } export type FindMorbidityReportsForPatientQueryHookResult = ReturnType; @@ -4890,8 +4898,8 @@ export function useFindPatientNamedByContactLazyQuery(baseOptions?: Apollo.LazyQ const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindPatientNamedByContactDocument, options); } -export function useFindPatientNamedByContactSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindPatientNamedByContactSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindPatientNamedByContactDocument, options); } export type FindPatientNamedByContactQueryHookResult = ReturnType; @@ -5245,8 +5253,8 @@ export function useFindPatientProfileLazyQuery(baseOptions?: Apollo.LazyQueryHoo const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindPatientProfileDocument, options); } -export function useFindPatientProfileSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindPatientProfileSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindPatientProfileDocument, options); } export type FindPatientProfileQueryHookResult = ReturnType; @@ -5333,8 +5341,8 @@ export function useFindPatientsByFilterLazyQuery(baseOptions?: Apollo.LazyQueryH const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindPatientsByFilterDocument, options); } -export function useFindPatientsByFilterSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindPatientsByFilterSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindPatientsByFilterDocument, options); } export type FindPatientsByFilterQueryHookResult = ReturnType; @@ -5388,8 +5396,8 @@ export function useFindTreatmentsForPatientLazyQuery(baseOptions?: Apollo.LazyQu const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindTreatmentsForPatientDocument, options); } -export function useFindTreatmentsForPatientSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindTreatmentsForPatientSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindTreatmentsForPatientDocument, options); } export type FindTreatmentsForPatientQueryHookResult = ReturnType; @@ -5443,8 +5451,8 @@ export function useFindVaccinationsForPatientLazyQuery(baseOptions?: Apollo.Lazy const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(FindVaccinationsForPatientDocument, options); } -export function useFindVaccinationsForPatientSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useFindVaccinationsForPatientSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(FindVaccinationsForPatientDocument, options); } export type FindVaccinationsForPatientQueryHookResult = ReturnType; @@ -5483,8 +5491,8 @@ export function useGenderUnknownReasonsLazyQuery(baseOptions?: Apollo.LazyQueryH const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(GenderUnknownReasonsDocument, options); } -export function useGenderUnknownReasonsSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useGenderUnknownReasonsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(GenderUnknownReasonsDocument, options); } export type GenderUnknownReasonsQueryHookResult = ReturnType; @@ -5523,8 +5531,8 @@ export function useGendersLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions(GendersDocument, options); } -export function useGendersSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useGendersSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(GendersDocument, options); } export type GendersQueryHookResult = ReturnType; @@ -5563,8 +5571,8 @@ export function useIdentificationTypesLazyQuery(baseOptions?: Apollo.LazyQueryHo const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(IdentificationTypesDocument, options); } -export function useIdentificationTypesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useIdentificationTypesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(IdentificationTypesDocument, options); } export type IdentificationTypesQueryHookResult = ReturnType; @@ -5603,8 +5611,8 @@ export function useMaritalStatusesLazyQuery(baseOptions?: Apollo.LazyQueryHookOp const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(MaritalStatusesDocument, options); } -export function useMaritalStatusesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useMaritalStatusesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(MaritalStatusesDocument, options); } export type MaritalStatusesQueryHookResult = ReturnType; @@ -5643,8 +5651,8 @@ export function useNameTypesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions< const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(NameTypesDocument, options); } -export function useNameTypesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useNameTypesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(NameTypesDocument, options); } export type NameTypesQueryHookResult = ReturnType; @@ -5683,8 +5691,8 @@ export function usePhoneTypesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(PhoneTypesDocument, options); } -export function usePhoneTypesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function usePhoneTypesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(PhoneTypesDocument, options); } export type PhoneTypesQueryHookResult = ReturnType; @@ -5723,8 +5731,8 @@ export function usePhoneUsesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions< const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(PhoneUsesDocument, options); } -export function usePhoneUsesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function usePhoneUsesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(PhoneUsesDocument, options); } export type PhoneUsesQueryHookResult = ReturnType; @@ -5763,8 +5771,8 @@ export function usePreferredGendersLazyQuery(baseOptions?: Apollo.LazyQueryHookO const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(PreferredGendersDocument, options); } -export function usePreferredGendersSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function usePreferredGendersSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(PreferredGendersDocument, options); } export type PreferredGendersQueryHookResult = ReturnType; @@ -5803,8 +5811,8 @@ export function usePrefixesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions

(PrefixesDocument, options); } -export function usePrefixesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function usePrefixesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(PrefixesDocument, options); } export type PrefixesQueryHookResult = ReturnType; @@ -5843,8 +5851,8 @@ export function usePrimaryLanguagesLazyQuery(baseOptions?: Apollo.LazyQueryHookO const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(PrimaryLanguagesDocument, options); } -export function usePrimaryLanguagesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function usePrimaryLanguagesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(PrimaryLanguagesDocument, options); } export type PrimaryLanguagesQueryHookResult = ReturnType; @@ -5883,8 +5891,8 @@ export function usePrimaryOccupationsLazyQuery(baseOptions?: Apollo.LazyQueryHoo const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(PrimaryOccupationsDocument, options); } -export function usePrimaryOccupationsSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function usePrimaryOccupationsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(PrimaryOccupationsDocument, options); } export type PrimaryOccupationsQueryHookResult = ReturnType; @@ -5923,8 +5931,8 @@ export function useRaceCategoriesLazyQuery(baseOptions?: Apollo.LazyQueryHookOpt const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery(RaceCategoriesDocument, options); } -export function useRaceCategoriesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useRaceCategoriesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(RaceCategoriesDocument, options); } export type RaceCategoriesQueryHookResult = ReturnType; @@ -5964,8 +5972,8 @@ export function useStatesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions(StatesDocument, options); } -export function useStatesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useStatesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(StatesDocument, options); } export type StatesQueryHookResult = ReturnType; @@ -6004,8 +6012,8 @@ export function useSuffixesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions(SuffixesDocument, options); } -export function useSuffixesSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { - const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} +export function useSuffixesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} return Apollo.useSuspenseQuery(SuffixesDocument, options); } export type SuffixesQueryHookResult = ReturnType; diff --git a/apps/modernization-ui/src/generated/index.ts b/apps/modernization-ui/src/generated/index.ts index 9a04a0ed54..093ffe937c 100644 --- a/apps/modernization-ui/src/generated/index.ts +++ b/apps/modernization-ui/src/generated/index.ts @@ -11,26 +11,23 @@ export type { AddressDemographic } from './models/AddressDemographic'; export type { Administrative } from './models/Administrative'; export type { BirthDemographic } from './models/BirthDemographic'; export type { ConceptOptionsResponse } from './models/ConceptOptionsResponse'; -export type { Create } from './models/Create'; export type { CreatedPatient } from './models/CreatedPatient'; -export type { Edit } from './models/Edit'; export type { EncryptionResponse } from './models/EncryptionResponse'; +export type { EthnicityDemographic } from './models/EthnicityDemographic'; export type { ExistingRaceCategory } from './models/ExistingRaceCategory'; export type { GenderDemographic } from './models/GenderDemographic'; +export type { GeneralInformationDemographic } from './models/GeneralInformationDemographic'; export type { Identification } from './models/Identification'; -export type { Library } from './models/Library'; export type { LoginRequest } from './models/LoginRequest'; export type { LoginResponse } from './models/LoginResponse'; -export type { Management } from './models/Management'; export type { Me } from './models/Me'; +export type { MortalityDemographic } from './models/MortalityDemographic'; +export type { Name } from './models/Name'; export type { NameDemographic } from './models/NameDemographic'; export type { NewPatient } from './models/NewPatient'; export type { Option } from './models/Option'; -export type { Page } from './models/Page'; export type { Phone } from './models/Phone'; export type { Race } from './models/Race'; -export type { Table } from './models/Table'; -export type { View } from './models/View'; export { CodedResultOptionsService } from './services/CodedResultOptionsService'; export { ConceptOptionsService } from './services/ConceptOptionsService'; diff --git a/apps/modernization-ui/src/generated/models/CreatedPatient.ts b/apps/modernization-ui/src/generated/models/CreatedPatient.ts index 4c488153bf..03739ee974 100644 --- a/apps/modernization-ui/src/generated/models/CreatedPatient.ts +++ b/apps/modernization-ui/src/generated/models/CreatedPatient.ts @@ -2,9 +2,11 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { Name } from './Name'; export type CreatedPatient = { id: number; shortId: number; local: string; + name?: Name; }; diff --git a/apps/modernization-ui/src/generated/models/Edit.ts b/apps/modernization-ui/src/generated/models/Edit.ts deleted file mode 100644 index d26812055b..0000000000 --- a/apps/modernization-ui/src/generated/models/Edit.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* generated using openapi-typescript-codegen -- do not edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -export type Edit = { - enabled?: boolean; -}; - diff --git a/apps/modernization-ui/src/generated/models/EthnicityDemographic.ts b/apps/modernization-ui/src/generated/models/EthnicityDemographic.ts new file mode 100644 index 0000000000..33c9b38a00 --- /dev/null +++ b/apps/modernization-ui/src/generated/models/EthnicityDemographic.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type EthnicityDemographic = { + asOf?: string; + ethnicGroup?: string; + unknownReason?: string; + detailed?: Array; +}; + diff --git a/apps/modernization-ui/src/generated/models/GeneralInformationDemographic.ts b/apps/modernization-ui/src/generated/models/GeneralInformationDemographic.ts new file mode 100644 index 0000000000..a803848222 --- /dev/null +++ b/apps/modernization-ui/src/generated/models/GeneralInformationDemographic.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type GeneralInformationDemographic = { + asOf?: string; + maritalStatus?: string; + maternalMaidenName?: string; + adultsInResidence?: number; + childrenInResidence?: number; + primaryOccupation?: string; + educationLevel?: string; + primaryLanguage?: string; + speaksEnglish?: string; + stateHIVCase?: string; +}; + diff --git a/apps/modernization-ui/src/generated/models/Library.ts b/apps/modernization-ui/src/generated/models/Library.ts deleted file mode 100644 index 1034de6d86..0000000000 --- a/apps/modernization-ui/src/generated/models/Library.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* generated using openapi-typescript-codegen -- do not edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -export type Library = { - enabled?: boolean; -}; - diff --git a/apps/modernization-ui/src/generated/models/Management.ts b/apps/modernization-ui/src/generated/models/Management.ts deleted file mode 100644 index f4c471806e..0000000000 --- a/apps/modernization-ui/src/generated/models/Management.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do not edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { Create } from './Create'; -import type { Edit } from './Edit'; -export type Management = { - create?: Create; - edit?: Edit; -}; - diff --git a/apps/modernization-ui/src/generated/models/MortalityDemographic.ts b/apps/modernization-ui/src/generated/models/MortalityDemographic.ts new file mode 100644 index 0000000000..04527e460f --- /dev/null +++ b/apps/modernization-ui/src/generated/models/MortalityDemographic.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type MortalityDemographic = { + asOf?: string; + deceased?: string; + deceasedOn?: string; + city?: string; + state?: string; + county?: string; + country?: string; +}; + diff --git a/apps/modernization-ui/src/generated/models/Create.ts b/apps/modernization-ui/src/generated/models/Name.ts similarity index 69% rename from apps/modernization-ui/src/generated/models/Create.ts rename to apps/modernization-ui/src/generated/models/Name.ts index 4b4fe66439..d4b2a84512 100644 --- a/apps/modernization-ui/src/generated/models/Create.ts +++ b/apps/modernization-ui/src/generated/models/Name.ts @@ -2,7 +2,8 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type Create = { - enabled?: boolean; +export type Name = { + first?: string; + last?: string; }; diff --git a/apps/modernization-ui/src/generated/models/NewPatient.ts b/apps/modernization-ui/src/generated/models/NewPatient.ts index 65df870565..cdbb54cad3 100644 --- a/apps/modernization-ui/src/generated/models/NewPatient.ts +++ b/apps/modernization-ui/src/generated/models/NewPatient.ts @@ -5,8 +5,11 @@ import type { AddressDemographic } from './AddressDemographic'; import type { Administrative } from './Administrative'; import type { BirthDemographic } from './BirthDemographic'; +import type { EthnicityDemographic } from './EthnicityDemographic'; import type { GenderDemographic } from './GenderDemographic'; +import type { GeneralInformationDemographic } from './GeneralInformationDemographic'; import type { Identification } from './Identification'; +import type { MortalityDemographic } from './MortalityDemographic'; import type { NameDemographic } from './NameDemographic'; import type { Phone } from './Phone'; import type { Race } from './Race'; @@ -14,6 +17,9 @@ export type NewPatient = { administrative?: Administrative; birth?: BirthDemographic; gender?: GenderDemographic; + ethnicity?: EthnicityDemographic; + mortality?: MortalityDemographic; + general?: GeneralInformationDemographic; names?: Array; addresses?: Array; phoneEmails?: Array; diff --git a/apps/modernization-ui/src/generated/models/Page.ts b/apps/modernization-ui/src/generated/models/Page.ts deleted file mode 100644 index 83d7f5571b..0000000000 --- a/apps/modernization-ui/src/generated/models/Page.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do not edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { Library } from './Library'; -import type { Management } from './Management'; -export type Page = { - library?: Library; - management?: Management; -}; - diff --git a/apps/modernization-ui/src/generated/models/Table.ts b/apps/modernization-ui/src/generated/models/Table.ts deleted file mode 100644 index e2c4553994..0000000000 --- a/apps/modernization-ui/src/generated/models/Table.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* generated using openapi-typescript-codegen -- do not edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -export type Table = { - enabled?: boolean; -}; - diff --git a/apps/modernization-ui/src/generated/models/View.ts b/apps/modernization-ui/src/generated/models/View.ts deleted file mode 100644 index d6349795d0..0000000000 --- a/apps/modernization-ui/src/generated/models/View.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do not edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { Table } from './Table'; -export type View = { - enabled?: boolean; - table?: Table; -}; - diff --git a/apps/modernization-ui/src/generated/schema.graphqls b/apps/modernization-ui/src/generated/schema.graphqls index 4ecca5dec8..c9103d3f59 100644 --- a/apps/modernization-ui/src/generated/schema.graphqls +++ b/apps/modernization-ui/src/generated/schema.graphqls @@ -1118,7 +1118,15 @@ input PersonFilter { mortalityStatus: String ethnicity: String vaccinationId: String + morbidityId: String + documentId: String + stateCaseId: String + abcCaseId: String + cityCountyCaseId: String + notificationId: String treatmentId: String + labReportId: String + accessionNumberId: String disableSoundex: Boolean recordStatus: [RecordStatus!]! } From fb16effbcf49b302b87205d63940fe76da39436f Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Wed, 23 Oct 2024 16:45:53 -0400 Subject: [PATCH 03/14] Document Id --- .../search/PatientEventQueryResolver.java | 22 ++++++++++------ .../cdc/nbs/patient/search/PatientFilter.java | 25 +++++++++++++------ .../search/PatientSearchEventIdSteps.java | 12 +++++++++ .../search/PatientSearch.eventId.feature | 10 ++++++++ 4 files changed, 55 insertions(+), 14 deletions(-) diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java index 432eec451f..a268ccf453 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java @@ -9,25 +9,33 @@ @Component class PatientEventQueryResolver { - private static final String LAB_REPORT_ID = "lab_report_ids"; private static final String MORBIDITY_REPORT_ID = "morbidity_report_ids"; + private static final String DOCUMENT_ID = "document_ids"; + private static final String LAB_REPORT_ID = "lab_report_ids"; Stream resolve(final PatientFilter criteria) { return Stream.of( - applyLabIdCriteria(criteria), - applyMorbidityIdCriteria(criteria)) + applyMorbidityIdCriteria(criteria), + applyDocumentIdCriteria(criteria), + applyLabIdCriteria(criteria)) .flatMap(Optional::stream) .map(QueryVariant::_toQuery); } + private Optional applyMorbidityIdCriteria(final PatientFilter criteria) { + return criteria.maybeMorbidityId() + .map(identifier -> MatchQuery.of(match -> match.field(MORBIDITY_REPORT_ID).query(criteria.getMorbidityId()))); + } + + private Optional applyDocumentIdCriteria(final PatientFilter criteria) { + return criteria.maybeDocumentId() + .map(identifier -> MatchQuery.of(match -> match.field(DOCUMENT_ID).query(criteria.getDocumentId()))); + } + private Optional applyLabIdCriteria(final PatientFilter criteria) { return criteria.maybeLabReportId() .map(identifier -> MatchQuery.of(match -> match.field(LAB_REPORT_ID).query(criteria.getLabReportId()))); } - private Optional applyMorbidityIdCriteria(final PatientFilter criteria) { - return criteria.maybeMorbidityId() - .map(identifier -> MatchQuery.of(match -> match.field(MORBIDITY_REPORT_ID).query(criteria.getMorbidityId()))); - } } diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java index 8399810e72..b636cbcfa1 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java @@ -113,6 +113,24 @@ public PatientFilter withId(final String id) { return this; } + public PatientFilter withMorbidityId(final String identifier) { + this.morbidityId = identifier; + return this; + } + + public Optional maybeMorbidityId() { + return Optional.ofNullable(morbidityId); + } + + public PatientFilter withDocumentId(final String identifier) { + this.documentId = identifier; + return this; + } + + public Optional maybeDocumentId() { + return Optional.ofNullable(documentId); + } + public PatientFilter withLabReportId(final String identifier) { this.labReportId = identifier; return this; @@ -122,12 +140,5 @@ public Optional maybeLabReportId() { return Optional.ofNullable(labReportId); } - public PatientFilter withMorbidityId(final String identifier) { - this.morbidityId = identifier; - return this; - } - public Optional maybeMorbidityId() { - return Optional.ofNullable(morbidityId); - } } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java index be10bca78c..a6e763b8e5 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java @@ -1,5 +1,6 @@ package gov.cdc.nbs.patient.search; +import gov.cdc.nbs.event.document.CaseReportIdentifier; import gov.cdc.nbs.event.report.lab.LabReportIdentifier; import gov.cdc.nbs.event.report.morbidity.MorbidityReportIdentifier; import gov.cdc.nbs.testing.support.Active; @@ -9,14 +10,17 @@ public class PatientSearchEventIdSteps { private final Active activeCriteria; private final Active activeMorbidityReport; private final Active activeLabReport; + private final Active activeCaseReport; PatientSearchEventIdSteps( final Active activeCriteria, final Active activeLabReport, + final Active activeCaseReport, final Active activeMorbidityReport) { this.activeCriteria = activeCriteria; this.activeMorbidityReport = activeMorbidityReport; this.activeLabReport = activeLabReport; + this.activeCaseReport = activeCaseReport; } @Given("I would like to search for a patient using the Morbidity Report ID") @@ -27,6 +31,14 @@ public void i_would_like_to_search_for_a_patient_using_the_morbidity_report_ID() identifier -> this.activeCriteria.active(criteria -> criteria.withMorbidityId(identifier))); } + @Given("I would like to search for a patient using the Document ID") + public void i_would_like_to_search_for_a_patient_using_the_document_ID() { + this.activeCaseReport.maybeActive() + .map(CaseReportIdentifier::local) + .ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withDocumentId(identifier))); + } + @Given("I would like to search for a patient using the Lab Report ID") public void i_would_like_to_search_for_a_patient_using_the_lab_report_ID() { this.activeLabReport.maybeActive() diff --git a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature index d34956fe5f..4c13c050d8 100644 --- a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature +++ b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature @@ -15,6 +15,16 @@ Feature: Patient Search by Event ID Then the patient is in the search results And there is only one patient search result + + Scenario: I can find a patient with a Document ID + Given I have another patient + And the patient has a Case Report + And patients are available for search + And I would like to search for a patient using the Document ID + When I search for patients + Then the patient is in the search results + And there is only one patient search result + Scenario: I can find a patient with a Lab Report ID Given I have another patient And the patient has a Lab Report From 03fd017bcd6355eff4d90dabed002bb6af7d5c46 Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Thu, 24 Oct 2024 13:01:03 -0400 Subject: [PATCH 04/14] State case and ABC case ID --- apps/modernization-api/build.gradle | 11 +++++++ .../search/PatientEventQueryResolver.java | 15 ++++++++++ .../cdc/nbs/patient/search/PatientFilter.java | 20 +++++++++++++ .../indexing/SearchablePatientFinder.java | 8 +++-- .../indexing/SearchablePatientRowMapper.java | 2 +- .../investigation/AbcCaseIdentifier.java | 5 ++++ .../investigation/InvestigationMother.java | 18 ++++++++--- .../investigation/InvestigationSteps.java | 30 ++++++------------- .../InvestigationSupportConfiguration.java | 10 +++++++ .../investigation/StateCaseIdentifier.java | 5 ++++ .../search/PatientSearchEventIdSteps.java | 24 +++++++++++++++ .../search/PatientSearch.eventId.feature | 29 ++++++++++++++---- .../investigation/InvestigationSearch.feature | 4 +-- 13 files changed, 145 insertions(+), 36 deletions(-) create mode 100644 apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/AbcCaseIdentifier.java create mode 100644 apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/StateCaseIdentifier.java diff --git a/apps/modernization-api/build.gradle b/apps/modernization-api/build.gradle index 20ff77287e..8aefc00d1b 100644 --- a/apps/modernization-api/build.gradle +++ b/apps/modernization-api/build.gradle @@ -120,6 +120,17 @@ testing { if (System.getProperty("testing.database.image") != null) { systemProperty "testing.database.image", System.getProperty("testing.database.image") } + test { + debugOptions { + enabled = true + server = true + suspend = false + port = java.util.Optional.ofNullable(findProperty('debug.port')) + .map(Object::toString) + .map(Integer::parseInt) + .orElse(5106) + } + } } } } diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java index a268ccf453..72f267b2b2 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java @@ -11,12 +11,16 @@ class PatientEventQueryResolver { private static final String MORBIDITY_REPORT_ID = "morbidity_report_ids"; private static final String DOCUMENT_ID = "document_ids"; + private static final String STATE_CASE_ID = "state_case_ids"; + private static final String ABC_CASE_ID = "abcs_case_ids"; private static final String LAB_REPORT_ID = "lab_report_ids"; Stream resolve(final PatientFilter criteria) { return Stream.of( applyMorbidityIdCriteria(criteria), applyDocumentIdCriteria(criteria), + applyStateCaseIdCriteria(criteria), + applyAbcCaseIdCriteria(criteria), applyLabIdCriteria(criteria)) .flatMap(Optional::stream) .map(QueryVariant::_toQuery); @@ -32,6 +36,17 @@ private Optional applyDocumentIdCriteria(final PatientFilter crite .map(identifier -> MatchQuery.of(match -> match.field(DOCUMENT_ID).query(criteria.getDocumentId()))); } + private Optional applyStateCaseIdCriteria(final PatientFilter criteria) { + return criteria.maybeStateCaseId() + .map(identifier -> MatchQuery.of(match -> match.field(STATE_CASE_ID).query(criteria.getStateCaseId()))); + } + + private Optional applyAbcCaseIdCriteria(final PatientFilter criteria) { + return criteria.maybeAbcCaseId() + .map(identifier -> MatchQuery.of(match -> match.field(ABC_CASE_ID).query(criteria.getAbcCaseId()))); + } + + private Optional applyLabIdCriteria(final PatientFilter criteria) { return criteria.maybeLabReportId() .map(identifier -> MatchQuery.of(match -> match.field(LAB_REPORT_ID).query(criteria.getLabReportId()))); diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java index b636cbcfa1..e4ce3f8e25 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java @@ -131,6 +131,26 @@ public Optional maybeDocumentId() { return Optional.ofNullable(documentId); } + + public PatientFilter withStateCaseId(final String identifier) { + this.stateCaseId = identifier; + return this; + } + + public Optional maybeStateCaseId() { + return Optional.ofNullable(stateCaseId); + } + + + public PatientFilter withAbcCaseId(final String identifier) { + this.abcCaseId = identifier; + return this; + } + + public Optional maybeAbcCaseId() { + return Optional.ofNullable(abcCaseId); + } + public PatientFilter withLabReportId(final String identifier) { this.labReportId = identifier; return this; diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientFinder.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientFinder.java index 70e3ce82c4..c77a334873 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientFinder.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientFinder.java @@ -110,6 +110,7 @@ FOR XML PATH('') Public_health_case phc JOIN Act_id ai ON phc.public_health_case_uid = ai.act_uid and ai.type_cd='STATE' + and (ai.assigning_authority_cd <> 'ABCS' OR ai.assigning_authority_cd IS NULL) and ai.root_extension_txt is not null and ai.root_extension_txt<>'' JOIN participation par ON par.act_uid = phc.public_health_case_uid @@ -129,6 +130,7 @@ FOR XML PATH('') JOIN Act_id ai ON phc.public_health_case_uid = ai.act_uid and ai.act_id_seq=2 and ai.type_cd='STATE' + and ai.assigning_authority_cd='ABCS' and ai.root_extension_txt is not null and ai.root_extension_txt<>'' JOIN participation par ON par.act_uid = phc.public_health_case_uid @@ -240,9 +242,9 @@ FOR XML PATH('') private static final int MORBIDITY_REPORT_IDS_COLUMN = 9; private static final int TREATMENT_IDS_COLUMN = 10; private static final int VACCINATION_IDS_COLUMN = 11; - private static final int ABCS_CASE_IDS_COLUMN = 12; - private static final int CITY_CASE_IDS_COLUMN = 13; - private static final int STATE_CASE_IDS_COLUMN = 14; + private static final int STATE_CASE_IDS_COLUMN = 12; + private static final int ABCS_CASE_IDS_COLUMN = 13; + private static final int CITY_CASE_IDS_COLUMN = 14; private static final int ACCESSION_IDS_COLUMN = 15; private static final int INVESTIGATION_IDS_COLUMN = 16; private static final int LAB_REPORT_IDS_COLUMN = 17; diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientRowMapper.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientRowMapper.java index 47a5c2a887..1d6df7e79e 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientRowMapper.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientRowMapper.java @@ -51,9 +51,9 @@ public SearchablePatient mapRow(final ResultSet resultSet, int rowNum) throws SQ String morbidityReportIds = resultSet.getString(columns.morbidityReportIds()); String treatmentIds = resultSet.getString(columns.treatmentIds()); String vaccinationIds = resultSet.getString(columns.vaccinationIds()); + String stateCaseIds = resultSet.getString(columns.stateCaseIds()); String abcsCaseIds = resultSet.getString(columns.abcsCaseIds()); String cityCaseIds = resultSet.getString(columns.cityCaseIds()); - String stateCaseIds = resultSet.getString(columns.stateCaseIds()); String accessionIds = resultSet.getString(columns.accessionIds()); String investigationIds = resultSet.getString(columns.investigationIds()); String labReportIds = resultSet.getString(columns.labReportIds()); diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/AbcCaseIdentifier.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/AbcCaseIdentifier.java new file mode 100644 index 0000000000..fe834e8eb3 --- /dev/null +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/AbcCaseIdentifier.java @@ -0,0 +1,5 @@ +package gov.cdc.nbs.event.investigation; + +public record AbcCaseIdentifier(String identifier) { + +} diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java index 73145ceb47..da82059cb1 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java @@ -34,6 +34,8 @@ public class InvestigationMother { private final Available available; private final Active active; + private final Active activeAbcCase; + private final Active activeStateCase; private final PatientMother patientMother; private final TestInvestigationCleaner cleaner; @@ -45,6 +47,8 @@ public class InvestigationMother { final Available available, final Active active, final PatientMother patientMother, + final Active activeAbcCase, + final Active activeStateCase, final TestInvestigationCleaner cleaner) { this.idGenerator = idGenerator; this.settings = settings; @@ -53,6 +57,8 @@ public class InvestigationMother { this.available = available; this.active = active; this.patientMother = patientMother; + this.activeAbcCase = activeAbcCase; + this.activeStateCase = activeStateCase; this.cleaner = cleaner; } @@ -221,16 +227,18 @@ void reported(final InvestigationIdentifier identifier, final Instant on) { void relatedToABCSCase( final InvestigationIdentifier identifier, - final String number) { + final String abcCaseId) { PublicHealthCase investigation = managed(identifier); Act act = investigation.act(); ActId relatedTo = new ActId(new ActIdId(act.getId(), 2)); relatedTo.setTypeCd("STATE"); - relatedTo.setRootExtensionTxt(number); + relatedTo.setAssigningAuthorityCd("ABCS"); + relatedTo.setRootExtensionTxt(abcCaseId); act.addIdentifier(relatedTo); + activeAbcCase.active(new AbcCaseIdentifier(abcCaseId)); } @@ -251,17 +259,19 @@ void relatedToCountyCase( void relatedToStateCase( final InvestigationIdentifier identifier, - final String number) { + final String stateCaseId) { PublicHealthCase investigation = managed(identifier); Act act = investigation.act(); ActId relatedTo = new ActId(new ActIdId(act.getId(), 1)); relatedTo.setTypeCd("STATE"); - relatedTo.setRootExtensionTxt(number); + relatedTo.setRootExtensionTxt(stateCaseId); act.addIdentifier(relatedTo); + activeStateCase.active(new StateCaseIdentifier(stateCaseId)); + } void relatedToOutbreak( diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSteps.java index f685518524..6ff07a2d8c 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSteps.java @@ -32,8 +32,7 @@ public InvestigationSteps( final Active activeProvider, final Active activeInvestigation, final InvestigationMother mother, - final ConceptParameterResolver resolver - ) { + final ConceptParameterResolver resolver) { this.activePatient = activePatient; this.activeJurisdiction = activeJurisdiction; this.activeProgramArea = activeProgramArea; @@ -54,9 +53,7 @@ public void the_patient_is_a_subject_of_an_investigation() { p -> mother.create( p, activeJurisdiction.active(), - activeProgramArea.active() - ) - ); + activeProgramArea.active())); } @Given("the patient is a subject of {int} investigations") @@ -69,23 +66,19 @@ public void the_patient_is_a_subject_N_investigation(final int n) { mother.create( patient, jurisdiction, - programArea - ); + programArea); } } @Given("the investigation is for {programArea} within {jurisdiction}") public void the_investigation_is_within( final ProgramAreaIdentifier programArea, - final JurisdictionIdentifier jurisdiction - ) { + final JurisdictionIdentifier jurisdiction) { activeInvestigation.maybeActive().ifPresent( investigation -> mother.within( investigation, programArea, - jurisdiction - ) - ); + jurisdiction)); } @Given("the investigation is for the {condition} condition") @@ -172,7 +165,7 @@ public void the_investigation_is_related_to_state_case(final String number) { .ifPresent(active -> mother.relatedToStateCase(active, number)); } - @Given("the investigation is related to ABCS Case {string}") + @Given("the investigation is related to ABCs Case {string}") public void the_investigation_is_related_to_ABCS_case(final String number) { this.activeInvestigation.maybeActive() .ifPresent(active -> mother.relatedToABCSCase(active, number)); @@ -190,9 +183,7 @@ public void the_investigation_was_investigated_by_the_provider() { .ifPresent( active -> mother.investigatedBy( active, - activeProvider.active() - ) - ); + activeProvider.active())); } @Given("the investigation was reported by the {organization} facility") @@ -207,15 +198,12 @@ public void the_investigation_was_reported_by_the_provider() { .ifPresent( active -> mother.reportedBy( active, - activeProvider.active() - ) - ); + activeProvider.active())); } @Given("the investigation is related to the {outbreak} outbreak") public void the_investigation_is_related_to_the_outbreak(final String outbreak) { this.activeInvestigation.maybeActive().ifPresent( - active -> mother.relatedToOutbreak(active, outbreak) - ); + active -> mother.relatedToOutbreak(active, outbreak)); } } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSupportConfiguration.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSupportConfiguration.java index 1fa488afae..ab3953de44 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSupportConfiguration.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSupportConfiguration.java @@ -18,4 +18,14 @@ Available availableInvestigation() { return new Available<>(); } + @Bean + Active activeAbcCaseId() { + return new Active<>(); + } + + @Bean + Active activeStateCaseId() { + return new Active<>(); + } + } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/StateCaseIdentifier.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/StateCaseIdentifier.java new file mode 100644 index 0000000000..3170446202 --- /dev/null +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/StateCaseIdentifier.java @@ -0,0 +1,5 @@ +package gov.cdc.nbs.event.investigation; + +public record StateCaseIdentifier(String identifier) { + +} diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java index a6e763b8e5..f9123812ec 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java @@ -1,6 +1,8 @@ package gov.cdc.nbs.patient.search; import gov.cdc.nbs.event.document.CaseReportIdentifier; +import gov.cdc.nbs.event.investigation.AbcCaseIdentifier; +import gov.cdc.nbs.event.investigation.StateCaseIdentifier; import gov.cdc.nbs.event.report.lab.LabReportIdentifier; import gov.cdc.nbs.event.report.morbidity.MorbidityReportIdentifier; import gov.cdc.nbs.testing.support.Active; @@ -11,15 +13,21 @@ public class PatientSearchEventIdSteps { private final Active activeMorbidityReport; private final Active activeLabReport; private final Active activeCaseReport; + private final Active activeStateCase; + private final Active activeAbcCase; PatientSearchEventIdSteps( final Active activeCriteria, final Active activeLabReport, final Active activeCaseReport, + final Active activeStateCase, + final Active activeAbcCase, final Active activeMorbidityReport) { this.activeCriteria = activeCriteria; this.activeMorbidityReport = activeMorbidityReport; this.activeLabReport = activeLabReport; + this.activeStateCase = activeStateCase; + this.activeAbcCase = activeAbcCase; this.activeCaseReport = activeCaseReport; } @@ -39,6 +47,22 @@ public void i_would_like_to_search_for_a_patient_using_the_document_ID() { identifier -> this.activeCriteria.active(criteria -> criteria.withDocumentId(identifier))); } + @Given("I would like to search for a patient using the State Case ID") + public void i_would_like_to_search_for_a_patient_using_the_state_case_ID() { + this.activeStateCase.maybeActive() + .map(StateCaseIdentifier::identifier) + .ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withStateCaseId(identifier))); + } + + @Given("I would like to search for a patient using the ABC Case ID") + public void i_would_like_to_search_for_a_patient_using_the_abc_case_ID() { + this.activeAbcCase.maybeActive() + .map(AbcCaseIdentifier::identifier) + .ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withAbcCaseId(identifier))); + } + @Given("I would like to search for a patient using the Lab Report ID") public void i_would_like_to_search_for_a_patient_using_the_lab_report_ID() { this.activeLabReport.maybeActive() diff --git a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature index 4c13c050d8..66d6bf03d5 100644 --- a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature +++ b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature @@ -4,10 +4,9 @@ Feature: Patient Search by Event ID Background: Given I am logged into NBS And I can "find" any "patient" - And I have a patient Scenario: I can find a patient with a Morbidity Report ID - Given I have another patient + Given I have a patient And the patient has a Morbidity Report And patients are available for search And I would like to search for a patient using the Morbidity Report ID @@ -15,9 +14,8 @@ Feature: Patient Search by Event ID Then the patient is in the search results And there is only one patient search result - Scenario: I can find a patient with a Document ID - Given I have another patient + Given I have a patient And the patient has a Case Report And patients are available for search And I would like to search for a patient using the Document ID @@ -25,8 +23,29 @@ Feature: Patient Search by Event ID Then the patient is in the search results And there is only one patient search result + Scenario: I can find a patient with a State Case ID + Given I have a patient + And the patient is a subject of an investigation + And the investigation is related to State Case "200021" + And patients are available for search + And I would like to search for a patient using the State Case ID + When I search for patients + Then the patient is in the search results + And there is only one patient search result + + @patient-search-event-abc + Scenario: I can find a patient with a ABC Case ID + Given I have a patient + And the patient is a subject of an investigation + And the investigation is related to ABCs Case "1013675" + And patients are available for search + And I would like to search for a patient using the ABC Case ID + When I search for patients + Then the patient is in the search results + And there is only one patient search result + Scenario: I can find a patient with a Lab Report ID - Given I have another patient + Given I have a patient And the patient has a Lab Report And patients are available for search And I would like to search for a patient using the Lab Report ID diff --git a/apps/modernization-api/src/test/resources/features/search/investigation/InvestigationSearch.feature b/apps/modernization-api/src/test/resources/features/search/investigation/InvestigationSearch.feature index 9027f5c09c..b14f464643 100644 --- a/apps/modernization-api/src/test/resources/features/search/investigation/InvestigationSearch.feature +++ b/apps/modernization-api/src/test/resources/features/search/investigation/InvestigationSearch.feature @@ -234,9 +234,9 @@ Feature: Investigation search And there is only one investigation search result Scenario: I can find investigations related to Active Bacterial Core Surveillance cases - Given the investigation is related to ABCS Case "1013673" + Given the investigation is related to ABCs Case "1013673" And the investigation is available for search - And I want to find investigations for the ABCS Case "1013673" + And I want to find investigations for the ABCs Case "1013673" When I search for investigations Then the Investigation search results contain the Investigation And there is only one investigation search result From 98a7a58ee338da581b980a9a4d0ed56d896deeb7 Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Fri, 25 Oct 2024 11:11:04 -0400 Subject: [PATCH 05/14] City ID --- .../patient/search/PatientEventQueryResolver.java | 8 ++++++++ .../gov/cdc/nbs/patient/search/PatientFilter.java | 9 +++++++++ .../investigation/CityCountyCaseIdentifier.java | 5 +++++ .../nbs/event/investigation/InvestigationMother.java | 8 ++++++-- .../InvestigationSupportConfiguration.java | 5 +++++ .../patient/search/PatientSearchEventIdSteps.java | 12 ++++++++++++ .../patient/search/PatientSearch.eventId.feature | 11 ++++++++++- 7 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/CityCountyCaseIdentifier.java diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java index 72f267b2b2..b96855b751 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java @@ -13,6 +13,7 @@ class PatientEventQueryResolver { private static final String DOCUMENT_ID = "document_ids"; private static final String STATE_CASE_ID = "state_case_ids"; private static final String ABC_CASE_ID = "abcs_case_ids"; + private static final String CITY_COUNTY_CASE_ID = "city_case_ids"; private static final String LAB_REPORT_ID = "lab_report_ids"; Stream resolve(final PatientFilter criteria) { @@ -21,6 +22,7 @@ Stream resolve(final PatientFilter criteria) { applyDocumentIdCriteria(criteria), applyStateCaseIdCriteria(criteria), applyAbcCaseIdCriteria(criteria), + applyCityCountyCaseIdCriteria(criteria), applyLabIdCriteria(criteria)) .flatMap(Optional::stream) .map(QueryVariant::_toQuery); @@ -46,6 +48,12 @@ private Optional applyAbcCaseIdCriteria(final PatientFilter criter .map(identifier -> MatchQuery.of(match -> match.field(ABC_CASE_ID).query(criteria.getAbcCaseId()))); } + private Optional applyCityCountyCaseIdCriteria(final PatientFilter criteria) { + return criteria.maybeCityCountyCaseId() + .map(identifier -> MatchQuery + .of(match -> match.field(CITY_COUNTY_CASE_ID).query(criteria.getCityCountyCaseId()))); + } + private Optional applyLabIdCriteria(final PatientFilter criteria) { return criteria.maybeLabReportId() diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java index e4ce3f8e25..4be336f705 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java @@ -151,6 +151,15 @@ public Optional maybeAbcCaseId() { return Optional.ofNullable(abcCaseId); } + public PatientFilter withCityCountyCaseId(final String identifier) { + this.cityCountyCaseId = identifier; + return this; + } + + public Optional maybeCityCountyCaseId() { + return Optional.ofNullable(cityCountyCaseId); + } + public PatientFilter withLabReportId(final String identifier) { this.labReportId = identifier; return this; diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/CityCountyCaseIdentifier.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/CityCountyCaseIdentifier.java new file mode 100644 index 0000000000..01d114c82e --- /dev/null +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/CityCountyCaseIdentifier.java @@ -0,0 +1,5 @@ +package gov.cdc.nbs.event.investigation; + +public record CityCountyCaseIdentifier(String identifier) { + +} diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java index da82059cb1..a1dcd6bc4e 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java @@ -36,6 +36,7 @@ public class InvestigationMother { private final Active active; private final Active activeAbcCase; private final Active activeStateCase; + private final Active activeCityCountyCase; private final PatientMother patientMother; private final TestInvestigationCleaner cleaner; @@ -49,6 +50,7 @@ public class InvestigationMother { final PatientMother patientMother, final Active activeAbcCase, final Active activeStateCase, + final Active activeCityCountyCase, final TestInvestigationCleaner cleaner) { this.idGenerator = idGenerator; this.settings = settings; @@ -59,6 +61,7 @@ public class InvestigationMother { this.patientMother = patientMother; this.activeAbcCase = activeAbcCase; this.activeStateCase = activeStateCase; + this.activeCityCountyCase = activeCityCountyCase; this.cleaner = cleaner; } @@ -244,16 +247,17 @@ void relatedToABCSCase( void relatedToCountyCase( final InvestigationIdentifier identifier, - final String number) { + final String cityCountyCaseId) { PublicHealthCase investigation = managed(identifier); Act act = investigation.act(); ActId relatedTo = new ActId(new ActIdId(act.getId(), 2)); relatedTo.setTypeCd("CITY"); - relatedTo.setRootExtensionTxt(number); + relatedTo.setRootExtensionTxt(cityCountyCaseId); act.addIdentifier(relatedTo); + activeCityCountyCase.active(new CityCountyCaseIdentifier(cityCountyCaseId)); } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSupportConfiguration.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSupportConfiguration.java index ab3953de44..97e371b64f 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSupportConfiguration.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationSupportConfiguration.java @@ -28,4 +28,9 @@ Active activeStateCaseId() { return new Active<>(); } + @Bean + Active activeCityCountyCaseId() { + return new Active<>(); + } + } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java index f9123812ec..cce8f70849 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java @@ -2,6 +2,7 @@ import gov.cdc.nbs.event.document.CaseReportIdentifier; import gov.cdc.nbs.event.investigation.AbcCaseIdentifier; +import gov.cdc.nbs.event.investigation.CityCountyCaseIdentifier; import gov.cdc.nbs.event.investigation.StateCaseIdentifier; import gov.cdc.nbs.event.report.lab.LabReportIdentifier; import gov.cdc.nbs.event.report.morbidity.MorbidityReportIdentifier; @@ -15,6 +16,7 @@ public class PatientSearchEventIdSteps { private final Active activeCaseReport; private final Active activeStateCase; private final Active activeAbcCase; + private final Active activeCityCountyCase; PatientSearchEventIdSteps( final Active activeCriteria, @@ -22,12 +24,14 @@ public class PatientSearchEventIdSteps { final Active activeCaseReport, final Active activeStateCase, final Active activeAbcCase, + final Active activeCityCountyCase, final Active activeMorbidityReport) { this.activeCriteria = activeCriteria; this.activeMorbidityReport = activeMorbidityReport; this.activeLabReport = activeLabReport; this.activeStateCase = activeStateCase; this.activeAbcCase = activeAbcCase; + this.activeCityCountyCase = activeCityCountyCase; this.activeCaseReport = activeCaseReport; } @@ -63,6 +67,14 @@ public void i_would_like_to_search_for_a_patient_using_the_abc_case_ID() { identifier -> this.activeCriteria.active(criteria -> criteria.withAbcCaseId(identifier))); } + @Given("I would like to search for a patient using the County Case ID") + public void i_would_like_to_search_for_a_patient_using_the_county_case_ID() { + this.activeCityCountyCase.maybeActive() + .map(CityCountyCaseIdentifier::identifier) + .ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withCityCountyCaseId(identifier))); + } + @Given("I would like to search for a patient using the Lab Report ID") public void i_would_like_to_search_for_a_patient_using_the_lab_report_ID() { this.activeLabReport.maybeActive() diff --git a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature index 66d6bf03d5..a8c4a8f8d8 100644 --- a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature +++ b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature @@ -33,7 +33,6 @@ Feature: Patient Search by Event ID Then the patient is in the search results And there is only one patient search result - @patient-search-event-abc Scenario: I can find a patient with a ABC Case ID Given I have a patient And the patient is a subject of an investigation @@ -44,6 +43,16 @@ Feature: Patient Search by Event ID Then the patient is in the search results And there is only one patient search result + Scenario: I can find a patient with a County Case ID + Given I have a patient + And the patient is a subject of an investigation + And the investigation is related to County Case "2023657" + And patients are available for search + And I would like to search for a patient using the County Case ID + When I search for patients + Then the patient is in the search results + And there is only one patient search result + Scenario: I can find a patient with a Lab Report ID Given I have a patient And the patient has a Lab Report From 6222b1d3cb02d52392ad347d3d3485142b939805 Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Fri, 25 Oct 2024 11:46:13 -0400 Subject: [PATCH 06/14] Notification Id, Treatment Id --- .../search/PatientEventQueryResolver.java | 16 +++++++++++++- .../cdc/nbs/patient/search/PatientFilter.java | 18 +++++++++++++++ .../indexing/SearchablePatientFinder.java | 4 ++-- .../search/PatientSearchEventIdSteps.java | 22 +++++++++++++++++++ .../search/PatientSearch.eventId.feature | 20 +++++++++++++++++ 5 files changed, 77 insertions(+), 3 deletions(-) diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java index b96855b751..fc3ac726ca 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java @@ -14,6 +14,8 @@ class PatientEventQueryResolver { private static final String STATE_CASE_ID = "state_case_ids"; private static final String ABC_CASE_ID = "abcs_case_ids"; private static final String CITY_COUNTY_CASE_ID = "city_case_ids"; + private static final String NOTIFICATION_ID = "notification_ids"; + private static final String TREATMENT_ID = "treatment_ids"; private static final String LAB_REPORT_ID = "lab_report_ids"; Stream resolve(final PatientFilter criteria) { @@ -23,6 +25,8 @@ Stream resolve(final PatientFilter criteria) { applyStateCaseIdCriteria(criteria), applyAbcCaseIdCriteria(criteria), applyCityCountyCaseIdCriteria(criteria), + applyNotificationIdCriteria(criteria), + applyTreatmentIdCriteria(criteria), applyLabIdCriteria(criteria)) .flatMap(Optional::stream) .map(QueryVariant::_toQuery); @@ -54,11 +58,21 @@ private Optional applyCityCountyCaseIdCriteria(final PatientFilter .of(match -> match.field(CITY_COUNTY_CASE_ID).query(criteria.getCityCountyCaseId()))); } + private Optional applyNotificationIdCriteria(final PatientFilter criteria) { + return criteria.maybeNotificationId() + .map(identifier -> MatchQuery + .of(match -> match.field(NOTIFICATION_ID).query(criteria.getNotificationId()))); + } + + private Optional applyTreatmentIdCriteria(final PatientFilter criteria) { + return criteria.maybeTreatmentId() + .map(identifier -> MatchQuery + .of(match -> match.field(TREATMENT_ID).query(criteria.getTreatmentId()))); + } private Optional applyLabIdCriteria(final PatientFilter criteria) { return criteria.maybeLabReportId() .map(identifier -> MatchQuery.of(match -> match.field(LAB_REPORT_ID).query(criteria.getLabReportId()))); } - } diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java index 4be336f705..addeab61c7 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java @@ -160,6 +160,24 @@ public Optional maybeCityCountyCaseId() { return Optional.ofNullable(cityCountyCaseId); } + public PatientFilter withNotificationId(final String identifier) { + this.notificationId = identifier; + return this; + } + + public Optional maybeNotificationId() { + return Optional.ofNullable(notificationId); + } + + public PatientFilter withTreatmentId(final String identifier) { + this.treatmentId = identifier; + return this; + } + + public Optional maybeTreatmentId() { + return Optional.ofNullable(treatmentId); + } + public PatientFilter withLabReportId(final String identifier) { this.labReportId = identifier; return this; diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientFinder.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientFinder.java index c77a334873..69f9011839 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientFinder.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/indexing/SearchablePatientFinder.java @@ -245,10 +245,10 @@ FOR XML PATH('') private static final int STATE_CASE_IDS_COLUMN = 12; private static final int ABCS_CASE_IDS_COLUMN = 13; private static final int CITY_CASE_IDS_COLUMN = 14; - private static final int ACCESSION_IDS_COLUMN = 15; + private static final int NOTIFICATION_IDS_COLUMN = 15; private static final int INVESTIGATION_IDS_COLUMN = 16; private static final int LAB_REPORT_IDS_COLUMN = 17; - private static final int NOTIFICATION_IDS_COLUMN = 18; + private static final int ACCESSION_IDS_COLUMN = 18; private final JdbcTemplate template; private final SearchablePatientRowMapper mapper; diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java index cce8f70849..90acb94276 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java @@ -3,9 +3,11 @@ import gov.cdc.nbs.event.document.CaseReportIdentifier; import gov.cdc.nbs.event.investigation.AbcCaseIdentifier; import gov.cdc.nbs.event.investigation.CityCountyCaseIdentifier; +import gov.cdc.nbs.event.investigation.NotificationIdentifier; import gov.cdc.nbs.event.investigation.StateCaseIdentifier; import gov.cdc.nbs.event.report.lab.LabReportIdentifier; import gov.cdc.nbs.event.report.morbidity.MorbidityReportIdentifier; +import gov.cdc.nbs.patient.treatment.TestTreatments; import gov.cdc.nbs.testing.support.Active; import io.cucumber.java.en.Given; @@ -17,6 +19,8 @@ public class PatientSearchEventIdSteps { private final Active activeStateCase; private final Active activeAbcCase; private final Active activeCityCountyCase; + private final Active activeNotification; + private final TestTreatments treatments; PatientSearchEventIdSteps( final Active activeCriteria, @@ -25,6 +29,8 @@ public class PatientSearchEventIdSteps { final Active activeStateCase, final Active activeAbcCase, final Active activeCityCountyCase, + final Active activeNotification, + final TestTreatments treatments, final Active activeMorbidityReport) { this.activeCriteria = activeCriteria; this.activeMorbidityReport = activeMorbidityReport; @@ -32,6 +38,8 @@ public class PatientSearchEventIdSteps { this.activeStateCase = activeStateCase; this.activeAbcCase = activeAbcCase; this.activeCityCountyCase = activeCityCountyCase; + this.activeNotification = activeNotification; + this.treatments = treatments; this.activeCaseReport = activeCaseReport; } @@ -75,6 +83,20 @@ public void i_would_like_to_search_for_a_patient_using_the_county_case_ID() { identifier -> this.activeCriteria.active(criteria -> criteria.withCityCountyCaseId(identifier))); } + @Given("I would like to search for a patient using the Notification ID") + public void i_would_like_to_search_for_a_patient_using_the_notification_ID() { + this.activeNotification.maybeActive() + .map(NotificationIdentifier::local) + .ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withNotificationId(identifier.toString()))); + } + + @Given("I would like to search for a patient using the Treatment ID") + public void i_would_like_to_search_for_a_patient_using_the_treatment_ID() { + this.treatments.maybeOne().ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withTreatmentId(identifier.toString()))); + } + @Given("I would like to search for a patient using the Lab Report ID") public void i_would_like_to_search_for_a_patient_using_the_lab_report_ID() { this.activeLabReport.maybeActive() diff --git a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature index a8c4a8f8d8..010b3509e3 100644 --- a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature +++ b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature @@ -53,6 +53,26 @@ Feature: Patient Search by Event ID Then the patient is in the search results And there is only one patient search result + Scenario: I can find a patient with a Notification ID + Given I have a patient + And the patient is a subject of an investigation + And the investigation has a notification status of APPROVED + And patients are available for search + And I would like to search for a patient using the Notification ID + When I search for patients + Then the patient is in the search results + And there is only one patient search result + + Scenario: I can find a patient with a Treatment ID + Given I have a patient + And the patient is a subject of an investigation + And the patient is a subject of a Treatment + And patients are available for search + And I would like to search for a patient using the Treatment ID + When I search for patients + Then the patient is in the search results + And there is only one patient search result + Scenario: I can find a patient with a Lab Report ID Given I have a patient And the patient has a Lab Report From edb10b2612c0b5c5a72b09f4f317a2fcf6a7b89c Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Fri, 25 Oct 2024 12:32:32 -0400 Subject: [PATCH 07/14] Fix for treatment id --- .../search/PatientSearchEventIdSteps.java | 16 +++++++++------- .../treatment/TreatmentConfiguration.java | 14 ++++++++++++++ .../patient/treatment/TreatmentIdentifier.java | 5 +++++ .../nbs/patient/treatment/TreatmentMother.java | 8 ++++++-- 4 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentConfiguration.java create mode 100644 apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentIdentifier.java diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java index 90acb94276..23ded3ce11 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java @@ -7,7 +7,7 @@ import gov.cdc.nbs.event.investigation.StateCaseIdentifier; import gov.cdc.nbs.event.report.lab.LabReportIdentifier; import gov.cdc.nbs.event.report.morbidity.MorbidityReportIdentifier; -import gov.cdc.nbs.patient.treatment.TestTreatments; +import gov.cdc.nbs.patient.treatment.TreatmentIdentifier; import gov.cdc.nbs.testing.support.Active; import io.cucumber.java.en.Given; @@ -20,7 +20,7 @@ public class PatientSearchEventIdSteps { private final Active activeAbcCase; private final Active activeCityCountyCase; private final Active activeNotification; - private final TestTreatments treatments; + private final Active activeTreatment; PatientSearchEventIdSteps( final Active activeCriteria, @@ -30,7 +30,7 @@ public class PatientSearchEventIdSteps { final Active activeAbcCase, final Active activeCityCountyCase, final Active activeNotification, - final TestTreatments treatments, + final Active activeTreatment, final Active activeMorbidityReport) { this.activeCriteria = activeCriteria; this.activeMorbidityReport = activeMorbidityReport; @@ -39,7 +39,7 @@ public class PatientSearchEventIdSteps { this.activeAbcCase = activeAbcCase; this.activeCityCountyCase = activeCityCountyCase; this.activeNotification = activeNotification; - this.treatments = treatments; + this.activeTreatment = activeTreatment; this.activeCaseReport = activeCaseReport; } @@ -88,13 +88,15 @@ public void i_would_like_to_search_for_a_patient_using_the_notification_ID() { this.activeNotification.maybeActive() .map(NotificationIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withNotificationId(identifier.toString()))); + identifier -> this.activeCriteria.active(criteria -> criteria.withNotificationId(identifier))); } @Given("I would like to search for a patient using the Treatment ID") public void i_would_like_to_search_for_a_patient_using_the_treatment_ID() { - this.treatments.maybeOne().ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withTreatmentId(identifier.toString()))); + this.activeTreatment.maybeActive() + .map(TreatmentIdentifier::local) + .ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withTreatmentId(identifier))); } @Given("I would like to search for a patient using the Lab Report ID") diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentConfiguration.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentConfiguration.java new file mode 100644 index 0000000000..65044ad4cb --- /dev/null +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentConfiguration.java @@ -0,0 +1,14 @@ +package gov.cdc.nbs.patient.treatment; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import gov.cdc.nbs.testing.support.Active; + +@Configuration +class TreatmentConfiguration { + + @Bean + Active activeTreatment() { + return new Active<>(); + } +} diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentIdentifier.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentIdentifier.java new file mode 100644 index 0000000000..c41c445b8a --- /dev/null +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentIdentifier.java @@ -0,0 +1,5 @@ +package gov.cdc.nbs.patient.treatment; + +public record TreatmentIdentifier(Long identifier, String local) { + +} diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentMother.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentMother.java index b656e22da6..775472c6a7 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentMother.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/treatment/TreatmentMother.java @@ -8,6 +8,7 @@ import gov.cdc.nbs.entity.odse.TreatmentAdministered; import gov.cdc.nbs.identity.MotherSettings; import gov.cdc.nbs.testing.identity.SequentialIdentityGenerator; +import gov.cdc.nbs.testing.support.Active; import gov.cdc.nbs.support.util.RandomUtil; import org.springframework.stereotype.Component; @@ -26,19 +27,22 @@ class TreatmentMother { private final TestTreatmentCleaner cleaner; private final TestTreatments treatments; + private final Active activeTreatment; TreatmentMother( final MotherSettings settings, final SequentialIdentityGenerator idGenerator, final EntityManager entityManager, final TestTreatmentCleaner cleaner, - final TestTreatments treatments + final TestTreatments treatments, + final Active activeTreatment ) { this.settings = settings; this.idGenerator = idGenerator; this.entityManager = entityManager; this.cleaner = cleaner; this.treatments = treatments; + this.activeTreatment = activeTreatment; } void reset() { @@ -74,7 +78,7 @@ Treatment treated(final long patient, final long investigation) { this.entityManager.persist(treatment); this.treatments.available(identifier); - + this.activeTreatment.active(new TreatmentIdentifier(identifier, localId)); return treatment; } From 2318d0ffa277e125887494ad4a93b49a256bc207 Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Fri, 25 Oct 2024 12:41:00 -0400 Subject: [PATCH 08/14] Vaccine ID --- .../patient/search/PatientEventQueryResolver.java | 8 ++++++++ .../gov/cdc/nbs/patient/search/PatientFilter.java | 9 +++++++++ .../vaccination/VaccinationConfiguration.java | 14 ++++++++++++++ .../profile/vaccination/VaccinationIdentifier.java | 5 +++++ .../profile/vaccination/VaccinationMother.java | 7 ++++++- .../patient/search/PatientSearchEventIdSteps.java | 12 ++++++++++++ .../patient/search/PatientSearch.eventId.feature | 9 +++++++++ 7 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationConfiguration.java create mode 100644 apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationIdentifier.java diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java index fc3ac726ca..8881b4cdac 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java @@ -16,6 +16,7 @@ class PatientEventQueryResolver { private static final String CITY_COUNTY_CASE_ID = "city_case_ids"; private static final String NOTIFICATION_ID = "notification_ids"; private static final String TREATMENT_ID = "treatment_ids"; + private static final String VACCINATION_ID = "vaccination_ids"; private static final String LAB_REPORT_ID = "lab_report_ids"; Stream resolve(final PatientFilter criteria) { @@ -27,6 +28,7 @@ Stream resolve(final PatientFilter criteria) { applyCityCountyCaseIdCriteria(criteria), applyNotificationIdCriteria(criteria), applyTreatmentIdCriteria(criteria), + applyVaccinationIdCriteria(criteria), applyLabIdCriteria(criteria)) .flatMap(Optional::stream) .map(QueryVariant::_toQuery); @@ -70,6 +72,12 @@ private Optional applyTreatmentIdCriteria(final PatientFilter crit .of(match -> match.field(TREATMENT_ID).query(criteria.getTreatmentId()))); } + private Optional applyVaccinationIdCriteria(final PatientFilter criteria) { + return criteria.maybeVaccinationId() + .map(identifier -> MatchQuery + .of(match -> match.field(VACCINATION_ID).query(criteria.getVaccinationId()))); + } + private Optional applyLabIdCriteria(final PatientFilter criteria) { return criteria.maybeLabReportId() .map(identifier -> MatchQuery.of(match -> match.field(LAB_REPORT_ID).query(criteria.getLabReportId()))); diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java index addeab61c7..43002461be 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java @@ -178,6 +178,15 @@ public Optional maybeTreatmentId() { return Optional.ofNullable(treatmentId); } + public PatientFilter withVaccinationId(final String identifier) { + this.vaccinationId = identifier; + return this; + } + + public Optional maybeVaccinationId() { + return Optional.ofNullable(vaccinationId); + } + public PatientFilter withLabReportId(final String identifier) { this.labReportId = identifier; return this; diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationConfiguration.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationConfiguration.java new file mode 100644 index 0000000000..502effe179 --- /dev/null +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationConfiguration.java @@ -0,0 +1,14 @@ +package gov.cdc.nbs.patient.profile.vaccination; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import gov.cdc.nbs.testing.support.Active; + +@Configuration +public class VaccinationConfiguration { + + @Bean + public Active activeVaccination() { + return new Active<>(); + } +} diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationIdentifier.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationIdentifier.java new file mode 100644 index 0000000000..0f160e62a0 --- /dev/null +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationIdentifier.java @@ -0,0 +1,5 @@ +package gov.cdc.nbs.patient.profile.vaccination; + +public record VaccinationIdentifier(Long identifier, String local) { + +} diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationMother.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationMother.java index 5bdb4cf86e..c8cd4f48f5 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationMother.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/profile/vaccination/VaccinationMother.java @@ -7,6 +7,7 @@ import gov.cdc.nbs.entity.odse.ParticipationId; import gov.cdc.nbs.identity.MotherSettings; import gov.cdc.nbs.testing.identity.SequentialIdentityGenerator; +import gov.cdc.nbs.testing.support.Active; import gov.cdc.nbs.support.util.RandomUtil; import org.springframework.stereotype.Component; @@ -21,6 +22,7 @@ class VaccinationMother { private final MotherSettings settings; private final SequentialIdentityGenerator idGenerator; private final EntityManager entityManager; + private final Active activeVaccination; private final TestVaccinationCleaner cleaner; private final TestVaccinations vaccinations; @@ -29,13 +31,15 @@ class VaccinationMother { final SequentialIdentityGenerator idGenerator, final EntityManager entityManager, final TestVaccinationCleaner cleaner, - final TestVaccinations vaccinations + final TestVaccinations vaccinations, + final Active activeVaccination ) { this.settings = settings; this.idGenerator = idGenerator; this.entityManager = entityManager; this.cleaner = cleaner; this.vaccinations = vaccinations; + this.activeVaccination = activeVaccination; } void reset() { @@ -68,6 +72,7 @@ Intervention vaccinate(final long patient) { entityManager.persist(vaccination); this.vaccinations.available(vaccination.getId()); + activeVaccination.active(new VaccinationIdentifier(identifier, local)); return vaccination; } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java index 23ded3ce11..595d945da7 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java @@ -7,6 +7,7 @@ import gov.cdc.nbs.event.investigation.StateCaseIdentifier; import gov.cdc.nbs.event.report.lab.LabReportIdentifier; import gov.cdc.nbs.event.report.morbidity.MorbidityReportIdentifier; +import gov.cdc.nbs.patient.profile.vaccination.VaccinationIdentifier; import gov.cdc.nbs.patient.treatment.TreatmentIdentifier; import gov.cdc.nbs.testing.support.Active; import io.cucumber.java.en.Given; @@ -20,6 +21,7 @@ public class PatientSearchEventIdSteps { private final Active activeAbcCase; private final Active activeCityCountyCase; private final Active activeNotification; + private final Active activeVaccination; private final Active activeTreatment; PatientSearchEventIdSteps( @@ -31,6 +33,7 @@ public class PatientSearchEventIdSteps { final Active activeCityCountyCase, final Active activeNotification, final Active activeTreatment, + final Active activeVaccination, final Active activeMorbidityReport) { this.activeCriteria = activeCriteria; this.activeMorbidityReport = activeMorbidityReport; @@ -40,6 +43,7 @@ public class PatientSearchEventIdSteps { this.activeCityCountyCase = activeCityCountyCase; this.activeNotification = activeNotification; this.activeTreatment = activeTreatment; + this.activeVaccination = activeVaccination; this.activeCaseReport = activeCaseReport; } @@ -99,6 +103,14 @@ public void i_would_like_to_search_for_a_patient_using_the_treatment_ID() { identifier -> this.activeCriteria.active(criteria -> criteria.withTreatmentId(identifier))); } + @Given("I would like to search for a patient using the Vaccination ID") + public void i_would_like_to_search_for_a_patient_using_the_vaccination_ID() { + this.activeVaccination.maybeActive() + .map(VaccinationIdentifier::local) + .ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withVaccinationId(identifier))); + } + @Given("I would like to search for a patient using the Lab Report ID") public void i_would_like_to_search_for_a_patient_using_the_lab_report_ID() { this.activeLabReport.maybeActive() diff --git a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature index 010b3509e3..d954179769 100644 --- a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature +++ b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature @@ -73,6 +73,15 @@ Feature: Patient Search by Event ID Then the patient is in the search results And there is only one patient search result + Scenario: I can find a patient with a Vaccination ID + Given I have a patient + And the patient is vaccinated + And patients are available for search + And I would like to search for a patient using the Vaccination ID + When I search for patients + Then the patient is in the search results + And there is only one patient search result + Scenario: I can find a patient with a Lab Report ID Given I have a patient And the patient has a Lab Report From ae916c884f050de8a1a1480c4aa93af550050036 Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Fri, 25 Oct 2024 12:59:27 -0400 Subject: [PATCH 09/14] Investigation Ids --- .../search/PatientEventQueryResolver.java | 8 ++++++++ .../cdc/nbs/patient/search/PatientFilter.java | 10 ++++++++++ .../resources/graphql/patient-search.graphqls | 1 + .../event/investigation/AbcCaseIdentifier.java | 2 +- .../CityCountyCaseIdentifier.java | 2 +- .../investigation/InvestigationMother.java | 6 +++--- .../investigation/StateCaseIdentifier.java | 2 +- .../search/PatientSearchEventIdSteps.java | 18 +++++++++++++++--- .../search/PatientSearch.eventId.feature | 9 +++++++++ .../src/generated/graphql/schema.ts | 1 + .../src/generated/schema.graphqls | 1 + 11 files changed, 51 insertions(+), 9 deletions(-) diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java index 8881b4cdac..6fe158ae5a 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java @@ -17,6 +17,7 @@ class PatientEventQueryResolver { private static final String NOTIFICATION_ID = "notification_ids"; private static final String TREATMENT_ID = "treatment_ids"; private static final String VACCINATION_ID = "vaccination_ids"; + private static final String INVESTIGATION_ID = "investigation_ids"; private static final String LAB_REPORT_ID = "lab_report_ids"; Stream resolve(final PatientFilter criteria) { @@ -29,6 +30,7 @@ Stream resolve(final PatientFilter criteria) { applyNotificationIdCriteria(criteria), applyTreatmentIdCriteria(criteria), applyVaccinationIdCriteria(criteria), + applyInvestigationIdCriteria(criteria), applyLabIdCriteria(criteria)) .flatMap(Optional::stream) .map(QueryVariant::_toQuery); @@ -78,6 +80,12 @@ private Optional applyVaccinationIdCriteria(final PatientFilter cr .of(match -> match.field(VACCINATION_ID).query(criteria.getVaccinationId()))); } + private Optional applyInvestigationIdCriteria(final PatientFilter criteria) { + return criteria.maybeInvestigationId() + .map(identifier -> MatchQuery + .of(match -> match.field(INVESTIGATION_ID).query(criteria.getInvestigationId()))); + } + private Optional applyLabIdCriteria(final PatientFilter criteria) { return criteria.maybeLabReportId() .map(identifier -> MatchQuery.of(match -> match.field(LAB_REPORT_ID).query(criteria.getLabReportId()))); diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java index 43002461be..0171f22178 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java @@ -66,6 +66,7 @@ public static class Identification { private String notificationId; private String treatmentId; private String vaccinationId; + private String investigationId; private String labReportId; private String accessionNumberId; @@ -187,6 +188,15 @@ public Optional maybeVaccinationId() { return Optional.ofNullable(vaccinationId); } + public PatientFilter withInvestigationId(final String identifier) { + this.investigationId = identifier; + return this; + } + + public Optional maybeInvestigationId() { + return Optional.ofNullable(investigationId); + } + public PatientFilter withLabReportId(final String identifier) { this.labReportId = identifier; return this; diff --git a/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls b/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls index 81478afa60..d5bf737bf8 100644 --- a/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls +++ b/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls @@ -31,6 +31,7 @@ input PersonFilter { cityCountyCaseId: String notificationId: String treatmentId: String + investigationId: String labReportId: String accessionNumberId: String disableSoundex: Boolean diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/AbcCaseIdentifier.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/AbcCaseIdentifier.java index fe834e8eb3..265f1ba30f 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/AbcCaseIdentifier.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/AbcCaseIdentifier.java @@ -1,5 +1,5 @@ package gov.cdc.nbs.event.investigation; -public record AbcCaseIdentifier(String identifier) { +public record AbcCaseIdentifier(Long identifier, String local) { } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/CityCountyCaseIdentifier.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/CityCountyCaseIdentifier.java index 01d114c82e..6444681c55 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/CityCountyCaseIdentifier.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/CityCountyCaseIdentifier.java @@ -1,5 +1,5 @@ package gov.cdc.nbs.event.investigation; -public record CityCountyCaseIdentifier(String identifier) { +public record CityCountyCaseIdentifier(Long identifier, String local) { } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java index a1dcd6bc4e..b3a8bf4ce5 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/InvestigationMother.java @@ -241,7 +241,7 @@ void relatedToABCSCase( relatedTo.setRootExtensionTxt(abcCaseId); act.addIdentifier(relatedTo); - activeAbcCase.active(new AbcCaseIdentifier(abcCaseId)); + activeAbcCase.active(new AbcCaseIdentifier(act.getId(), abcCaseId)); } @@ -257,7 +257,7 @@ void relatedToCountyCase( relatedTo.setRootExtensionTxt(cityCountyCaseId); act.addIdentifier(relatedTo); - activeCityCountyCase.active(new CityCountyCaseIdentifier(cityCountyCaseId)); + activeCityCountyCase.active(new CityCountyCaseIdentifier(act.getId(), cityCountyCaseId)); } @@ -274,7 +274,7 @@ void relatedToStateCase( act.addIdentifier(relatedTo); - activeStateCase.active(new StateCaseIdentifier(stateCaseId)); + activeStateCase.active(new StateCaseIdentifier(act.getId(), stateCaseId)); } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/StateCaseIdentifier.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/StateCaseIdentifier.java index 3170446202..5d4a2d760c 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/StateCaseIdentifier.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/investigation/StateCaseIdentifier.java @@ -1,5 +1,5 @@ package gov.cdc.nbs.event.investigation; -public record StateCaseIdentifier(String identifier) { +public record StateCaseIdentifier(Long identifier, String local) { } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java index 595d945da7..e278031ec9 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java @@ -3,6 +3,7 @@ import gov.cdc.nbs.event.document.CaseReportIdentifier; import gov.cdc.nbs.event.investigation.AbcCaseIdentifier; import gov.cdc.nbs.event.investigation.CityCountyCaseIdentifier; +import gov.cdc.nbs.event.investigation.InvestigationIdentifier; import gov.cdc.nbs.event.investigation.NotificationIdentifier; import gov.cdc.nbs.event.investigation.StateCaseIdentifier; import gov.cdc.nbs.event.report.lab.LabReportIdentifier; @@ -22,6 +23,7 @@ public class PatientSearchEventIdSteps { private final Active activeCityCountyCase; private final Active activeNotification; private final Active activeVaccination; + private final Active activeInvestigation; private final Active activeTreatment; PatientSearchEventIdSteps( @@ -34,6 +36,7 @@ public class PatientSearchEventIdSteps { final Active activeNotification, final Active activeTreatment, final Active activeVaccination, + final Active activeInvestigation, final Active activeMorbidityReport) { this.activeCriteria = activeCriteria; this.activeMorbidityReport = activeMorbidityReport; @@ -44,6 +47,7 @@ public class PatientSearchEventIdSteps { this.activeNotification = activeNotification; this.activeTreatment = activeTreatment; this.activeVaccination = activeVaccination; + this.activeInvestigation = activeInvestigation; this.activeCaseReport = activeCaseReport; } @@ -66,7 +70,7 @@ public void i_would_like_to_search_for_a_patient_using_the_document_ID() { @Given("I would like to search for a patient using the State Case ID") public void i_would_like_to_search_for_a_patient_using_the_state_case_ID() { this.activeStateCase.maybeActive() - .map(StateCaseIdentifier::identifier) + .map(StateCaseIdentifier::local) .ifPresent( identifier -> this.activeCriteria.active(criteria -> criteria.withStateCaseId(identifier))); } @@ -74,7 +78,7 @@ public void i_would_like_to_search_for_a_patient_using_the_state_case_ID() { @Given("I would like to search for a patient using the ABC Case ID") public void i_would_like_to_search_for_a_patient_using_the_abc_case_ID() { this.activeAbcCase.maybeActive() - .map(AbcCaseIdentifier::identifier) + .map(AbcCaseIdentifier::local) .ifPresent( identifier -> this.activeCriteria.active(criteria -> criteria.withAbcCaseId(identifier))); } @@ -82,7 +86,7 @@ public void i_would_like_to_search_for_a_patient_using_the_abc_case_ID() { @Given("I would like to search for a patient using the County Case ID") public void i_would_like_to_search_for_a_patient_using_the_county_case_ID() { this.activeCityCountyCase.maybeActive() - .map(CityCountyCaseIdentifier::identifier) + .map(CityCountyCaseIdentifier::local) .ifPresent( identifier -> this.activeCriteria.active(criteria -> criteria.withCityCountyCaseId(identifier))); } @@ -111,6 +115,14 @@ public void i_would_like_to_search_for_a_patient_using_the_vaccination_ID() { identifier -> this.activeCriteria.active(criteria -> criteria.withVaccinationId(identifier))); } + @Given("I would like to search for a patient using the Investigation ID") + public void i_would_like_to_search_for_a_patient_using_the_investigation_ID() { + this.activeInvestigation.maybeActive() + .map(InvestigationIdentifier::local) + .ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withInvestigationId(identifier))); + } + @Given("I would like to search for a patient using the Lab Report ID") public void i_would_like_to_search_for_a_patient_using_the_lab_report_ID() { this.activeLabReport.maybeActive() diff --git a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature index d954179769..d566d5ed0f 100644 --- a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature +++ b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature @@ -82,6 +82,15 @@ Feature: Patient Search by Event ID Then the patient is in the search results And there is only one patient search result + Scenario: I can find a patient with an Investigation ID + Given I have a patient + And the patient is a subject of an investigation + And patients are available for search + And I would like to search for a patient using the Investigation ID + When I search for patients + Then the patient is in the search results + And there is only one patient search result + Scenario: I can find a patient with a Lab Report ID Given I have a patient And the patient has a Lab Report diff --git a/apps/modernization-ui/src/generated/graphql/schema.ts b/apps/modernization-ui/src/generated/graphql/schema.ts index cc0c13ee54..19fbcc5661 100644 --- a/apps/modernization-ui/src/generated/graphql/schema.ts +++ b/apps/modernization-ui/src/generated/graphql/schema.ts @@ -1665,6 +1665,7 @@ export type PersonFilter = { state?: InputMaybe; stateCaseId?: InputMaybe; treatmentId?: InputMaybe; + investigationId?: InputMaybe; vaccinationId?: InputMaybe; zip?: InputMaybe; }; diff --git a/apps/modernization-ui/src/generated/schema.graphqls b/apps/modernization-ui/src/generated/schema.graphqls index c9103d3f59..803c4fa55e 100644 --- a/apps/modernization-ui/src/generated/schema.graphqls +++ b/apps/modernization-ui/src/generated/schema.graphqls @@ -1125,6 +1125,7 @@ input PersonFilter { cityCountyCaseId: String notificationId: String treatmentId: String + investigationId: String labReportId: String accessionNumberId: String disableSoundex: Boolean From 663f83a0a9fc6e95c5ec2787103a2db3bf7c06e3 Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Fri, 25 Oct 2024 14:41:46 -0400 Subject: [PATCH 10/14] Accession number --- .../search/PatientEventQueryResolver.java | 9 +++++++- .../cdc/nbs/patient/search/PatientFilter.java | 7 ++++++ .../event/report/lab/AccessionIdentifier.java | 5 ++++ .../nbs/event/report/lab/LabReportMother.java | 23 ++++++++----------- .../nbs/event/report/lab/LabReportSteps.java | 1 + .../lab/LabReportingSupportConfiguration.java | 5 ++++ .../search/PatientSearchEventIdSteps.java | 14 ++++++++++- .../search/PatientSearch.eventId.feature | 10 ++++++++ 8 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/AccessionIdentifier.java diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java index 6fe158ae5a..5095ebde1f 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java @@ -19,6 +19,7 @@ class PatientEventQueryResolver { private static final String VACCINATION_ID = "vaccination_ids"; private static final String INVESTIGATION_ID = "investigation_ids"; private static final String LAB_REPORT_ID = "lab_report_ids"; + private static final String ACCESSION_ID = "accession_ids"; Stream resolve(final PatientFilter criteria) { return Stream.of( @@ -31,7 +32,8 @@ Stream resolve(final PatientFilter criteria) { applyTreatmentIdCriteria(criteria), applyVaccinationIdCriteria(criteria), applyInvestigationIdCriteria(criteria), - applyLabIdCriteria(criteria)) + applyLabIdCriteria(criteria), + applyAccessionNumberIdCriteria(criteria)) .flatMap(Optional::stream) .map(QueryVariant::_toQuery); } @@ -91,4 +93,9 @@ private Optional applyLabIdCriteria(final PatientFilter criteria) .map(identifier -> MatchQuery.of(match -> match.field(LAB_REPORT_ID).query(criteria.getLabReportId()))); } + private Optional applyAccessionNumberIdCriteria(final PatientFilter criteria) { + return criteria.maybeAccessionNumberId() + .map(identifier -> MatchQuery.of(match -> match.field(ACCESSION_ID).query(criteria.getAccessionNumberId()))); + } + } diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java index 0171f22178..69e9324363 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java @@ -206,5 +206,12 @@ public Optional maybeLabReportId() { return Optional.ofNullable(labReportId); } + public PatientFilter withAccessiontNumberId(final String identifier) { + this.accessionNumberId = identifier; + return this; + } + public Optional maybeAccessionNumberId() { + return Optional.ofNullable(accessionNumberId); + } } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/AccessionIdentifier.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/AccessionIdentifier.java new file mode 100644 index 0000000000..11f4558194 --- /dev/null +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/AccessionIdentifier.java @@ -0,0 +1,5 @@ +package gov.cdc.nbs.event.report.lab; + +public record AccessionIdentifier(Long identifier, String local) { + +} diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportMother.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportMother.java index f62a74f4c2..5bc4dd567a 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportMother.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportMother.java @@ -41,7 +41,7 @@ public class LabReportMother { private final SequentialIdentityGenerator idGenerator; private final EntityManager entityManager; private final TestLabReportCleaner cleaner; - + private final Active activeAccessionIdentifier; private final Active active; private final Available available; @@ -54,14 +54,15 @@ public class LabReportMother { final TestLabReportCleaner cleaner, final Active active, final Available available, - final PatientMother patientMother - ) { + final Active activeAccessionIdentifier, + final PatientMother patientMother) { this.settings = settings; this.idGenerator = idGenerator; this.entityManager = entityManager; this.cleaner = cleaner; this.active = active; this.available = available; + this.activeAccessionIdentifier = activeAccessionIdentifier; this.patientMother = patientMother; } @@ -74,8 +75,7 @@ void create( final PatientIdentifier patient, final OrganizationIdentifier organization, final JurisdictionIdentifier jurisdiction, - final ProgramAreaIdentifier programArea - ) { + final ProgramAreaIdentifier programArea) { PatientIdentifier revision = patientMother.revise(patient); // Observation long identifier = idGenerator.next(); @@ -113,8 +113,7 @@ void create( private void within( final Observation observation, final ProgramAreaIdentifier programArea, - final JurisdictionIdentifier jurisdiction - ) { + final JurisdictionIdentifier jurisdiction) { observation.setProgAreaCd(programArea.code()); observation.setJurisdictionCd(jurisdiction.code()); observation.setProgramJurisdictionOid(programArea.oid(jurisdiction)); @@ -168,8 +167,7 @@ private void include(final LabReportIdentifier identifier) { void within( final LabReportIdentifier identifier, final ProgramAreaIdentifier programArea, - final JurisdictionIdentifier jurisdiction - ) { + final JurisdictionIdentifier jurisdiction) { Observation lab = managed(identifier); within(lab, programArea, jurisdiction); } @@ -242,6 +240,7 @@ void filledBy(final LabReportIdentifier identifier, final String number) { filler.setRootExtensionTxt(number); act.addIdentifier(filler); + activeAccessionIdentifier.active(new AccessionIdentifier(act.getId(), number)); } void forPregnantPatient(final LabReportIdentifier identifier) { @@ -257,8 +256,7 @@ void receivedOn(final LabReportIdentifier identifier, final Instant date) { void created( final LabReportIdentifier identifier, final long by, - final Instant on - ) { + final Instant on) { Observation lab = managed(identifier); lab.setAddTime(on); lab.setAddUserId(by); @@ -267,8 +265,7 @@ void created( void updated( final LabReportIdentifier identifier, final long by, - final Instant on - ) { + final Instant on) { Observation lab = managed(identifier); lab.setLastChgUserId(by); lab.setLastChgTime(on); diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportSteps.java index 86f16b6701..9fd7b07aa3 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportSteps.java @@ -109,6 +109,7 @@ public void the_lab_report_is_for_a_pregnant_patient() { activeReport.maybeActive().ifPresent(reportMother::forPregnantPatient); } + @Given("the lab report has an Accession number of {string}") @Given("the lab report was filled by {string}") public void the_lab_report_was_filled_by(final String filler) { activeReport.maybeActive().ifPresent(lab -> reportMother.filledBy(lab, filler)); diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportingSupportConfiguration.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportingSupportConfiguration.java index c6a1813f93..b5efd125a3 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportingSupportConfiguration.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/report/lab/LabReportingSupportConfiguration.java @@ -17,4 +17,9 @@ Active activeLabReport() { Available availableLabReport() { return new Available<>(); } + + @Bean + Active activeAccessionIdentifier() { + return new Active<>(); + } } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java index e278031ec9..8b6263e070 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java @@ -6,6 +6,7 @@ import gov.cdc.nbs.event.investigation.InvestigationIdentifier; import gov.cdc.nbs.event.investigation.NotificationIdentifier; import gov.cdc.nbs.event.investigation.StateCaseIdentifier; +import gov.cdc.nbs.event.report.lab.AccessionIdentifier; import gov.cdc.nbs.event.report.lab.LabReportIdentifier; import gov.cdc.nbs.event.report.morbidity.MorbidityReportIdentifier; import gov.cdc.nbs.patient.profile.vaccination.VaccinationIdentifier; @@ -25,6 +26,7 @@ public class PatientSearchEventIdSteps { private final Active activeVaccination; private final Active activeInvestigation; private final Active activeTreatment; + private final Active activeAccessionNumber; PatientSearchEventIdSteps( final Active activeCriteria, @@ -37,7 +39,8 @@ public class PatientSearchEventIdSteps { final Active activeTreatment, final Active activeVaccination, final Active activeInvestigation, - final Active activeMorbidityReport) { + final Active activeMorbidityReport, + final Active activeAccessionNumber) { this.activeCriteria = activeCriteria; this.activeMorbidityReport = activeMorbidityReport; this.activeLabReport = activeLabReport; @@ -49,6 +52,7 @@ public class PatientSearchEventIdSteps { this.activeVaccination = activeVaccination; this.activeInvestigation = activeInvestigation; this.activeCaseReport = activeCaseReport; + this.activeAccessionNumber = activeAccessionNumber; } @Given("I would like to search for a patient using the Morbidity Report ID") @@ -130,4 +134,12 @@ public void i_would_like_to_search_for_a_patient_using_the_lab_report_ID() { .ifPresent( identifier -> this.activeCriteria.active(criteria -> criteria.withLabReportId(identifier))); } + + @Given("I would like to search for a patient using the Accession number") + public void i_would_like_to_search_for_a_patient_using_the_accession_number() { + this.activeAccessionNumber.maybeActive() + .map(AccessionIdentifier::local) + .ifPresent( + identifier -> this.activeCriteria.active(criteria -> criteria.withAccessiontNumberId(identifier))); + } } diff --git a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature index d566d5ed0f..5784ef2e26 100644 --- a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature +++ b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature @@ -98,4 +98,14 @@ Feature: Patient Search by Event ID And I would like to search for a patient using the Lab Report ID When I search for patients Then the patient is in the search results + And there is only one patient search result + + Scenario: I can find a patient with an Accession number + Given I have a patient + And the patient has a Lab Report + And the lab report has an Accession number of "3034112" + And patients are available for search + And I would like to search for a patient using the Accession number + When I search for patients + Then the patient is in the search results And there is only one patient search result \ No newline at end of file From dfb1a52401fddf0a628d91eb28cfd2c0d31ff5b9 Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Fri, 25 Oct 2024 16:16:12 -0400 Subject: [PATCH 11/14] Prevent ABC case IDs from spilling into State Case Id list in Elasticsearch --- cdc-sandbox/nifi/nifi_conf/conf/flow.xml.gz | Bin 105384 -> 105427 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/cdc-sandbox/nifi/nifi_conf/conf/flow.xml.gz b/cdc-sandbox/nifi/nifi_conf/conf/flow.xml.gz index 747c16e3f436191fb80ed18f274fc8e39575a972..0dd3842d7fd8a3d7ca078eadaacc0b599580563f 100644 GIT binary patch delta 102656 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Ð=@ zj&J;FMw+|>%eBQ-D(T6`8!KZFC#>Ju_U!ibe)hIXd>yb6JUUO~3@Jfbo)q|j2iQ4t z?3pFF9B+%%TIRVNW;NW4)^2=nJ!r`-W~XBmt+CJ;YpR%HF*M8ld|Cx^DV`3L6o4g> z89CU;!ycJT)d)o5g~Eiy4cmtZ#j7eL?8BJ-O^F1IUAw6*s&1dmBTP><1yiq=2@0b$ z)!w%U!kC@AcZS*G6&*m786%Ql0{Fpf%MkT`MxFWzB8s}+Kp;hv$xRFq0|Lx~cAk{8 zB5aq%w}O>xg$EGEHA*g0_NL=g?BwXJC7|}{H<@Xyp_F@G4R?`Cc4oD%ASv&f>mF(J zRoR3HMzjJ1e;2Y8B|@8?&}IH$AN|5q6nKOWIXv^nKSiF_65WP5^E>~Z3&00lR~i~u zSF0~nIkuMwh^QS>Wig=1dz^c`1QK>Jl_q25Ym7uVA~Tv8*DXhA)p=KBz1NDRiqp zNaCRfm1ccCz5S*BH{l3%CfVL;X8COW>S}qWdIWEm|GCx}`dlL%WSoS0yr@Y_j=>}g z(^7b)x(TO`0qN`5Qz1+MB;c&B$6I8%z9g3IrW9p`wCLgz3^p_}00;A{^xON%`}N8B z`|Zi@9WpTjSqR-jiw|WpHs?3->TJ2+!i#m5S=&ydp1=NA`pW#T^mXfbf9MoQ>RM)= zEkHj8@u0rZWb+DLQC-Mx$|b!$I-ccd3eeeN{y5}&3@a!(l78Q|t2uPqlIFnT2~`Os zSfG>0@ zi)#gMaP16Rh%#5dNC9eYK;0793& ze7}TD1Exh`C1ID^RVlc2e z6|jH|S>lh?AahQY1MN&5Q)#&1A$=PQyn*=;h^P1>{k`4!RNy%lJY}{jKbJX!U?YPN zAGvWMZOeK%RN2ABO>(UOH~RkUe;niT8q3%N^AH7X%I8Ab8oDqbab|(IS|(d`p%gGV zY-j;SaPGr$sJK(=;4W&F`CL3wO5tAk-GunIz-^KF8cG-kY#1uFdSq0H6Fw?KhVeC@ zQ2n9qF(+g(R|$2=5=7VxcswCwyo~OU{(n{_2#{{>O_q=CB{#+ORn;Gj zH<&NZ7IM+!k?_GTf>F%m@1j707R3a#C`3q*hZvusuNiU#qMKwGB0I~`2;v!k@X~SG zBl6Im|KePdy3L+NWHQFpV#@zqn`culzEE&P{|p3mbVgE6KhUjU_{-kvfBR=ULHxmk z0e(Jm0hoXu_cyJuAl~76lF)9^jNu+m-}G;ZvxtqS+TCsf^At-z;1=8>zW&X?9jp%#~~V)VfRdn^7dOxjb!yC=r;77?o?p zd(`2+8eSqndXq7KDDG@sL+oRWI><&1Jlfn z#<`w8Zt-AG-v)cwur(DJB7-%jfizk_Ku-k055z-rZ>O*r`u^@ow7+{2!dIG{=?cs& zG(_0u)IYSl)to*17~4s190JaUubWE^JTz>Vq=NOtOHe^_VX*ax84lRf>|*j2fYu(> z2-SlDrAbPGNmhhprXBU#W$b; zDY6pWsZp#;39KM-fT z#MGpRGSrT%>!Ph|bK_TWocYwv(V#!Na&1+k4*~8`QfeBW4zps+;#bU{r<*8}d=9Yi z~LAtm`B8 z{;dZr8Yj;+kl1-rwBom6Gs8VwtU|5ZX_oi_iYIQw$+lHb0?R0;qe8*)Bup-m3>*e% zSJ86=AU(o&Hx>Jo6C(7w8z$#S!iNd@I|n0~cR;R6NK$^$E}xw^cfda`LZmB^LYjns z#?RN`Z-)|X{@cd@SL>=4rd9nnVe-%C`|#MYWwvbNPf=$rEM=oK4xYMFoF0r^QBz+I zU?iu1tzZdmY^Kn7leH8CYV@U&Aujb%@S^xl!mdF;eflqB4TM`2>fg?|f&jv8(gTfa z>8WuxA#UjkfiS5lbV#G?mK@`nvfQ%7o$}yAVKr}d=LoXf_V^fqo$miTxevj1om9)8 zer3_qD^2v*J=7#lt`4hsRhM{`N0HWf0RBIQ z8uX9GZx*&h9VrBrGiFpyCJJ?R!}(gx^Q+w{m9loQo>c`wY2e6nN>rK`ckD4~hr--S zqL@7y75Na&NdTRt-N1CKv^@l-tgT%3DaCjHfe7D!@t+nl<|#^l?=VQZbr#sf5i z7BB+>xDAM_wfDk*C}saO(*XQ+(z^s6S z03`8u6nFJW_;dccyFC8(l6hk|!DJa(Ep)6=gL<ILiNF4iN12!^*0XjAC=B zg$Jne)pE0M&WQjfK5hJW8lNTp*B7HK&w*&$>W#NISbpzct{4+LSy&pgH( z+VRw7J*Jky1(aBt0gtk5J{1(QV$So)dF-#r_OUd0>8loR1($Cf%?o>STuBm+quc}V z1tK$>!BR)&&ZWhNje!RlfhX8d!>%=M6if~1u;_R4Kj@208-FLJvE$d2(8Dv1n#ZhA zxp`_QEAnB;CZxvo&-DK!ch+}3mS$LQg^!~H{dHJ}dXtvgDO;FHq#=sj&ybb+;YK0z z_eF!0fhh7@av`~MSd|+EU7HgHiw;sbl_{4KYXf+17%5Stti5<*aO})4`8NGS4;M+u z!8s_pg@i(a2);H36%wLI^Q5f%FRVn;>JbcZZV~!{aEbE@sjCrnPF6`a#lV#+A5`9g z9&;dco|xLGQ$ke|kwNUg|4SH<&4ba@+S&yA+VW#?k4cZM#s6`pIR6u{Cy@A)ycWqD zbnEhRd>D(IlOA^eXdfY2s`e58Y0w-v1bZF%f##IPf*&CpNw7~|O5&NMPxF^kZ1PV_ z{ieJK4x@F_s4=jOXeH@b#<~Q+{aR)bWQ<<4weMIVVv9<;ga?G8n;VNN zf20D*AMKLiTlW0&{v&_%k5;cd#n&lptzU#ZpSO!k?aW_NjtZdjbe`qIZmYX`>b(c( zBo!a?rEWy{^?g^K`vuJ>)oE}V&FuR=dj$W}G0&`HmL(hOZ#pmU3I8{5o<0DJ-zmcT z4T0xd*_4j_g)c4$N7BTotBQ;ei$gA+(%hlWz_kmQ&R$sJ!R~6Y8L%YR@TWnqfuHLM zF5*ey=;mpCv+F<7$3_sz^4QaO^(tQjwIocdmArXowprqI=FXvg1CL!@V|{UL{M+q7 zRz=H+3k|1ZV}LK>>+8a70JU^)uriP0Z#Qun4iHHr{o{*^{QC&HP`_0_3ynw>~&uh}dQ!VcgUM3DuL1?_}+B z;`6_aeg3(47z6V+_MGD29CgaGSz_x55F|=B*xbJLnd`Xq!Tw+cQ+&h|-(D=*XJr^( z*z-Cr19Cpa3WxyG!=*yRlMP5ZYv_>$y{EldGvSJ{j(yXerf zjsvPo)`RSsJZMk&4U4}7<(Le;_JGN#y6#R#(N7z&rH>vxo)(cQyj@gjx9)8<#}gx{*- zvi4k^f12EjBY;vN|06k5$|2JMC`#p!om|rXKrxtc?vut<-gn)jX0TCkYLv`0w^itbEv>c+Q&c=B`2F!B!W9 ziQM;TMGCJhChs$5Bh&x@4as|rNjI@0f8N;|xjP~F0FYapkDF@%Ga9TU}zW{Ek&w4R(2Zf)n(n;Rd4L{ah zKN>8gVH@3yh*yHLb*jp@D7HiO-zOb>Y8OpXu-LmO9Xb!(?r8vC7}OWbzayky`1PLE zWuMhk<>frH%g5>jj?l2YA2b^U`+w2wTF&_Y zAI;_}`K(fw{e?EOqRr2XjOfW6^kEVWg&A&Pwlyb-Spp5~f34WY*o2#H629GZfe_Si zoIdeChi3c<09K-Fz=Wrh_Nufb z7V2kp0Zi3|uF=W0s%YNL=A|DDPHJ%`Nv&--Qeqji>(>kl$hZ8T1PmLGVd3(b1(KOY zA|qh!w}QMg*ZrsjpcZ#z^c+S9C}W%6bI;Bb0av&v0Ge=2;SS7l*GQ>T^zGkov597q zVCd}3S8E4r!k0v^u$>{ozMr4*41S9kUO^H#W%3{>P$zO-ySyG>ug@2cK3HCCz9&4~ zVCz*$M$&WPEpB%oCOd$nWeP$Y08r|&|2D!*eTYMSA+A@yb&UKNmmPY{Wyt$am+(GW zKNi4-pGoC4nA|XwB-$h!nz1;EZoEc|o%KLh!zzurPBC7-&mGAsGq6PsdRU`!yj~H+ z7cJvN!U%&S!IAo0zEk|>K(*g1fIK!g#--Cv^dD=(;C4|XzDkpQSOV=iwW zp9vh3#Tc39=1PQzb5S1+l{1}N7w9rm2842Mf4IkvR%5k%8sw-O^*xnYR4I)t-M&WQ zU_?sT#(j}lq~lh%Ra|t@tZpj1zFOzmHY-nQjQSKUTS~RzI}h351y&UI`1@F{(EXuC z#`X!R|En1)o8p~7AZKR0w4^Jt?R3N#b*9O{e{;Yk)-L~d(q(f|B2)l-H*OKWIoFp~ zZAAy&o&d8-jPmIlgdnX6X3k3jqg3Px$lo~7uDy? z)#vAm)j|fFm-!^Y0WFjB^gRv3gr7RNDk+pkH>|_@7&n(=cXp%8lO90gKPCkx#mPFH zj#sDm*yZ* z^rA9SBU?Yj5Vz_XGTqqhQ2!Pc>7|F?fv6m#Hv;Oj93pNfU;rrlrfDiElWLO{4BxM3 z>L3u)oDm6jhva`O=SoXT=&wxU$EI;UZW7D-4Z}Z$8rWlNro&VOm4@UBU5@nimU4QL zR6cGTsc)tPS-P|xGnEltoBs@jZM zbL+_niY%J})#kcJkuSe7Gn>`bv(Z!gyjR_yb{e_}#wgB{njIs9y8VkLbX}8n%UVa8 zGHPZN%yOF@wUt(#SOTe3OG` zxEy~fC=^v&$P4}FKU@&Q`9Ovg{g6K7-rj}s3_xGRXq+4B4}w8U+~y=VSvMaPXY|ZU zOttW5uIN2LaE2n6vtlwlBVY}4SK^rUNd6k>QnAcZ6BaD|OCu#kyoMZJL}5Bx39A`| zm=u=?aMn(YrdHG2#1xtz%{t7sw3{_FSl-l;yHw_k5@aG4a-W`cZp3`-vKklCZ?K91 z_>SjMjkJQ}m#|eXP>bY;mqxnI9#m9{Mgn>9=bje6lj2dwghcXZnb>#`_T$I$%fi8+ zz1j3+x?#^sMj6E+)aOo#^YPZ-sJzY#z)xS3N?jjvT!JX9*kuzDzQ+FfdEaFi_|r^~ zBr^Fc!6(*+hFXdr(`PWP1aHBGZlCf>_5m7u1g%fB5%_hKkQAfX!F5)vRF0N)ra}%6 z>RgabF9wJaFKgJCM$=_9MQ2->EI=C~*gh`p@tOh>1b1YJK1!ljy~=`B1k?sLb7!5_ z@{u}waI5Hq<`;1XXP4+3{dNCwn~nbQ&ObFR%R}RxY=OTOf~mK zTlH6+zRGz&G87@iLFr~KtW(QjPD*aeIRj zW^v|JeF$22SEl#^plbfH9@pv56I#^tw2`a^92-(mg6^kqQ}R z;~34%qlOIKez^1j8i)X|i{&ZU{1y=_Lp}{m7B-%CP8?K@1dBCeoig@Uf zx)F18Lx$qLEDv(CF-K5^H4A=l<$+e&OrJJeHf1+iC8fyO+eik_S{TJ)Rvplxmso>pq^(;X+YH34pBDDe6Lf`puL;&LG7@Z5o?EGG;l|XDWk0MJ!o9EBr<LARv3B~X<=QEDko@RSnyTF zvRlQ5!`!Bh-!*}2WQKk#hW zv~6PB_h5r9REtk;PLAV=& zd*kk60B4}y?2FX zFIK2=Kp-}bZfe%FBi^zCY@_;nqs0nJPKSOv8E^P=;z=1;=(r2`GMOvEFBrhz_?88~ z9B!jw0lt$QqJ`dYqv=o7g2QPvBzJzth_BvCzZ;4c@Yu50cK#N+Z(o;!YQ8P>GN1fW zIAC@9HHNuCk@`j@KFNGpr7_uacUldQ%2d4qrRtryaO$IwnpxE&q4Pa)UN@y;Mnyew zo{rG~Lmf(hIg$>56q73chaiVoCY+QjGE$X6IG6?7ZbLkN-|MC-ah_*ani|RF4nYF=q0Wzi|$f|KOS8a>ut)2#GSXgR0+%!UZiVi@(u$R*|DC6=6v-hvQ4hz z4TdoUxpBUQN&X9mqKDlavO<-uWecpU2>Bl&_2N}Y?xfbL z)62AZdZrs@_)uJwh~UJM@}1;}ISrICSwHO-59FHO)vX3h(A?!tM%kU+XSo+&jC%`A zM2W}AQsL+>b~nzuhf5Ly)VeE@)i&5=q2f+K4^umUKu8C!_~)BtoEz=t>fNMR2|&Ln zG3-}16}P<7DDdRC5zJ-oA;PR-hmtV^?q1C0=)l9CoZfD)8p};5<7tGx%rUB7^#JQU z7Bf1dz;Vq_JTx^AUW_uL`oWn$9ezE2D%YY(AP+{9glG|&ru-$%pZAmN_IDrFP9pJj zj;}Qe054tmqKR2g+#py{+{qbjEQeQ5pLzWG7_IIcf~SivxG`DlUg;cPd*q%B*&_7G zIWgNl<=PCnN#lmL;aFPZ<$Lz{r+O>6#tc(e>sc3n^>Pm#*bbf)1jG8HS%Qi26c_D4 zdYSao9V~_CVPoaFu9Qcw(O5sZHtQjb9bMZbKxKtpIr0YM_L5EKcmw3|%aVs|RPHM( zc(aKa10y-G32U8T=;r(1qd`rezLB1Mh(CU~ z-69EXp4zHO6xO1Urih4IoJXB&0 zbnuSEEzfUewE`mCoE$|JZ|~Yyjc7!`k_ULXjq{(MHsy=DMZ<%SQ-c%NW%OFD7=d~V zTk?@|Ozh?J<@bbxIgDB3-(ku4?b7uB!0kS=#%QsN+;6Se2(1`DI-+hvvL!vB*cmO_ z7%=MpkbxN6j%i@WL+;UVWf;VVlT#w>^M$IIGPVMAs0+>I3FCKJn>=jU`CZ)rRwo`? zHn{az;{ra%!}c=DeEw3*Yk_G_{7a9Cq8qsYo`e^Fx#QCi6OIPZ=K0)=$V_dRW-4o- zy{BD+`GEZcU1;bF04Qe}$s&Hmfn*Y<;dT(Z7Hn3|E7k6A1d*F|hW4xhGOc^P);M_? z7+Lw`ETvCTxxv*h8wDQZU=$t)z+u@NI+XNxXLl(G;O~}@+&$s4YEW}(PZNLc5&JG@ z?jio=cM|8C&N%gCPpEX-ZEod{1sf)0V1?T@VeY4IAWw0GQwF+Uu*({**X%_j1APpS z+%8ZKtj^KLTTdB|tkX?j$_x9{k6yOPfjMzFr2LV~iAc1%T+_CkO<`6T04nK6fp+5< z#nFg{3^BDyKKcqih1AcK&GVnWiR&{~ZV0;;OY&b|HK+WpoHGxk4-m}RPis_`?rRt4 zFfq-Z7ib~!YRmvo*ro8zpGjEY+fpO(MO7YT;P@eb#70!(o0&t_<4T;>#8MAALX52~ zx^*`AFruQn;f^opOH|J50a`&J3NpfZ609*HLVxz8#jkC9@yQ%3N!9*op`u2g0mtDJ zTGs}Cy-5d%pQp>T)#fsbxBh67aN;dzWZ0a%!*%sP*w5|z>gL-=@3%=}a7}PpQ_3aB37B1}J^y5!!O99QrHW%@L#%VaM;0|rKPdf50+PvrZ_ z8Z2I1V}4l7BiI|8m#03+D21j-5ZQ&=>Wmk#4|!jKzsBT+{P^WNi}uDUHg*TG8f{(k@0|PYUw;+VyLPdPwYurmJ?5BW%+4feH{SjetMN0kKK|#pRCcJ^J)?IO zn|np)M#V~(-MrkaI!m*_LPip2<4?Zdh?NyPz^1d|<9pb+2+bY;B(@VJHY?6in5`YG zQw7R3v!_O4C4aoVRXmeLE=rvd9&)EO0Z-y#sy59X)N4y0WEHaFes^S*-Y9j)Kb#sJ zsw-dPdvelcV?A0{_4H%@{IP9Gkt>w7{<*_JuDL;-P*_=Lqc#08VP9E6rL1tWVCF?K z3Ye9;z9xe!efh6zkSWCKt|C1P8MbSW6Y>0uR+!edkXNs%-7PZCAa; ze=!c!=K`eFX_i~&3W)aw8Vfc*5t;~TVdW?SosWm3PGnY9!2l{@p`|84pT$w^ z-;*Q50IAqb#Cr~GEhW|VvhNnOtGN@Ly~Q=Fv4ZOM>m5rilS`z6QDV14h1q>aql_)JW0$^ydjjid5th6j-?w3gn54 zO3h=H)T9EIi&G$Pu*KP6f-)oQ{5g>d&pDmh@Y3P^zEg~koAoMjz-H%Ih%yKdrb9;? zNS}Q4s&vWymKiUHw8MuBK(Tg(8@}kkyWN_mRUn3t2$>nA_$H|Asq)6j)`IP1mubPY z?x~_oRZ=iKkCZbyKH$uwvYu@W?&mD>wKl)BFSnLuyrh&JW-#~JKBuvtefbrG!O|pR z5C=SLTg_3Nwm#{>8@hZ*Tbq7oJ5I0&1AW6t{;?k*Hp_yI7kwWLoVPmyvK~{b&$6II z`p)txo^I0W2T6*NPYPn&bgIaH8T+;af4WF+F%C=j5me3?z^9p7FQaVK+d&u5K z+$m#mn)o$xGiN9px6><9nDFmlER|9iIadMmo%@E_y# z4e*0Edijlue_1Y0t;;k z7bHWePq4H^!`r`(qu4?o8k|*ZlWjd6*-~4`!Bu`>;eONtYAGWg8*aPTe_5X_GV_uk z{yLU%m_xujM9$z8(Cdpd15tf(*wd$!b+pB`o6>6h+MVUo{0Bx-RNrsG5JVkLBG^=M zT&Gd^bw-5JHxt-q#+9r%XJJ^~(L9XEb&ZTabn$rj8vKl{KZ)0=F->!IN(k!DctbO8 zD%XYNbQXXD!@|1EytQMH()DNja|;MqssS4(m5>%|3XU}DQHXQ1_)5l+0+lGPf&PTP zMwk+f*)K^aOsJd}4-&){Ubm7aDOMs+%HMj z*sC9U1rW7GY>DMr@Z?t$_xcG`xy9AuSejC0K4Ns1uwM9kW`CeRW;H(ktn?Pq&b^yags=ybBQ+`4?u;}e z9tWW5VlLk%ko_-hY)#+eMQWMM1t+M}_JK`Q{uk0V;Ax#4=?win8G;ufhSmTiTG{Cs zAu1CeIGn!0&DXmT*HBDg0baa~u!@_o8N)$*7Fv;uR52E^ncK?*={y*O=~nCtCd={P z4}E3T3kCZ)7Dr@C8$MLcojIGD1l=nDZ2S;8z6`y@uY1m4U99S~{CyMSV@rIFU-$Vk zX5nK5+sa=eVN>lh|3go{f@fc?CF2Eso%NYpk`~!sznYnP5%$G7sAypZfXKG`ft z^e6w6XL+u^{?`Uer-Y9&M`9j2N)J81H+Bj>V|Up4n0~8JuB#7G4$6#`90v#V@yh-6 zK3rmMP~jOi^lK&>7$f>@J%{z7-bI9rDLlhB?uzl?x;5YvKFplnwcSCeQLkS?j1mbx zVhi>etebeyddLcy}B32VeKypKU=RSSu2q?C~xE4+s=7fmDsX zLXDBSRz)0##-quaL|VqAL}sHrL4|ob(Z!HTDQJqZR3uq(wJ1KE8Dby9Ekt!7(`RaY zA<#K*3!Gqv`o0&`adA;CO_neoA35kE{l27AOk}5{Bk-^NJ#1Ajp}hjY1uYj+MSy7q zQx7J8*GYD98ye(A@MMR$L1wO`EJkC;1IKCXxhtj(keR|#af*Xhon-YjHlhEe1fx;& zP1_v?*O^JN7>v^#{5yW7RqDV2t@CGQ?D6MTl2W_~=L%+Y^&^iQ41*qWRz=?Z(ldva z)%w^y%-B4j+pmz(sAdC*?cq{;KV*f$J2z!Rg!G8JJYFocWY#~?KY2LLjo!;U1f6_P zTxz~A>2Je%=r%lW&Vo7I>Dagsm}o$sIvRp=Q3VMr5CetY>IBoaE! z%V;-0J$NV@6*ac971ZZMX~yNIxnO6vtUGnMP0q-kTTDWG|4ERX*>^p>-AKto__aCQ zy<5vPC0^W?EWp{6uE8in7#A6~%zWNh6-EWE{zo(z?g$^!0b{wmQo?@s%QUv5Va1RLyqTk?M2cA-ok%lLsw81#s{=;CyQHGP%rh2u0rsiCLV$Rj)`Zn2jof)dE*bz&q z=B~W)HoW0V<6YL}=u4joG@S@Bkc5R*k>IoA5|xh)Ru#ci(1OrNc1$M|<4T*7nWhhe z*0|1G=9XY~xa{5uJ2AM%y_;pHNPQ#=&+Uy`WACV~rz&wP39m)sz+{jSKb^DY@TXH{ z>SZx>fm#Cmj^*GOP{jC+#_kM59Bf^@);uN|9wnrqF7hdL?-JUHF1cB{3TP zK((~3*M>fWZf6NT9g!pf=yw1x846>djdtU(CL zR+c#dRuZaCv+-hA`drn0@BJH*Jt*!YDkS<9e*-AKpnCV>s?MLbS)i3@EvXg7CF-5u z)s3S!Be!`A+CXZ6SXe&;#Jy!JL;AIXg`;Gx)g?$hBqkg06!7GVifCH8;5^BW2EsNQ z@vCr%8Slv&OK+88u=6jZ5rq^MM8!?g!vbT+4ei#n&B<2ybJ3iG4|bYzfdQ2a>EyM3 zCqUB{9^GLF7V^72#gyF7i@^a{Hh^t*%;IX&NXPN%EJR*L^Y_NskPW^oQ;MxAOB6?% zJ1+=hdJ(CEP-ci)>vZ99>nJ5EVUek7Myn+!)7dyxSb|*??(Q`9Zsg)n#YsM}K@6yH zNS%4yfRE6_HGCcH)l&JEL>dVzBk+Gl&H$o-6-fx0=wdRRI^lj*=NvrhG8;RDyuymb z4t8sqVCD(MkRt!1)R>HQ&;yN}%|dLbpBY2wV@kgESFCNoDfw-yvkHC-jSuxLEyGbX zRkAL?Zj*vm=|_le^T^ENi@s$EEH~Lt(A1peOj6PP&fCE~o82Eq^ zOS#-xt1*rpblW?}M#AmSkl{zrSq0tG+Ra40c0YCnEWt5HqhV{>Kv5JIO9lv^80IUC zD>7I@(5Y6d&O*rdPpHoKmMv5-9wXS)A(!v9Q0laxIAN|+DEB+POKQgwlhYXYol{aH zFiwkflUu92Z$j3cM_PjMVIn<&1N3D(p3y+}fcbk5VpBAxpAo}s zt$$~cB_CLrqH3&l@fdp(MN|DJR#mKu{B-;=CUNk&2~$o2fB)j`A$mpU*^j{$E=WZy zUK}=1wjm=?hBi=r z`63EwqUp*3H}g`8re*c&aHL^1I8B{IUvj>3bu&`&84g*P94A8M^e@95AKAN%=XzJA zYspL7IQydSo3P*dg#hZ8e!9ldJ-0GM^rm(pG*u3dJS=UzR%yr_0X;ZEUh>DGOjBAO zYGvMJZCijpHe4x`bZTfyuqPQ zco(Jb?%1~KeedWD+5GxXj|yKli+umioKBZ%z=;S>ZOuhBfTMva>D<7E*F^ywi#|2F z6jCn<8=VA-vfJjK&Uf6=*9z~6u)`TmhBq`DvY~rt7t9BR7Si1F!$z}n5!gu>T`-Oi zbRy`DWYTG*!sH?HeMMbtPgjy|P05H}RsjPo1A7Nx3*^d7gIzeit(>&$MZU*HU|ydA zzCA3`{UNjhH|s-HG6J_v41q&^4(G;8lft^m*lgk<#9PgsTn9{sUI zYpIp8Ck(b`bv6jtj1Ixm9MJEG5MLE`YQS(5z=>3LiohxZG$%y*9TC=Qd}l{G6u?3A zd8XnUZFpDlOpBq<-XQgw4b6j)&mKVccWVDOZ?OsGf-1Dh5caE1WK#i+1F8UM9MTuT z<1Mst;`QXjPSvA+f0D`KnkB#7$_71XLg(o6OBLu{c>?`yz6(a`jyyG`SQI7+Nc?^K z{Mg5~`NU4p+@Jm^?5JmjpC64_Hk7xg>&~`k z?q1w`sQqf3G>bh`!t79`mIv`AL*co_OL*QvYzNSjTI_K7-|2O(oGr_ioMh+nCRuNW z@c9*r!oTmqn(`F`M9o81AL0}yz*-YQc7y1dgA{E&h)~3tMyMBdzT(v#=@?YcoXO2~_%a8CfzphN6?PSb@ z{e^3uJ_uV``%6W2mqKM*h2kscpzubc3|==CXfuOY`9Xg`VRjl4Dm#x;=1fT)Qj8j+ z;lwZ(7I`qv63Yv9pcRmmpZ+nZ{*qgoKfRA8*HtBXmjVVUac9sO)fE=YPuh9AA$F$g zN9cN%vGt|uE9GRJ!BBF~qy%5eP;$1<6Ss$;b2lk?%`MHtIp)0^SYp*!cCLz4mY@+% z5n$^cAN>pz{oKP1{?v1)zK|4fwZ}8qZLv~K_Sli7rmLPeTaJl^$RinFZOVm4Zgg)_ zHOwzdQ+#2>OJ+$vhxctwSScZ=6mkRuJIDMpY%0u)Ihk5td972oDt;;EC%8ih+DMKUJI+|BcXigP$=dWTzlk$K<9PrY0rKxg*)7Ng4;9t zv>!R(wMMES!cQC4wkC*E{v~%;&z+_V7KuQJH|k@aXBREbmxm`u>Gkr}FxyV{o$BT8EnoD2CLk=hbW(?9ck+ojSu;Z5E!Vs?Dg? zIzw^$TN-Y^W5x=ZwloS%6&YRlJ6~|%>z6c#V{L^J@%;iCYVwzFV_9*uK^>?fh_wA) za6<=4F&ac|bK2M?P~-No(@JP)*rE{Og@m3Fo87AZ%+4s`v>J;tjV?*TTF7W0;Rg!o z017pGCY{o{!9_;9At~kf@7o)Y{T6G@#G#m8>b`N15O~jb7Uv*(!lG}~0&h9HgYE~( z7`$Hw4FplFjU)Xx$(_MrXaJijK+lODb_fM>ww2}b^Oh5K%L!90iQ!sr!lX!}tBd0^ z(CVte{mh~<%e~Bq>azV0QE?V_2EcgtF5C~#S4*t8-nU|O+ZY4IIb z5dz}jU}^|HVdA9y2qfH16o^Q$gRt^i3!OJg4k*0S41`z|rK;%vhRU)=4YZ@nZq{GN zVg{K0suENugPEhx%A<8ZsThn*Iz?@4N%{QX1cx4RoHH%n&8;LKBNdv&u(23wo3FfR zUSp;GGfwi1+Wl9?Ct|60CT6f^QVk5n_31L3_tdz|1Gy@A*ykt5kh)Bbd$hH`IUkG; zCs!tMya_!%-b6O(d*lYlj{-I}XGaVMNxs`5_WUT`fl}$9glvqIodakvs;STR`T49- z6}N)Eqp793fhT*uWn{z6-v7VGKS;tYDr$foVb3T*sR3R!9w^t$BU`|$nc%of0X zxoIRh+uaw%%ju=z@XKny6LT5f5QRD}*!Az}t{ronuoZkN0tUOvlk*SKnG&hcIMSp! zX?JwvIZ~)OOGWmNu}1{`BuJ7QSbr}^Zp36K3nqiJBkqtt%v^f2P=l9`u*e8Uz9%Wd zUD_R@)PN&cC4q8O(&hg*a&frBRfA-*Qz#)YFQ_n{-AkjL(b;K%UF86Aam^y*72 z93-f=J1vwBwKZ?HsBkw-iSGq+2T~CL1Y^{}mN`(S^dxu-q=Mi?bdofo?q!v6eqrL) z3vlFCl}!~r5md}b>XFw%{x?)w^an+c-!&i1Evr=t4{vmNj+v3HmHFlxhb0)Ko zA+_d+0VGUdC%!j@WgW;RteUxm&HkZx8YTiWf^L!~s*`ERzn~0&9oT=;DaCP*VMWkB z=}qE1>D#thx^>xH3A}AIi)!)qWpJRS9*=y)ycOMg>FIju+3xjei|(1NKV=3zA5mC1 zGsy(9s9O58-s!Q&_en*M3JQBJ=jtZ#2p7zyTum%2SK0}f`q5msFjl{~YI83V#N{IQ z6z{$zidH4Fc_W|}#MS5$u5$)LIaq>O+N@*$)*hiCfH7JFsTTJ6z=V)q1u`Hq%rlGy zh;K%enRXG@7Qgy1bEA9-w-0gR5R(3%xzdcu|B)+&g?^*Ea)kevT&akM9-!wqsM?(M zd^d|Y&@Q0`48C7|Jy`^v+d)6C&#Sh;-Ob|ZVfoNJIi34e$p=|t?;&9#_p5!!gB2aZ zyEH_R^UND#G=!WeU$WK%-&xcd0N9R$-7$4{>O zP@LKUF+t*x#u94Q#dsk7jhnnD_y>NdUQtEyT@x~>UdM&o7@t$o52F^V0_o5%XPGy8 z`OS~%tyK}oRZ?5$nJy=4Tl(Vb&p*TYi@f^_cVBw)&uAJLi}a422uJpXNy7`Fuw*uH zGpwS?a5MHomYkj&Gm1l%GZ5WJ z6h>f@CC}%c5fL9Prec{)flgOjXjBPSusJ8pX8lf65_Bvl^NV^swi0$Tg}o5riR4yv zPu``yM9L;LI6iQ;Fg1aF<+TMTMQa$p*@#&?WKQ(X_7)4(-raxVj+ z88eyB=x>7vz9TPH$v<+7FG)H}@MJj571Mp>^y`u;=0}IMw zWDY+F*TzQhh6i$ltfTZU!Rz2)xpqy!0LS*#rTx2s;^!oSsU0+EK{4g^bGqG8X514X z?)hx6Mt6-A_s>({-LzFq=ghc{ofYS*&3eKav_}~04Rv`C&y1ZVXEw7D1QQ+wh%SUM z#nh3(3nV)?grmUnzP1W(+U2?XR^#n&90{`WYf63Mi6?+1?5{1NN!i5>=+!wA#Mhgi zpcnh2&hjB|v05$LSLidX$LBBBW-qavTiPQfQ%GblRR5c_C%fU9ikL731sa?J==y5p zySLV+7aQ!JXE=HjU zB7)uu^QXFFgr)(w5{jVb<5!TR>0azPeU}f%-y`!r+F8sO-y2)r`o^JZ^^hx#wLZNd zN}v5Y)jNt>>KnLB$#`PP;0YnfGuDD@axr&B+3sPv!y{yBAl%<9(+02oAo&#I%7WVC zn(HZXBGw#$qMnptkiSKCX2s&Z^0ZG3tttMPAtc*1a6x#GiYKsbpskPg?1v;Do>$hX9?Ud0Vl31B$rGd zX`3nPB!%EsU!s*>Z#>B!Zx|nIq2SVBKCYnpTm9xU?p>t<6b2C^dwuj?LP%aGGd7ZF z)?UYa>LHPkUS(fA*T=FXCp`x#_DOUM#T-e|gKHlK*dumcTjr%n%ZRf@PYNlcMsEsB zq-Yr~a!ab5{&}+aNuim>9pLU3s;n8IyS0X(K zI)gTzob7Kw-OZWSDLawjX2qu)exIksPV=YZhFzR4KYq8H3cG0%g!ZBg2x?SC2fsGscyRlo4}SAAIT?An;b1Ka|f zIr|2f)YX*D)r>L|3Y2W?3;R-GgK)98Yn%n)XDM=LNf1rVe)^y@SCyr(&?2%9l1IaN{|tph@9B&qk|$&2KmCQPiowje zJS0EdQp0I|SX0pg+-+uUUhqbBXFW0e2Wg*8hE-5n`e#sm4%i<}PJ?xg*jnz}%GZK4yL(K>2sZB%3;+-F(4OFf^1!># z>Us#=uev==1g2P2-K_k^G0%uNW1`sqz39Z$orUx2diw6Ic@Lo($vP$8_mThOqq&CW+ z&6@SsTTMcQ2NUK<62++#&x53Oi3%Che%vXH_0*L+=TmRey0h0eX)0EVB^2ROD04h_g}mR~h0^REk)hEol!wDT z+_mkdv*eT$2$EC&7j3xm#mn(`CzH*UeBDE&ih6*N7DhE+?V)6;iHm7SW79k;sNvbb z;g*>D!Y?;^^CISp$3pB_-;uFbqbpPmf-Otw9W=J=8LUI)$e>f9M;IpNG~pm~abZYP zF2ZJ`?pPVn)O)0bSLrhEvIdQlK#G@uOC*h`g09#l|`cTnFvF#ag1 zvYHSs%>EWtw;;#ERniTm}d?Q4gW))7HAx5$KU9SHleUpuWhrK_IM_c_ zL7>RH*ad6LVDk;8u#iRaptiXX%`Q+ zlTUlgiFo!^Ga|5M>Ac3G(hg^pzzqJ3>Na@DYkwP{hShk}!|eEn-RZtFnW6t$u`^M+ zRr1s_2<~!!qd7?ebT1O*16j;j5zgtE5&0PnLC5yEe8w1Rma7I(TP?HEJ1I-t4>

2 z)%W;g|JIC_JjK^~7voh6i3e;cMr$12zmJMNtWoc+i^Lly%!`o7npA>1u-|b~tx6uK zU>HD;R~+!j1;o3sRA5XPKCt@v6MXXD?E!EFUy=&Em(~?tEm|~7m96=^ivQ@QGJW(d zv5P4`cSDW2ZF6ngrEY6yvcx-u{Ow(*L*}@8gt5eZic!}#7c=|rP#8eg3bue;JQ@(L zu@2)i;Rb~qU(=mJ->a+je&R8qD+9-`hP;Z7=2dK*j$T~61QraC9Ct~5~qN6=J+Z=^mO1SxVO*)1Vk)i1+;NTGEJ z@5N=k*1>nda9;%ps>8*^rBo+JwBRnPU$TF!!}F8ctL|$s>(Ty0hGfcf9l*v_Vf4>- zq%cDdT80zq-?k&46iI=Z)Ctr0wy5z0+vlD55(m#NYqzmB;%fl~cmb^=MPh(!*T|8W z3mC1wk7e9pXk!EIM_X){^(p4^vT;NXyIs#H0`qV@{lvp&5hoHp!w9IExJa2*QrDYN z=@e5nM0h;6>Pd zKT8F5{$gsK@K+j`T>r=)*@-v#51)4KyIX<<(vG;(*AoH5zaB^XPh-SiRNWu$*KOSm za@(JuHx2HyUqRn2_}*QpJ;1(@Gab+vdIZZTjH{_VW=>l>{|}c0-$+$LoL}A+QfkZsK^095o6!u}G<;IpFjz{{?)syBsR30{Q`4WFyK~B6{*?mO!Vs6(au;}9KWih-npJTU#JTWzIwO|d zaix5Zou$;6#zqPo7sddr#KwYXNuu;X$sHIU+A!5y z=siaV8GpqdF-9dz8YUb=a)yhV8^eUZUgSt#jli#sjNlC%x|-6+z?uH)hEO0Dd~E~m zavawVRPmNw$Ebv?i)~5$y-S;hLfJki-)@C&nOjqYeDa>3!nGdiddM4Hkv^_=$9~#0 zx;?r%0R=WI%k#EhX1TxY_O#b+??dj4XrJZw_@Ke0icx-5m>KBY#j@HJCqD17a=f>C z*F2|IlJ5?T{`qftNEbI z#b7$Eu5GmVBaj848|KQC$AtT<=Rp8!QuTymev07X(x^n!=s)NiR2WdTm1ZG=5XO?N za=r%JI3q!aIee=ac0F)r8lhNxmhF{PjPzAQLK%C0+;P>nabzO;Oy8D%;#xuR0Ohuy zK_t;=g$<#hB*(aKR`;7YH$bjpwzC=-CyILL)|+AU=67aNMyu!Wudv}sM-k5;cAHd`ZJjtxUoAnb#c zv&(P-z{B=1O23UPZmT&&>!ce6Dx{@k$$;YmnoAim8d0JrYeQjek-ry?TKSE(cW8E8 zsCpvfVnPuOn>K7U??m^6G}vrEL>wvC?lGBGf0aUemyB#W*q1kQLi)*!6U5fcjgKt#CS@?y`O8f^*9cGgGFrmX2Jf+cg$4;rlJmf4KPAIqQ*LHA zWB*RXj^uzB8JzY5=y=_h!&7ybe!OW%tU^&U(hKPn8^myD(i%o93_+y>n1P5~&~xck zHzWVHUIY2uXx!MqWBSHl>nC93dmYqvs=m?{?n$%9>V>A1S0*8_CT2v#U*2|9K50QH z4sPg?T8of+bLjXKE?j+*2&O#5?nCdkoo{k_1kL282}2rZQK8{Uqpp1Gm88 zRi0ps>?G0);o%2wFqc>{49^&2{U<%K5J@1eLdl<4ktWcIiH}7LBqu`^0uQ%iy7G4) z{e!B_lD#CmuI{DqXg&s7#m9!eVt$G~yYq#3%Y6CcB39zA!=9bdlA(M<>Zeb{9h7IT zlSXBB2Pm#NZ15;anJ4(a5+t@+B=UPNsHltf`vATAM&^{_UJS=WA|6+nTkEP^lOx&Q zh6)5pY7`lyU2pca09N{hv7b*sLIU1tj+kT0m3Fp)3h z$5fnCjgrIJv2t0ljs1#p5ttjOVP#!W{<3=ZWXCCwS}0JS^3D>r7K8|oh2LV3e%Uq=`73tw9RQ*o1m0ZpnObP4nhz>*C3{+ATsa zzf4;@Xkh*TI>o>kY=XPP^x_NV1aw3aRfAXlEN^th4uO&b$RN;xdMZHhP-5SOzu7=G z|Mk!Fx+eTU=I0Lb!GT_Xp+{jrW4PH`(&3NX8fIvh#7x5izD=e=AdU^xX_}epoBgof zOEsd#-%t)o`OK2D{Q?O^c!F5u_l{cLU$V4zM;}RlrZrNtjOWK0s6y!7TFkp}%|-RU zH02W^J!LMd*dU|v2(ol1Xs6a@TOZ2XPa*sR&KA{vkC4zd$_T>6MFIq?pq#JbdT;<{tP5QE6b%p zH&Pf~9Y&Ex#6PW$P%C)ndO2u(a->s{sOC@N`0MpcS&#rH2jZDmcQ8t3@V?mOaHR0o z_n{N~Y(5B`B!U$wMGECiCwGRoYZ{ms4$_50XphS#u*Oy+*0s1I zFJ+2lJ6LgI=_C1-mbJAzS?+sav%_<#?ew&Zdgqt2c{mu(bhZ9RKP3j7j@@NGQwlokzZgrkMX0yRjH zjc{|^Uc^%#7TmuzvxYzs!fpWwW5LHb-1_ZStB=&Y{bLi|BLdkxi3tDN+&nZ>OkZ4# zB%=@5f`{^!7X7}I-E;p7-7noTXXeA+O(RnDH8o<(B)dy+E0hkFg9db zjFhu-O<6HunX4&drbepGQa9&Y2Cvuc5*VM#R`4GLs1K`~u}T(igcB?-7||MS>{d;A zr^_~fK9WYdxz%i(8CRaVxt-&6MckV@_v5yjB5t_eLk~NHka-02XQP=}Xk5L$`#SU8 z8qfYewvu*n-!xA)zN*NdMEL>JEN?j7<8scubMC%SOlV`^zKmI!0hH{b*iCnrwDpd4 z-m;Zndm3Rb%g?=9=-_$658^l1$HGEQpM@21Eluv&c6J7dDs*<%?HNqM+yzF$hMCvVPZk%%4?2YdWyF50786*j zH?0a@^#W4Xl)-V)T7%Hud-%E&n>2q!*p^%jN$HdV=Ykn@z;*0TOCi<;#{sq$|39&h zT=N_DsaQkVcaAkM+Cop+co}Zc@X_L$wyr;jF3@ zhO>}KnK8Kg=LMSuK^l|Km4LHYHW-WdAV&=co2+4LDHPT)W4*+lp~|5%>yd$zME;9i z3a1Q-f?foc7&0ZDunLy=q#4oIPvR*PwmihgX2v{jC+d^27c$V7_hTPloY!(_FpTvc zRH2X1cz4G_{G#BN2S1T(8r+8PSWoZu%3adxWTd~WkL;FlM@;|IXX_h1<^hLGOvhFX z|O3*0K;~(Wi9FB%pYxnCB-lWDHg@ z{2*ky!3S~Gq}cDXf~`iB9cx;oNt3sE7&~MTD1CkxtwzfdpQHOZiCC9Z{2+CS zRWe*Jr5Rb;XSC)G^!yP6fgW!S5a^Nl574vJeFW*bP+X2b4;81E&I^~%KJTsLt7bpN z2wJ)7^?{T>!0p3D8D-m8u@C6r9tXf2vgJ!LnRK=#e5_Ll(Go*EHy{iJn)O z1n-ihA3wEohrE4Cv~$ORK1X&)+Lgm@bvFfOZz9cR8Mid(t-<@NR2LM8d=6LdvAO_ zp#$R@xm7;IlSG%ksSD=MWJi#6$X(~FFh7z0Z+&wYL=YTWWb(rJCCq}}N9>qq_r?N* z{otrJj0}tr56b}ouMHLKPqYsQ^GNoij%R!(d>FlWi($@8yOCPe~n3mvH-VYZOHmf^+y)VWwf$mJl`@S~&)n|JI6>J|5YJ-0; zfGz8v`V-{Lj7B|K-~MjU|10u>qs)yhm|*W?O$iYIX9eQhd=)+}M%r7`6f$1MJ~)eG z8wRXjAJ3lwZrGZer5*I6_L^VAXHET7RX%qfOX59yPz>ZzzPi>8su<8_Cw6h9uscHy zt4LwOe8;G14s>tb`@zgtX_kSb$gu?`eh~TtYhg#Z_D^*g>gLuTpQd)1wnD@+e3Q&( zzX{!gDSSY}>T0KyLf(}Ss)U_%#yorq+wCid(m~`&q-204ICYnJvOe<`K5JQ{?GH6o zce{e|h~fs}zGBbGpLj(Ia=T0)YVqkO!bIIHhR(Y~Y?I}yX&83KLduL@T?!5#Qx4BZ zyIg<1$h~f4uL5_V9Op2AQ&`px|GaVmI--`eO9;?s?IHnTEpKOW&g3}?!X!WKddn7@ z*2IVF8rSx*(92lYcC_fcM{#vL1J}z4gRp~iK7M6f2FGI-dW(VTCfQ_exDQw_=$vpl z6%U)%=w~f5%foWBYdGK_|+35IMgA1M$q3 zsAt1)BnRjJjUrAA8THHv;u*h`zTvLjUt)Ijk!ME3G$Xu&^&XM-QNe~~JTAeUiNYv@ zm;-oa>Z~Sd5;|VoZIEtn#S$LX${+%ipt3U<9lokyq#=esn!AS>pX7UwqV(b#`NpKe zE3IwD4t(5!^7_#xo-(csPHmcy75Yw~gFmK5m+ZtR{wKRnhXH?}AXigR_Mfmq+B0)b z+N+AyxNnSP!fmV2S$tkM3_@OQ7hY4|=^o7|e~@GUvMx`8-y)hffB)}(pvtWjJ8W<~ zAS}aScoO!vPAApGA!&Qp00ndJbE9?DQ`?-HMYZX_(JJC&tm1>}e!&{didI{M#Q(oQ zLvQk5KqFXpCw&LmU2DgTYlebpMbxNq-_S)^BT#YDY8Ft7>J}A0q)luAd>rlU^+bYV zI|s@HN)g&hYfVDqnZZ@q_=N3cH!C2jdR@M5`)M3#=O}i@t34?-GNOl-o;V$}jd&L6 z&jv1DGUi>=FB`zXm!el6`bq!kk07{`?w3KVDty#C3>5@#ZtrM_W#VO5oJhWwWGGPi z2W0^N4l_9F0?fy%%G*l22=Hm-LnpBz48-#5w9XY zblZz#r23Z{NudpdGwLYX=Q3q1A*=|JG`<-qbU+3QF>Xg(SBr+<2s>G!AgIF7gj8*1 z%@YltJ5%GgkB6WrD{7OEEt?DYZyzwnTGyJJ^-q)CLN(4H?C8H;|8LOd1YTd(SKLyf zMo}V>uOluO97``3=ZKvY)LHFhO2~eDC(6=F`mk6K&s^>IhBfZXKGf!0=0WKa=m6o+ ztK|^S-+r%l(~miifA|ier=G6n4-)fHckz##B9Z~cqL5nH_h=Th0;H!eWIQ87HLJZjn?8IILX|FA)4>ryZ^crCD=HX#I5S7`)N@s5lCtM8DIY$d{pe_{lJoR^Ah$OyR78zi~yi#BhDb%_LU|0`QJ^b znZJ*((fvG6tji{jknsjS>cN*`s7_ZI6|!%pxW{W&4bIf?@TCY=rCS|hi3MofKd3py zl^=n?$3aQCJ_vkp1`q`*r8%`Tb(Ds-CxR-!97rjfo})c~Pm!`*hCD}}np_NOGN(Glul$S)Y@ccV$!Q;)S_hZ9di-2cMpz_ETmKK=()-4@FdjH7#e#?%Eu8QJvRXyu z3@XG`<|#4f^+tW!L3kS{b^DTM_crmto0%{Yvkp+~{6uC!vg;HY`H zRsT0et;fObn_eDL!;bjxFcoNg4&{3t2$JY0= zLbLWaUyFO!WA&R`)O)U!8*x_;A1t#-l0yqm%_iQP|9%#DKAk9FkfWBro*6r3(+U|W zkX&wnO_xph;^)MVaFQWgNxO7cp(^ay0lvj$TX1pq!?7|(s*Vy^5}Yp z>|8CI6pgIsrH3VWniyV3c;fu+=FCntPqemi|Aeo$rwrVn!WF?hE!{EEHvhYX_$dZ<~CCJHZT^Ee(^zKaR`IdDYn z!L$o1S*6Z9?d!(dmilw-2!~K-q)`WCn)cHtj}+JuTgSJl*qMC7&|NoH;-W?BioH_} zLJ$At!6mwMNvN#6?U9oB37ic=EitA46F3bxZ^|j?E6gbXCW%XyLM;Iv22_4>mrGXU zEWlri4jixI_Ggs70Jt;wuX}H#tU=}7R3xtWu?38Tr7_>+Acz`=wVT=v7U1HdD2m^s zC5KC_nW+vVyB}EPPmV$!TPgK^jZi69h>R{7TQEC+MP}skaGXYO;zRLQeMe@=A$|}p z#+gp*9PIh&`+hwb<~sQ>z>VvGoQl21y+B{ezc8^UuBu~dGWBy`KT^o+{WtEd0s2x& z1C;dw@qSd2Um`D8roAu^XCrTL;ij8=S&wP`oOONp`fe8#yJfue3bntUjj%i)>Z53D zKFjTGk|g5?z`c@oD_kTvb@K&HVee}i$J?oLeVslzXpvJnnC%Bv&_yXw#6j(c@Mt`( z8n0z!HXo`5%acpV<;vgnJ;mRpx;I*wRyfua?am88m&7HD}TO0+(j7k9WrZ3 z;UX;!lb_4ec^rxQi(FtnQ6E>>b7*N-*nPQ*y_q0=-mTa1`;Mt( z^@q#O|D+p4>`9nTwSRm6IGwM*`*$03W=wJ;6EjqtXHTQ(4)HlvlkGM-&C3tWa5s0@ zFL$8ijfZ5Y=dLf4$xw{@3MN}VZ0assGDFX@0*2;4#$uZFiABdex_?qPZ$i1hc>6QE>DI1rM0Xg+(o~VpM2I+hL z5l_*8e<3s{6yx`FVSA?MGs6kqyJ_LrK&;8&1{jVC6L4s9O{p_;lZgrR6geXa5BbBs z=shJi*3qInz2U$FF4NEd&=08~`XQN$H^*eYvUooJGr_|8dY&_YC9Nmd&ePQNE9c{Y z;g&c_60`x8-2b8MD}&=`mMz81ELqIV%*@Qp%*@hAvX~id$zqF{EM~SWW@cul9e?+} zxA*PF{@93#ndpw1?w%>gljme+X_5a7iVqnrASCPAF`lDFI|0J8h>j+F))qvpr zwK2UHf9j4=HuTdBl+E~&4UjrNQtx(`I|#z1xmpnyN=`vr%268RLt) zeFr5*Kg~bP1AOzR5C0Q?*O$A9U4Q{60|A%^hpKYepFu!be9_V$W(R{xOA;p@@^cHb zzvKgW(*GbItp5-4LGyo*4`=a`17=DA)w&2!$Wi;9&))Ogdmn?}M#e`fC%eW`bsPgtowYkt`jYE7!l5UC&s z?unE3H&e_YJs6B)RN0)m?K@ISa8`XV0VFM;guyeY054O8SKOg77%06^#Aff5D-OGO zEYH*Ob^t-b_#04OUV~NvX2gPDhDI6%S1CcI#n!=Qs<35%wZB?9DsSnP!644We*}rA=QX!4PsGRrvxEOt-~?2vtIf!bD#DH}Vvv-Ja)icoGwqS*U|A&L92mB==1PTlfz5kLB6a_yCNl_^@98#tI`7SBvg+9h8Rc<+* zI#kqElsi-~9F$-2Bn-MBFmdb*8$xi$C++@;WATZxnKG#gUSu_`I#6Cv(Z|v9BGS^J z|92$~gXHybVg#9rL>w^-m5cM9hWWQIJ$oWYVNuQ!wt)69w>yw-Uy}ix$7a(}*2|*< zSf_4HAT`@;RIx$-jmrweITv&KKPhTCuNw9&?s+}2ZeYF1#wN#AaD|f524Oq`$VY_| zwNBoRcI3Xu7OuT>L?6F?FGr^(3O$tWaVG8R6oIMsFV$UQZY$??v+K?(15=}&0G9u% zp0S}&zx6JggZA$2q~&Yy%f0Ow51+?r_*~X0BUw=_YO}f#nIAbDX!yS#yoSTSc@|qj zCq13ZS^$ZdVc_Sh)a?}^@+Ib%4=lJ?U}MpeZM<6&zr>3us|;nvWjf z)j8e{Ui)!>8AKtK7`a+KoxU9Y?Zn^CZElfl`ZK_AqW;ZlDH22qLkUd?ey>R2JqdPz zV1w$wW#zai0+DFQ-~Df;vVzsWmCAUqoK;MPK>l(rSu_8}9H)4oJYIe*ejc(J#*#pB zceDo5j9j071lst!ap*Tp7mv!*HA!5X zeS5bj4;3uY6T3huQ-pGuGni{3hc$2GsM~a6Nw*>%a}nR?xJ}|*RukR`ka0XJV-6f>ua|jua>xU>njOZN)Oyj*rD6D`KvOt~>(=p~h({ z{IlPV5>Jaw1*k;r6l7Ay6lUMRIZE{bOJ|B;Q9O6&DCE9?Jr~gzwxyPlsppPmF%v61 zX9LktjKY7SA*6f7Z-0rCAOB69%YI=5i&ld+EHuP5N7Eu#vHPOVV-4YW0K@iokvI3^em3mT z%p~Y~+bFyPnUloBZKs&{WdW9}qUdT#3jI z5|)YKe`=F>)egKLe}kz7OVIo(x(Rq8SRO?K8*tItYU{V^zUd#Po03{DEz77#U3gvV=jr#jf9QC5 zan{msn$zH>n%nu0401PfmL6QVoK6B53Fyxia0k_U9!C#xO!ATClAf#^(AJunG z_xLB5XYn!Q?U#U9R#l%sJwoR%0gotUf@#wc6>)QJfy*G5h$!qhT7xnYDxYEHfiCT2KjNdUzTA=B0oon7~vktH*z1 zVnhEys8I4D>i5b0894=b@H{deC)_h&__*de7JvTYaN{!s8F++#?lluQl$u{&MjBLK z3_7n#ZXDSRMlOXeF|6|AsOSEH?RJ}{%ISy1g*jZIIrf(WG3r#^($-ExOC4!yV+0Gi z>HGp4;bUzirx3S z!CH+L9*E+@*#wZ@TFZX*9`GW1AsOZ>XR{5x_v=FKpDEb@6gnYwW-Y=tA4;39Qs;F3 z(4>Mc2ejq2cawASI8T$hG+yRQ2s`!}L9*(LTJe zT;E&RGlTZA4L1x5lN`61SVpzU92lXz3BC|kH%y3JPH`3uD*VICBP%EyhW9YUbpIPqhMW2 z!O0`t*#0oGOox z<1GDH`RgZOYfv?==(T`n(IV6#U%ItNQ%)aHLSt+ozZABl;$~j=h^l!DOA|F(Bz*Jn z#f-~VYBCM`JC0BAxq`{`LE}B$F?MKtHn=!#LO;ZdTmZzTo|04V@z3X4ZEw%enI0I< zh8)a;tnS`Xp<5wF!;L+K5W#jC@3{&pHIgeD4%^_%wn*I0=BPOpw;iq{KgELx##v`T z1tXz-0dSy~atyu$3rY?i84jQP^ht6A)b9p|B};|6zNXU;T0dNH4jG=sXLH41KJ!p^ zvMntU;4(@nJcdOjH>)}}`$#R_H+!zrPRIM^o3ljyQP6(SIUBlceNKUA*eVKS--^%? zEAY~?TfOFW44jz4i-r8Mz|3n)h_D2RY(T_8tO?K#d`MKE8oect|GbJ}=hq`#U7Gl< z`wdUnwokKM&~qiyznZo`EnE76n#>?J=jz~|n^ExNetiFVa9yH%@zgN3=C!kZ+S_~m zwG1_@^8N)mn*`c6hHQ0v&wOVY$UitdrG#nnJQJwBo8O&IQomVwkGdxD4Jn1UY$uo+P8UYx?YYp4*M~aLE~v-v#kgefIlZ z)4}Skd0;LNZt*5E_Gmmb$q2|?|rnc!wh+fD~8ftENks6=$sFC!&jQ4YLxSLg*3PO{t z&nxZwVR5*7efglbI66FlXOAB8x=RQDC!Sa=T;uX^_ejNIM82=)N3=3uHjLxDL#OHx zJ-oZ8Xv_ad>QF#fR|Qt)#7Aw7Upcl`=A@`P{@(6=#2Jtp;Rr8cI|dq&cen`B#ONNw z<-X#R9m$plGrMbW`v~xzeZhWZ6b53(w_d+cDXSQ??c!GWjHR|2_X(Je^oXijZbp#%5 zJ42=Waf6~M=Lw(V-R7Y0wFFZIh1V9z{6zf;&BuExVJWisp9!mc+{s(h?6Z)_V+$Dj zC)ZN=#Qi4Z)r;~Sic?C#FPGQg9<(EWqXer+@mAb0cSP^_j6cbXi8yy;yk49fiI9_@ zkS-ISW76m5u36=B0G6I35Y9n~{Bl+Ky@&{tj;w6_?e;(riqg4226p5iyo62gA^4!KpFN0fdK&wc8dg zNN%wxm6DcK`_i%<@O)A8mO2x$dp5C^AP7SZw{I2Zl2=J1hbJ}Q?ZBx~2i3lCVD#8) zFv7DTA|1K{Lq}XzmC%DMDKrD)F41(PxB%}$UZ;MuIR(H3)ODUv zb$2Gb-kdq&l$y~tr^$SrL_`~L{@AoiIs@Rq_*nfonrKn5rjYM23Ezl>C}9+QqK@r1~%%!Ll}h*KJW~ z8vL`@W`8Q@N=EY7vrX{zPg3;)K@u?u8U(!fxiP%H@~|Zp?@UteXEn~Sc~1b<4USZ*X=x13 zj0xXO`4 z@aZ|6nCU4~5DC%fnV8T^^`Rd-4C*z1=MZIiRiHExTPMhkXwl-bxS2E}kysvU5k5Wa zEq+eBps{pMVh{-(p61s9^%Kwx9i330(dfZ|sw6-HVWX-koe&&Fa+1p} zgrQ!V>)==MHP{K%eAX+n3sWgD>vg0?-!UXi%aQ3%G4)7As3{Ig#83u@IOPIiCGvNr zBM3N`eE&1}gj?z(X6wP-I>;qmX7+723Hc2OspdPD0`4o_a+2a*YNkFM6MWy7`$58J z1pC2MZ*tc#_cwrL#yyB0XmfRcLqP34uCh5r{`6M*{#%KT{+evZiFkE=fFl{rxwM{D zUZeUKzvQP(+2FoE^D8)~rLg`2;nfi=kL!sI#_*dsTk}g#oBE4x;NdWw&!*KMrC+_% zyeF>x1p*?svbjp}!&2e)+O#2;hC{iLw&po_nsI8vmnZ=8F37OBHi$GK90_qcVUv!1 z%D$OD6TtUe%eBlvXMdr|y=&AFyW^K)mg}XLXWq@aeO`*zdJUL`Ryns0(TGOB3G-bul^6<4<`m zVU05jR|ILc?7><$#V5$mk~^>inmC8IKaN1_6wZQJ8Ixkj96r{ATGY2^M;`srY|Lv? z#plR;pZGI~@zF?X3;AhaL3YkT>g4JUeHcySuR#D|{*%8@$47`zh#7?_Zhs2rGh^b` zVvjn^z=EO(t#>4k8Pa&lKzU93h!n{bwlT({ZrB_I1B@>PMLfD>2S z!thnu;%2APAJam&2XiJh$510S_dt5sdwwOUtI8zjOpcF0MGO_EPeqf652PFwMe_k; z-qQr&B%4MUqkk?MuRmF2o{@&93T6oIVmvp;vWFvxVfb{32Zn~F#-2VmN>sWFARMo> zZ&oAgfHWZF|A6foNwWrxg~0LYU{5y?z_HE((zs}pPm??qPHMzMo^TkT>9+4|0-S7;v{#8;BLRJ);n%<6B0}g~ z(&XZf1SVY1F>D)|>;@OH*zeA(*lW$87noe(twa8#Y=o24@H5t5ao+jK2P)dCl zf*D_`t$6T}noRY(LR(ZAdAxjTngj(ge(BMiVcR%^~x^ z_F2a?;Rqi!TK#mZQQ1>GMYfk_1@7 zi9y7R+slFwu+O!L;~+S$af-tS2>7_x@ED|6cz&|q6bX$ru2bdpmiqvOmr}vXtfBr( z_kY(|S5h*q7f@9+J41H+(}lN@7BS=q4A=ztDx$Qw%&JdU?p_g`v7lPZDOpeiSR7Y^ z-1GiK=O9dTcN`9 z9~`7(8qMqxnG%+lYJj-~2?0-W@=$c*MY@}@ev~lr6=~Y3!s^`<4xu1TkSY+}3OwMN zZh<2-EZxX$jGz-Z)}w-;Qt6&iR1n`FVN!q3Ob#(+ zHQJN!S24{OEA|KiGzRG0+H%7n89>hdRw*En_t?oh+Rl zsH^_lte77(LSctd+M=uMJ7=&)M47EaA)}xX@7;vY6Qlly3&Z#5Nwjm7zzj7m;G1ND&|ShVr1IqH>#oN`OUI+QU!-ZLE&XYSQj%U=R#q<78@i z6~&?Ge*26DoC_LD6&bk0n~X78c$vb_FK~J^!bz+7(v%KmBv|!zbPDp!N2Jl_FUPf# zfS8d712v6cS&Yp0{`e~Wgy+n*_Em)Lh@dWboSUS48E-iKL75}sD!sdJk3M>Cq6VW5 zs}^v}CfiY|zPdU6w?CC43%F-2gTTTefFrWLVEZ@oUNsstEo>ZAVu5k5B8c!{h1bdt zQ<@HD1P2Up%SZ#K825B=$-(_ng!3R`0HMsVKeeX8LlvQQRiNk@WqiANmE*!G9=4SY#TD-S{gRz9&Y8`8uHRykwEX%j`MSf!EKEgGnm~ zS@hn7E0=YL=WF_>E{!FKMwyF?RcUuLW0{wECr0vt?r^6D6S-jXO=6kz2*MD+0!aJ| zU|jWavqa;*^Iy;=Hh(2>FeX^VpZd)$0Sb@Pml_cg8raj!(sU|fT~9Q{+L}&;GvvH7 z%VI3;%m5y)zky<`o z(8kP8YKg;fsprCVlvY|PlNI6}27u#Aq5F3kC1eT@#b5-^Fprf9%uP2kNw7UQA@&D$ zph>9omc_DRKek>yT~_6lcif&a1dd1Y%uQ1ST-%%IP_VYKxys}!0ktgC6Y6c1J-dFZ z2S16(=Mdr@@puAiro=aGu2pbg_q278e0x-14^)!HMfwH(=a(vQr~(o*m9c!mc=97r zC^oPZfAm9E>Hk!Q8x~pfh>~f8kBu1N;>fnwLk&K6hCdCw`f+a@V~)CLM+!X;OAPIS z7@lYX*%|=+1*-|DE#R@u#7acQcPHODnX}P^+`-~A5$^Pp*7-S`c4){tVZ=yw`vxaS z92+H2wzo{!p8`t}L;ym-l_3htc*JZVQ5ornv2{UT{3I9!=1h609Ya|&wZHnXC0D6o z8qt5?%rJELX7MD$BiY{*8-!C*>aE|`#s_FH1z`=${S<%ZCHq8POOwb@sO0a4g*ve$ zArVT5md)#g`?8vqks}5``&1v=44Sqy;c!@uZ3A-eP;bRdRL#iYG>Sf9HGXav*SEoe zN`b{g;Ok7I_$M_XG@Yo?qs$!;l9FgfN)}YLy$m#^p|Q@`o%i7T;GS4CkBX<baoi zf?6)4nsyk0IUf49pM=LVmX>M-d{9r`B918Hl4&Y-btz&u8gkzECvFD zXB_ZHypbnA$%>N|G8@suS&wWbFo@+A5ymsh5F$J@A4CduX51+cwQ~na|4I@p8UjOS z9!1%lL2PN#T^z`OrR0D~%l9dVnnV_zXV3PEudXNdlgG3SvU`<^{1LAv%}!lkW7l)} zZlwb&t#)R;bp|nVufMzK#gEa3L$-U0TnxC%+T6>67+gIw?51x_E^GQy^SXs-Ph1l$ww> z>>Kr51-eDcdu4^CdSmmfCpIX%TP@&lG?Dm1HJtk4&U6l=!8|x23eG@nu-*l@`}<8} zRrJTIbjf47F;9#(Wt9pRa&?ntV3v-LY24$bt-nJcz@%DyCK@^m7#MR$^wOu3XW=u! zHmVv3Ufz*z8==lKxEHDJvn4Znw;IR%n5J1f1Fli6(RQj@6H~tCQCwQffC4D)dlH>U zl6rx2<$)*DGCuaz6EDrfbO2Ceu>IWk_~|LluzQs`#|ode%fcnTv``NuIb68#T{Z+aYC)!D}2mnlUv(mCvk>u1t_C9!*pCLF~l6e zuV36P)$Fx|`c`HZ0*P6@voe6B&ZN%B3kIKz(%3_&7;LZF2yYk7*0y14f$pTCxEU*b z-8M&)PMngcvgOR8AJ=wep3=Lg8i%Mh{@cuGXs9IdWJD^6Gs3%H^2TuZJrN^TNl6*K z$i&x2#MtLZ7eT%ezsH#^Ubi}51@Bxn)ZK8hjMRMzLo9*AXLn;>zI z`_;}w#J^IxxfsNka=b{2Sj!b1H`P8uz|#8COY%YbT|48TxY4-D2TMC zc!fmbqLHCt&jq%%jMWKnqu+)^+5=iD81{9Ji8 zI<9Z%704&1YPksN{+*L4nd?$fs(IwyCSSSR1>XHVKVEhtKK&K|exKJn8IMGQxp7|9 zlj{wL-74Kox87GOt5+Y#Of^hXlebfbt0CM58Yx#Yqu-?KZyz!84F&TPPO~>;k_XojLM*^=INh#dkb%%zo7(lV- z-E$$3ID|0yq{{sO%5SQ(mA}wW`!jTH?Rqo!Q#q4Iom0uO@{JnIgYIH7Em=3~2{$g^tlRWac)p7B^jIaP3{bw?ho!S$g>v%8X!q zHu#XN?|8QsT_NFz0rr-~;p?n^IY%E%|{>eVwV{z z>sW5|@pCFld86%VvbjZI_bI1Qcz?)>v6HjbQu6f{h!PjYv4_C2TIUJ#N6e7pbt#df z2knbCW_fJ^6E8oDnQM4R)zoQtN5JRoCoSXnc8iJdb-)s?=6AF z=q|gI%CC{ADz6?}{h|W$Uci<=j9a*z!{z=39?11%Xpix z5wyQ*KMd~PKqTZ@eeB52VLQ^YQfN*n>)6xoDR+y#j1KhcIvMd^yI-~ zzYhHph-n(e>wUEIG;ZnUeBNt!dnAM<8@6rKQ5&<(1O*56IoeCagq2P3YCoWG;@%<& zm{u&-%POJg0uOk;eSVI(?athL!5r?CKkVw(@i{EWyfR$_WZ!iqf+;&lXwgXXKe~Zx z1GHo-@|>DISOZg_$rzHITv!GB0?C>PJNw550UNW0SnYq@8M`#0zlTv@LC0+8y4%=L=&hZWbL345x^q$ruNAa!sM@T1(7a zh*D0KD(G#~QF#r8o?2tJplXV4^&PLEt=2}*)*KQxbC&+)FmN2U$wEq4M*~i}x;95i z+4FA?-_hR>pShxOP!&*WxEY`$Ng=lv@0Zr1tk{~3qnl8)djw)?() z?R-}KaWL%ksrKAYvmys)02LeOyarP|C24yxAuXA3uGoW<>nWR%v4R z_-cTcPq~2ny<&G7KXZ7Yl*<4w3yP$P^Y!L;HVQv~5WHUx$)!2unAA5fRv(XUjLhvG zG$rHPYg>#J_P1Kl2Y`$(!`NHaEFpvJyNf8_kAqevsb7)N!lEZrPs}1~;ulKJ+ETEZ z(m4{*q!AM0zB66~!x0liBX3!%K@)kbs7p7x+-JL+6nIYdOV4Fs6b}wD!t*LC(s(Uq zkH2$6|M}aQ{SGS4jlbuF)E4TM)iIswVXuI^r4KzZUiPM=@g0xWTf z+92Eu3pDNU<2*k+Q(IdUuq>QGd=L_cmAe|X5*M39XD5F!tQ3>@5dL9PL0rczsk#n# zS@NEieCCqtg37CXZRE|k_*a991A6ni2nx3Lp->==G7!XjwYET2oFhY8 z$ljn;uJBkgQ&=!S;{zJEUTUk{_Sd~F4+ zhYo)1dMXeCzS;F!(#kkhLL)^b{YN+lCbro_g<(Nr23N;)%jgXv3jL$>Nd%46+hP_l@ssP>j0uw z1T@}@|HJKDf-V$CY4^GRsfhwpye_9){M~AufBM7TPYZP)-QC|_Dq0WQKlfDuesg=( z3;_W`@w$Q;tVG4&r{nL=i!|8(T%h5w?PBG}M4g~5&9_sI?I(H@w;NMhHU$f!OmCUL z-|)?EHj}}?Pw<@(YIqysRdPM;bUD&<+CzNBW4b>Uiomz^o90|jbqr&tkXExrvUS=Q zeSO%g3-G#Ie8{be=={?F$SH4U6P)z@-X&00y!f5OZUgu3d{i}i9rqVy0Q+X{obu^! zXO45;X}qpnQ?GCbzl8A7P*Kr?WG`BV7ErFQni_86zu34HYCdki*ktY1_BP$S{;=sj zn=y9i!pO@J?o7&`{cd98*@SO|ob0}7-C#NhSGJLO(h0Utrg$&N2B@jLI90;S!~5>+ z47;fuXvG2NfEU<#$7u^14iM@W!gE&zf$rGd_My8>_3-vny)uYU8-@q+D~x7>jRr}K6YrU zKk_ynb@;C(^}%e`fb>zg-#?bSA+`{*X&9u@zLM8TVZAD$ePy$jMFgHx1?T>HaJ-t+ z_r)1%k{^-#E7Z;wJU=ng#uzvEH<1ROCNVg$W~--dgzVChGesm|BQ#%z=+Kr21iZz^ zbLm7B*bvA9&n;1$xA}FNKF)_<+R?xNTdRshlLVl|gvQ_>qnCxCz$b{{YWwD&q%tWB#DaBa-JNP_zEU8tYh!~JnmN+-$!q6 z2sCkV42W{_B3Rek3Yc^C9(Kj5lh<`h=@oYUT3k6LWBO*YkS5 zyZYu>X=C(|i}-3=gzH?RZ+RXz#(0pq-?LdKLAn(YWl~5u*UFM?NJli53e5l10g}h2 zusm)el~Iw�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 V`gr)Kc@w8E{y(Jc@|B!G8UP|6ha3O^ delta 102745 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ᓦs~LP4F{3d0Z>zy-{=5 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 From 38d90b0098970b74591ea6c53b2f6d1d5021d0e3 Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Fri, 25 Oct 2024 16:27:14 -0400 Subject: [PATCH 12/14] Run code generation --- apps/modernization-api/build.gradle | 11 ----------- .../patient/search/PatientSearch.eventId.feature | 2 +- apps/modernization-ui/src/generated/graphql/schema.ts | 2 +- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/apps/modernization-api/build.gradle b/apps/modernization-api/build.gradle index 8aefc00d1b..20ff77287e 100644 --- a/apps/modernization-api/build.gradle +++ b/apps/modernization-api/build.gradle @@ -120,17 +120,6 @@ testing { if (System.getProperty("testing.database.image") != null) { systemProperty "testing.database.image", System.getProperty("testing.database.image") } - test { - debugOptions { - enabled = true - server = true - suspend = false - port = java.util.Optional.ofNullable(findProperty('debug.port')) - .map(Object::toString) - .map(Integer::parseInt) - .orElse(5106) - } - } } } } diff --git a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature index 5784ef2e26..f0e49e1171 100644 --- a/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature +++ b/apps/modernization-api/src/test/resources/features/patient/search/PatientSearch.eventId.feature @@ -108,4 +108,4 @@ Feature: Patient Search by Event ID And I would like to search for a patient using the Accession number When I search for patients Then the patient is in the search results - And there is only one patient search result \ No newline at end of file + And there is only one patient search result diff --git a/apps/modernization-ui/src/generated/graphql/schema.ts b/apps/modernization-ui/src/generated/graphql/schema.ts index 19fbcc5661..2a695e1480 100644 --- a/apps/modernization-ui/src/generated/graphql/schema.ts +++ b/apps/modernization-ui/src/generated/graphql/schema.ts @@ -1654,6 +1654,7 @@ export type PersonFilter = { gender?: InputMaybe; id?: InputMaybe; identification?: InputMaybe; + investigationId?: InputMaybe; labReportId?: InputMaybe; lastName?: InputMaybe; morbidityId?: InputMaybe; @@ -1665,7 +1666,6 @@ export type PersonFilter = { state?: InputMaybe; stateCaseId?: InputMaybe; treatmentId?: InputMaybe; - investigationId?: InputMaybe; vaccinationId?: InputMaybe; zip?: InputMaybe; }; From 06fbea6d0b7d445b15b83afca26e06188c47e8e2 Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Fri, 25 Oct 2024 16:45:10 -0400 Subject: [PATCH 13/14] Fix capitalization --- .../search/investigation/InvestigationSearchCriteriaSteps.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/search/investigation/InvestigationSearchCriteriaSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/search/investigation/InvestigationSearchCriteriaSteps.java index 9922986f23..780e497088 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/event/search/investigation/InvestigationSearchCriteriaSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/event/search/investigation/InvestigationSearchCriteriaSteps.java @@ -261,7 +261,7 @@ public void i_want_to_find_investigations_for_county_case(final String number) { number))); } - @Given("I want to find investigations for the ABCS Case {string}") + @Given("I want to find investigations for the ABCs Case {string}") public void i_want_to_find_investigations_for_ABCS_case(final String number) { this.activeCriteria.maybeActive().ifPresent( criteria -> criteria.setEventId( From bcf0f76eaf8bb6ae582a295fe8a0d10d312ac40c Mon Sep 17 00:00:00 2001 From: Michael Peels Date: Mon, 28 Oct 2024 09:57:08 -0400 Subject: [PATCH 14/14] Remove Id from field names --- .../search/PatientEventQueryResolver.java | 110 +++++++++--------- .../cdc/nbs/patient/search/PatientFilter.java | 110 +++++++++--------- .../resources/graphql/patient-search.graphqls | 22 ++-- .../search/PatientSearchEventIdSteps.java | 22 ++-- .../src/apps/search/patient/criteria.ts | 16 +-- .../src/apps/search/patient/transformer.ts | 32 ++--- .../src/generated/graphql/schema.ts | 22 ++-- .../src/generated/schema.graphqls | 22 ++-- 8 files changed, 178 insertions(+), 178 deletions(-) diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java index 5095ebde1f..3f0028a06c 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientEventQueryResolver.java @@ -9,93 +9,93 @@ @Component class PatientEventQueryResolver { - private static final String MORBIDITY_REPORT_ID = "morbidity_report_ids"; - private static final String DOCUMENT_ID = "document_ids"; - private static final String STATE_CASE_ID = "state_case_ids"; - private static final String ABC_CASE_ID = "abcs_case_ids"; - private static final String CITY_COUNTY_CASE_ID = "city_case_ids"; - private static final String NOTIFICATION_ID = "notification_ids"; - private static final String TREATMENT_ID = "treatment_ids"; - private static final String VACCINATION_ID = "vaccination_ids"; - private static final String INVESTIGATION_ID = "investigation_ids"; - private static final String LAB_REPORT_ID = "lab_report_ids"; - private static final String ACCESSION_ID = "accession_ids"; + private static final String MORBIDITY_REPORTS = "morbidity_report_ids"; + private static final String DOCUMENTS = "document_ids"; + private static final String STATE_CASES = "state_case_ids"; + private static final String ABC_CASES = "abcs_case_ids"; + private static final String CITY_COUNTY_CASES = "city_case_ids"; + private static final String NOTIFICATIONS = "notification_ids"; + private static final String TREATMENTS = "treatment_ids"; + private static final String VACCINATIONS = "vaccination_ids"; + private static final String INVESTIGATIONS = "investigation_ids"; + private static final String LAB_REPORTS = "lab_report_ids"; + private static final String ACCESSIONS = "accession_ids"; Stream resolve(final PatientFilter criteria) { return Stream.of( - applyMorbidityIdCriteria(criteria), - applyDocumentIdCriteria(criteria), - applyStateCaseIdCriteria(criteria), - applyAbcCaseIdCriteria(criteria), - applyCityCountyCaseIdCriteria(criteria), - applyNotificationIdCriteria(criteria), - applyTreatmentIdCriteria(criteria), - applyVaccinationIdCriteria(criteria), - applyInvestigationIdCriteria(criteria), - applyLabIdCriteria(criteria), - applyAccessionNumberIdCriteria(criteria)) + applyMorbidityCriteria(criteria), + applyDocumentCriteria(criteria), + applyStateCaseCriteria(criteria), + applyAbcCaseCriteria(criteria), + applyCityCountyCaseCriteria(criteria), + applyNotificationCriteria(criteria), + applyTreatmentCriteria(criteria), + applyVaccinationCriteria(criteria), + applyInvestigationCriteria(criteria), + applyLabCriteria(criteria), + applyAccessionNumberCriteria(criteria)) .flatMap(Optional::stream) .map(QueryVariant::_toQuery); } - private Optional applyMorbidityIdCriteria(final PatientFilter criteria) { - return criteria.maybeMorbidityId() - .map(identifier -> MatchQuery.of(match -> match.field(MORBIDITY_REPORT_ID).query(criteria.getMorbidityId()))); + private Optional applyMorbidityCriteria(final PatientFilter criteria) { + return criteria.maybeMorbidity() + .map(identifier -> MatchQuery.of(match -> match.field(MORBIDITY_REPORTS).query(criteria.getMorbidity()))); } - private Optional applyDocumentIdCriteria(final PatientFilter criteria) { - return criteria.maybeDocumentId() - .map(identifier -> MatchQuery.of(match -> match.field(DOCUMENT_ID).query(criteria.getDocumentId()))); + private Optional applyDocumentCriteria(final PatientFilter criteria) { + return criteria.maybeDocument() + .map(identifier -> MatchQuery.of(match -> match.field(DOCUMENTS).query(criteria.getDocument()))); } - private Optional applyStateCaseIdCriteria(final PatientFilter criteria) { - return criteria.maybeStateCaseId() - .map(identifier -> MatchQuery.of(match -> match.field(STATE_CASE_ID).query(criteria.getStateCaseId()))); + private Optional applyStateCaseCriteria(final PatientFilter criteria) { + return criteria.maybeStateCase() + .map(identifier -> MatchQuery.of(match -> match.field(STATE_CASES).query(criteria.getStateCase()))); } - private Optional applyAbcCaseIdCriteria(final PatientFilter criteria) { - return criteria.maybeAbcCaseId() - .map(identifier -> MatchQuery.of(match -> match.field(ABC_CASE_ID).query(criteria.getAbcCaseId()))); + private Optional applyAbcCaseCriteria(final PatientFilter criteria) { + return criteria.maybeAbcCase() + .map(identifier -> MatchQuery.of(match -> match.field(ABC_CASES).query(criteria.getAbcCase()))); } - private Optional applyCityCountyCaseIdCriteria(final PatientFilter criteria) { - return criteria.maybeCityCountyCaseId() + private Optional applyCityCountyCaseCriteria(final PatientFilter criteria) { + return criteria.maybeCityCountyCase() .map(identifier -> MatchQuery - .of(match -> match.field(CITY_COUNTY_CASE_ID).query(criteria.getCityCountyCaseId()))); + .of(match -> match.field(CITY_COUNTY_CASES).query(criteria.getCityCountyCase()))); } - private Optional applyNotificationIdCriteria(final PatientFilter criteria) { - return criteria.maybeNotificationId() + private Optional applyNotificationCriteria(final PatientFilter criteria) { + return criteria.maybeNotification() .map(identifier -> MatchQuery - .of(match -> match.field(NOTIFICATION_ID).query(criteria.getNotificationId()))); + .of(match -> match.field(NOTIFICATIONS).query(criteria.getNotification()))); } - private Optional applyTreatmentIdCriteria(final PatientFilter criteria) { - return criteria.maybeTreatmentId() + private Optional applyTreatmentCriteria(final PatientFilter criteria) { + return criteria.maybeTreatment() .map(identifier -> MatchQuery - .of(match -> match.field(TREATMENT_ID).query(criteria.getTreatmentId()))); + .of(match -> match.field(TREATMENTS).query(criteria.getTreatment()))); } - private Optional applyVaccinationIdCriteria(final PatientFilter criteria) { - return criteria.maybeVaccinationId() + private Optional applyVaccinationCriteria(final PatientFilter criteria) { + return criteria.maybeVaccination() .map(identifier -> MatchQuery - .of(match -> match.field(VACCINATION_ID).query(criteria.getVaccinationId()))); + .of(match -> match.field(VACCINATIONS).query(criteria.getVaccination()))); } - private Optional applyInvestigationIdCriteria(final PatientFilter criteria) { - return criteria.maybeInvestigationId() + private Optional applyInvestigationCriteria(final PatientFilter criteria) { + return criteria.maybeInvestigation() .map(identifier -> MatchQuery - .of(match -> match.field(INVESTIGATION_ID).query(criteria.getInvestigationId()))); + .of(match -> match.field(INVESTIGATIONS).query(criteria.getInvestigation()))); } - private Optional applyLabIdCriteria(final PatientFilter criteria) { - return criteria.maybeLabReportId() - .map(identifier -> MatchQuery.of(match -> match.field(LAB_REPORT_ID).query(criteria.getLabReportId()))); + private Optional applyLabCriteria(final PatientFilter criteria) { + return criteria.maybeLabReport() + .map(identifier -> MatchQuery.of(match -> match.field(LAB_REPORTS).query(criteria.getLabReport()))); } - private Optional applyAccessionNumberIdCriteria(final PatientFilter criteria) { - return criteria.maybeAccessionNumberId() - .map(identifier -> MatchQuery.of(match -> match.field(ACCESSION_ID).query(criteria.getAccessionNumberId()))); + private Optional applyAccessionNumberCriteria(final PatientFilter criteria) { + return criteria.maybeAccessionNumber() + .map(identifier -> MatchQuery.of(match -> match.field(ACCESSIONS).query(criteria.getAccessionNumber()))); } } diff --git a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java index 69e9324363..da474a467d 100644 --- a/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java +++ b/apps/modernization-api/src/main/java/gov/cdc/nbs/patient/search/PatientFilter.java @@ -58,17 +58,17 @@ public static class Identification { private String mortalityStatus; private String ethnicity; private List recordStatus; - private String morbidityId; - private String documentId; - private String stateCaseId; - private String abcCaseId; - private String cityCountyCaseId; - private String notificationId; - private String treatmentId; - private String vaccinationId; - private String investigationId; - private String labReportId; - private String accessionNumberId; + private String morbidity; + private String document; + private String stateCase; + private String abcCase; + private String cityCountyCase; + private String notification; + private String treatment; + private String vaccination; + private String investigation; + private String labReport; + private String accessionNumber; private boolean disableSoundex; @JsonIgnore @@ -114,104 +114,104 @@ public PatientFilter withId(final String id) { return this; } - public PatientFilter withMorbidityId(final String identifier) { - this.morbidityId = identifier; + public PatientFilter withMorbidity(final String identifier) { + this.morbidity = identifier; return this; } - public Optional maybeMorbidityId() { - return Optional.ofNullable(morbidityId); + public Optional maybeMorbidity() { + return Optional.ofNullable(morbidity); } - public PatientFilter withDocumentId(final String identifier) { - this.documentId = identifier; + public PatientFilter withDocument(final String identifier) { + this.document = identifier; return this; } - public Optional maybeDocumentId() { - return Optional.ofNullable(documentId); + public Optional maybeDocument() { + return Optional.ofNullable(document); } - public PatientFilter withStateCaseId(final String identifier) { - this.stateCaseId = identifier; + public PatientFilter withStateCase(final String identifier) { + this.stateCase = identifier; return this; } - public Optional maybeStateCaseId() { - return Optional.ofNullable(stateCaseId); + public Optional maybeStateCase() { + return Optional.ofNullable(stateCase); } - public PatientFilter withAbcCaseId(final String identifier) { - this.abcCaseId = identifier; + public PatientFilter withAbcCase(final String identifier) { + this.abcCase = identifier; return this; } - public Optional maybeAbcCaseId() { - return Optional.ofNullable(abcCaseId); + public Optional maybeAbcCase() { + return Optional.ofNullable(abcCase); } - public PatientFilter withCityCountyCaseId(final String identifier) { - this.cityCountyCaseId = identifier; + public PatientFilter withCityCountyCase(final String identifier) { + this.cityCountyCase = identifier; return this; } - public Optional maybeCityCountyCaseId() { - return Optional.ofNullable(cityCountyCaseId); + public Optional maybeCityCountyCase() { + return Optional.ofNullable(cityCountyCase); } - public PatientFilter withNotificationId(final String identifier) { - this.notificationId = identifier; + public PatientFilter withNotification(final String identifier) { + this.notification = identifier; return this; } - public Optional maybeNotificationId() { - return Optional.ofNullable(notificationId); + public Optional maybeNotification() { + return Optional.ofNullable(notification); } - public PatientFilter withTreatmentId(final String identifier) { - this.treatmentId = identifier; + public PatientFilter withTreatment(final String identifier) { + this.treatment = identifier; return this; } - public Optional maybeTreatmentId() { - return Optional.ofNullable(treatmentId); + public Optional maybeTreatment() { + return Optional.ofNullable(treatment); } - public PatientFilter withVaccinationId(final String identifier) { - this.vaccinationId = identifier; + public PatientFilter withVaccination(final String identifier) { + this.vaccination = identifier; return this; } - public Optional maybeVaccinationId() { - return Optional.ofNullable(vaccinationId); + public Optional maybeVaccination() { + return Optional.ofNullable(vaccination); } - public PatientFilter withInvestigationId(final String identifier) { - this.investigationId = identifier; + public PatientFilter withInvestigation(final String identifier) { + this.investigation = identifier; return this; } - public Optional maybeInvestigationId() { - return Optional.ofNullable(investigationId); + public Optional maybeInvestigation() { + return Optional.ofNullable(investigation); } - public PatientFilter withLabReportId(final String identifier) { - this.labReportId = identifier; + public PatientFilter withLabReport(final String identifier) { + this.labReport = identifier; return this; } - public Optional maybeLabReportId() { - return Optional.ofNullable(labReportId); + public Optional maybeLabReport() { + return Optional.ofNullable(labReport); } - public PatientFilter withAccessiontNumberId(final String identifier) { - this.accessionNumberId = identifier; + public PatientFilter withAccessiontNumber(final String identifier) { + this.accessionNumber = identifier; return this; } - public Optional maybeAccessionNumberId() { - return Optional.ofNullable(accessionNumberId); + public Optional maybeAccessionNumber() { + return Optional.ofNullable(accessionNumber); } } diff --git a/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls b/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls index d5bf737bf8..f500606ec3 100644 --- a/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls +++ b/apps/modernization-api/src/main/resources/graphql/patient-search.graphqls @@ -23,17 +23,17 @@ input PersonFilter { zip: String mortalityStatus: String ethnicity: String - vaccinationId: String - morbidityId: String - documentId: String - stateCaseId: String - abcCaseId: String - cityCountyCaseId: String - notificationId: String - treatmentId: String - investigationId: String - labReportId: String - accessionNumberId: String + vaccination: String + morbidity: String + document: String + stateCase: String + abcCase: String + cityCountyCase: String + notification: String + treatment: String + investigation: String + labReport: String + accessionNumber: String disableSoundex: Boolean recordStatus: [RecordStatus!]! } diff --git a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java index 8b6263e070..60f11bc9ee 100644 --- a/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java +++ b/apps/modernization-api/src/test/java/gov/cdc/nbs/patient/search/PatientSearchEventIdSteps.java @@ -60,7 +60,7 @@ public void i_would_like_to_search_for_a_patient_using_the_morbidity_report_ID() this.activeMorbidityReport.maybeActive() .map(MorbidityReportIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withMorbidityId(identifier))); + identifier -> this.activeCriteria.active(criteria -> criteria.withMorbidity(identifier))); } @Given("I would like to search for a patient using the Document ID") @@ -68,7 +68,7 @@ public void i_would_like_to_search_for_a_patient_using_the_document_ID() { this.activeCaseReport.maybeActive() .map(CaseReportIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withDocumentId(identifier))); + identifier -> this.activeCriteria.active(criteria -> criteria.withDocument(identifier))); } @Given("I would like to search for a patient using the State Case ID") @@ -76,7 +76,7 @@ public void i_would_like_to_search_for_a_patient_using_the_state_case_ID() { this.activeStateCase.maybeActive() .map(StateCaseIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withStateCaseId(identifier))); + identifier -> this.activeCriteria.active(criteria -> criteria.withStateCase(identifier))); } @Given("I would like to search for a patient using the ABC Case ID") @@ -84,7 +84,7 @@ public void i_would_like_to_search_for_a_patient_using_the_abc_case_ID() { this.activeAbcCase.maybeActive() .map(AbcCaseIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withAbcCaseId(identifier))); + identifier -> this.activeCriteria.active(criteria -> criteria.withAbcCase(identifier))); } @Given("I would like to search for a patient using the County Case ID") @@ -92,7 +92,7 @@ public void i_would_like_to_search_for_a_patient_using_the_county_case_ID() { this.activeCityCountyCase.maybeActive() .map(CityCountyCaseIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withCityCountyCaseId(identifier))); + identifier -> this.activeCriteria.active(criteria -> criteria.withCityCountyCase(identifier))); } @Given("I would like to search for a patient using the Notification ID") @@ -100,7 +100,7 @@ public void i_would_like_to_search_for_a_patient_using_the_notification_ID() { this.activeNotification.maybeActive() .map(NotificationIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withNotificationId(identifier))); + identifier -> this.activeCriteria.active(criteria -> criteria.withNotification(identifier))); } @Given("I would like to search for a patient using the Treatment ID") @@ -108,7 +108,7 @@ public void i_would_like_to_search_for_a_patient_using_the_treatment_ID() { this.activeTreatment.maybeActive() .map(TreatmentIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withTreatmentId(identifier))); + identifier -> this.activeCriteria.active(criteria -> criteria.withTreatment(identifier))); } @Given("I would like to search for a patient using the Vaccination ID") @@ -116,7 +116,7 @@ public void i_would_like_to_search_for_a_patient_using_the_vaccination_ID() { this.activeVaccination.maybeActive() .map(VaccinationIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withVaccinationId(identifier))); + identifier -> this.activeCriteria.active(criteria -> criteria.withVaccination(identifier))); } @Given("I would like to search for a patient using the Investigation ID") @@ -124,7 +124,7 @@ public void i_would_like_to_search_for_a_patient_using_the_investigation_ID() { this.activeInvestigation.maybeActive() .map(InvestigationIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withInvestigationId(identifier))); + identifier -> this.activeCriteria.active(criteria -> criteria.withInvestigation(identifier))); } @Given("I would like to search for a patient using the Lab Report ID") @@ -132,7 +132,7 @@ public void i_would_like_to_search_for_a_patient_using_the_lab_report_ID() { this.activeLabReport.maybeActive() .map(LabReportIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withLabReportId(identifier))); + identifier -> this.activeCriteria.active(criteria -> criteria.withLabReport(identifier))); } @Given("I would like to search for a patient using the Accession number") @@ -140,6 +140,6 @@ public void i_would_like_to_search_for_a_patient_using_the_accession_number() { this.activeAccessionNumber.maybeActive() .map(AccessionIdentifier::local) .ifPresent( - identifier -> this.activeCriteria.active(criteria -> criteria.withAccessiontNumberId(identifier))); + identifier -> this.activeCriteria.active(criteria -> criteria.withAccessiontNumber(identifier))); } } diff --git a/apps/modernization-ui/src/apps/search/patient/criteria.ts b/apps/modernization-ui/src/apps/search/patient/criteria.ts index 45cb1fbdb2..0ef61f2f8e 100644 --- a/apps/modernization-ui/src/apps/search/patient/criteria.ts +++ b/apps/modernization-ui/src/apps/search/patient/criteria.ts @@ -43,14 +43,14 @@ type Identification = { }; type EventIds = { - morbidityId?: string; - documentId?: string; - stateCaseId?: string; - abcCaseId?: string; - cityCountyCaseId?: string; - notificationId?: string; - labReportId?: string; - accessionNumberId?: string; + morbidity?: string; + document?: string; + stateCase?: string; + abcCase?: string; + cityCountyCase?: string; + notification?: string; + labReport?: string; + accessionNumber?: string; }; type PatientCriteriaEntry = BasicInformation & Address & Contact & RaceEthnicity & Identification & EventIds; diff --git a/apps/modernization-ui/src/apps/search/patient/transformer.ts b/apps/modernization-ui/src/apps/search/patient/transformer.ts index ad9e8c1e5a..9ef79d772b 100644 --- a/apps/modernization-ui/src/apps/search/patient/transformer.ts +++ b/apps/modernization-ui/src/apps/search/patient/transformer.ts @@ -23,14 +23,14 @@ export const transform = (data: PatientCriteriaEntry): PersonFilter => { phoneNumber, email, dateOfBirth, - morbidityId, - documentId, - stateCaseId, - abcCaseId, - cityCountyCaseId, - notificationId, - labReportId, - accessionNumberId, + morbidity, + document, + stateCase, + abcCase, + cityCountyCase, + notification, + labReport, + accessionNumber, ...remaining } = data; return { @@ -42,14 +42,14 @@ export const transform = (data: PatientCriteriaEntry): PersonFilter => { city, phoneNumber, email, - morbidityId, - documentId, - stateCaseId, - abcCaseId, - cityCountyCaseId, - notificationId, - labReportId, - accessionNumberId, + morbidity, + document, + stateCase, + abcCase, + cityCountyCase, + notification, + labReport, + accessionNumber, recordStatus: asValues(remaining.status) as RecordStatus[], gender: asValue(remaining.gender), state: asValue(remaining.state), diff --git a/apps/modernization-ui/src/generated/graphql/schema.ts b/apps/modernization-ui/src/generated/graphql/schema.ts index 2a695e1480..5e8a3bb61f 100644 --- a/apps/modernization-ui/src/generated/graphql/schema.ts +++ b/apps/modernization-ui/src/generated/graphql/schema.ts @@ -1637,36 +1637,36 @@ export type PatientVaccinationResults = { }; export type PersonFilter = { - abcCaseId?: InputMaybe; - accessionNumberId?: InputMaybe; + abcCase?: InputMaybe; + accessionNumber?: InputMaybe; address?: InputMaybe; city?: InputMaybe; - cityCountyCaseId?: InputMaybe; + cityCountyCase?: InputMaybe; country?: InputMaybe; dateOfBirth?: InputMaybe; dateOfBirthOperator?: InputMaybe; deceased?: InputMaybe; disableSoundex?: InputMaybe; - documentId?: InputMaybe; + document?: InputMaybe; email?: InputMaybe; ethnicity?: InputMaybe; firstName?: InputMaybe; gender?: InputMaybe; id?: InputMaybe; identification?: InputMaybe; - investigationId?: InputMaybe; - labReportId?: InputMaybe; + investigation?: InputMaybe; + labReport?: InputMaybe; lastName?: InputMaybe; - morbidityId?: InputMaybe; + morbidity?: InputMaybe; mortalityStatus?: InputMaybe; - notificationId?: InputMaybe; + notification?: InputMaybe; phoneNumber?: InputMaybe; race?: InputMaybe; recordStatus: Array; state?: InputMaybe; - stateCaseId?: InputMaybe; - treatmentId?: InputMaybe; - vaccinationId?: InputMaybe; + stateCase?: InputMaybe; + treatment?: InputMaybe; + vaccination?: InputMaybe; zip?: InputMaybe; }; diff --git a/apps/modernization-ui/src/generated/schema.graphqls b/apps/modernization-ui/src/generated/schema.graphqls index 803c4fa55e..be997360da 100644 --- a/apps/modernization-ui/src/generated/schema.graphqls +++ b/apps/modernization-ui/src/generated/schema.graphqls @@ -1117,17 +1117,17 @@ input PersonFilter { zip: String mortalityStatus: String ethnicity: String - vaccinationId: String - morbidityId: String - documentId: String - stateCaseId: String - abcCaseId: String - cityCountyCaseId: String - notificationId: String - treatmentId: String - investigationId: String - labReportId: String - accessionNumberId: String + vaccination: String + morbidity: String + document: String + stateCase: String + abcCase: String + cityCountyCase: String + notification: String + treatment: String + investigation: String + labReport: String + accessionNumber: String disableSoundex: Boolean recordStatus: [RecordStatus!]! }