cqm-models 1.0.3 → 1.1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.eslintrc.json +10 -2
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -4
- data/.rubocop.yml +3 -0
- data/.travis.yml +31 -1
- data/README.md +59 -2
- data/app/assets/javascripts/AdverseEvent.js +16 -7
- data/app/assets/javascripts/AllDataElements.js +6 -6
- data/app/assets/javascripts/AllergyIntolerance.js +16 -7
- data/app/assets/javascripts/AssessmentOrder.js +15 -6
- data/app/assets/javascripts/AssessmentPerformed.js +16 -7
- data/app/assets/javascripts/AssessmentRecommended.js +16 -7
- data/app/assets/javascripts/CareGoal.js +16 -7
- data/app/assets/javascripts/CommunicationPerformed.js +15 -6
- data/app/assets/javascripts/DeviceApplied.js +16 -7
- data/app/assets/javascripts/DeviceOrder.js +16 -7
- data/app/assets/javascripts/DeviceRecommended.js +16 -7
- data/app/assets/javascripts/Diagnosis.js +16 -7
- data/app/assets/javascripts/DiagnosticStudyOrder.js +16 -7
- data/app/assets/javascripts/DiagnosticStudyPerformed.js +16 -7
- data/app/assets/javascripts/DiagnosticStudyRecommended.js +16 -7
- data/app/assets/javascripts/EncounterOrder.js +16 -7
- data/app/assets/javascripts/EncounterPerformed.js +16 -7
- data/app/assets/javascripts/EncounterRecommended.js +16 -7
- data/app/assets/javascripts/FamilyHistory.js +16 -7
- data/app/assets/javascripts/Id.js +7 -3
- data/app/assets/javascripts/ImmunizationAdministered.js +16 -7
- data/app/assets/javascripts/ImmunizationOrder.js +16 -7
- data/app/assets/javascripts/IndividualResult.js +7 -2
- data/app/assets/javascripts/InterventionOrder.js +16 -7
- data/app/assets/javascripts/InterventionPerformed.js +16 -7
- data/app/assets/javascripts/InterventionRecommended.js +16 -7
- data/app/assets/javascripts/LaboratoryTestOrder.js +16 -7
- data/app/assets/javascripts/LaboratoryTestPerformed.js +16 -7
- data/app/assets/javascripts/LaboratoryTestRecommended.js +16 -7
- data/app/assets/javascripts/MedicationActive.js +16 -7
- data/app/assets/javascripts/MedicationAdministered.js +16 -7
- data/app/assets/javascripts/MedicationDischarge.js +16 -7
- data/app/assets/javascripts/MedicationDispensed.js +16 -7
- data/app/assets/javascripts/MedicationOrder.js +16 -7
- data/app/assets/javascripts/Participation.js +15 -6
- data/app/assets/javascripts/PatientCareExperience.js +16 -7
- data/app/assets/javascripts/PatientCharacteristic.js +16 -7
- data/app/assets/javascripts/PatientCharacteristicBirthdate.js +16 -7
- data/app/assets/javascripts/PatientCharacteristicClinicalTrialParticipant.js +16 -7
- data/app/assets/javascripts/PatientCharacteristicEthnicity.js +16 -7
- data/app/assets/javascripts/PatientCharacteristicExpired.js +16 -7
- data/app/assets/javascripts/PatientCharacteristicPayer.js +16 -7
- data/app/assets/javascripts/PatientCharacteristicRace.js +16 -7
- data/app/assets/javascripts/PatientCharacteristicSex.js +16 -7
- data/app/assets/javascripts/PhysicalExamOrder.js +16 -7
- data/app/assets/javascripts/PhysicalExamPerformed.js +16 -7
- data/app/assets/javascripts/PhysicalExamRecommended.js +16 -7
- data/app/assets/javascripts/ProcedureOrder.js +16 -7
- data/app/assets/javascripts/ProcedurePerformed.js +16 -7
- data/app/assets/javascripts/ProcedureRecommended.js +16 -7
- data/app/assets/javascripts/ProviderCareExperience.js +16 -7
- data/app/assets/javascripts/ProviderCharacteristic.js +16 -7
- data/app/assets/javascripts/QDMPatient.js +262 -0
- data/app/assets/javascripts/Result.js +7 -2
- data/app/assets/javascripts/ResultComponent.js +14 -6
- data/app/assets/javascripts/SubstanceAdministered.js +16 -7
- data/app/assets/javascripts/SubstanceOrder.js +16 -7
- data/app/assets/javascripts/SubstanceRecommended.js +16 -7
- data/app/assets/javascripts/Symptom.js +16 -7
- data/app/assets/javascripts/attributes/Component.js +30 -0
- data/app/assets/javascripts/attributes/FacilityLocation.js +30 -0
- data/app/assets/javascripts/basetypes/Any.js +1 -1
- data/app/assets/javascripts/basetypes/Code.js +1 -1
- data/app/assets/javascripts/basetypes/DataElement.js +2 -1
- data/app/assets/javascripts/basetypes/DateTime.js +5 -1
- data/app/assets/javascripts/basetypes/Interval.js +1 -1
- data/app/assets/javascripts/basetypes/Quantity.js +1 -1
- data/app/assets/javascripts/basetypes/Ratio.js +1 -1
- data/app/assets/javascripts/browser.js +3 -0
- data/app/assets/javascripts/cqm/AllCQMModels.js +24 -0
- data/app/assets/javascripts/cqm/CQLLibrary.js +32 -0
- data/app/assets/javascripts/cqm/CQLStatementDependency.js +28 -0
- data/app/assets/javascripts/cqm/Concept.js +17 -0
- data/app/assets/javascripts/cqm/Measure.js +108 -0
- data/app/assets/javascripts/{MeasurePackage.js → cqm/MeasurePackage.js} +9 -3
- data/app/assets/javascripts/cqm/Patient.js +38 -0
- data/app/assets/javascripts/cqm/PopulationSet.js +88 -0
- data/app/assets/javascripts/cqm/Provider.js +44 -0
- data/app/assets/javascripts/cqm/ValueSet.js +26 -0
- data/app/assets/javascripts/index.js +18 -8
- data/app/models/{qdm/tacoma → cqm}/concept.rb +4 -4
- data/app/models/cqm/cql_library.rb +22 -0
- data/app/models/cqm/cql_statement_dependency.rb +24 -0
- data/app/models/cqm/measure.rb +105 -0
- data/app/models/{qdm/tacoma → cqm}/measure_package.rb +2 -2
- data/app/models/cqm/patient.rb +20 -0
- data/app/models/cqm/population_set.rb +86 -0
- data/app/models/cqm/provider.rb +110 -0
- data/app/models/cqm/valueset.rb +15 -0
- data/app/models/hqmfOid_to_datatype_map.json +55 -0
- data/app/models/model_finder.rb +12 -0
- data/app/models/models.rb +18 -6
- data/app/models/qdm/adverse_event.rb +3 -2
- data/app/models/qdm/allergy_intolerance.rb +2 -1
- data/app/models/qdm/assessment_order.rb +1 -0
- data/app/models/qdm/assessment_performed.rb +2 -1
- data/app/models/qdm/assessment_recommended.rb +2 -1
- data/app/models/qdm/attributes/attribute.rb +63 -0
- data/app/models/qdm/{component.rb → attributes/component.rb} +1 -1
- data/app/models/qdm/{facility_location.rb → attributes/facility_location.rb} +1 -1
- data/app/models/qdm/basetypes/data_element.rb +21 -6
- data/app/models/qdm/basetypes/interval.rb +2 -1
- data/app/models/qdm/care_goal.rb +2 -1
- data/app/models/qdm/communication_performed.rb +1 -0
- data/app/models/qdm/device_applied.rb +2 -1
- data/app/models/qdm/device_order.rb +2 -1
- data/app/models/qdm/device_recommended.rb +2 -1
- data/app/models/qdm/diagnosis.rb +2 -1
- data/app/models/qdm/diagnostic_study_order.rb +2 -1
- data/app/models/qdm/diagnostic_study_performed.rb +3 -2
- data/app/models/qdm/diagnostic_study_recommended.rb +2 -1
- data/app/models/qdm/encounter_order.rb +3 -2
- data/app/models/qdm/encounter_performed.rb +2 -1
- data/app/models/qdm/encounter_recommended.rb +3 -2
- data/app/models/qdm/family_history.rb +2 -1
- data/app/models/qdm/immunization_administered.rb +2 -1
- data/app/models/qdm/immunization_order.rb +2 -1
- data/app/models/qdm/intervention_order.rb +2 -1
- data/app/models/qdm/intervention_performed.rb +2 -1
- data/app/models/qdm/intervention_recommended.rb +2 -1
- data/app/models/qdm/laboratory_test_order.rb +2 -1
- data/app/models/qdm/laboratory_test_performed.rb +2 -1
- data/app/models/qdm/laboratory_test_recommended.rb +2 -1
- data/app/models/qdm/medication_active.rb +2 -1
- data/app/models/qdm/medication_administered.rb +2 -1
- data/app/models/qdm/medication_discharge.rb +2 -1
- data/app/models/qdm/medication_dispensed.rb +4 -3
- data/app/models/qdm/medication_order.rb +3 -2
- data/app/models/qdm/participation.rb +1 -0
- data/app/models/qdm/patient.rb +7 -4
- data/app/models/qdm/patient_care_experience.rb +2 -1
- data/app/models/qdm/patient_characteristic.rb +2 -1
- data/app/models/qdm/patient_characteristic_birthdate.rb +2 -1
- data/app/models/qdm/patient_characteristic_clinical_trial_participant.rb +2 -1
- data/app/models/qdm/patient_characteristic_ethnicity.rb +2 -1
- data/app/models/qdm/patient_characteristic_expired.rb +2 -1
- data/app/models/qdm/patient_characteristic_payer.rb +2 -1
- data/app/models/qdm/patient_characteristic_race.rb +2 -1
- data/app/models/qdm/patient_characteristic_sex.rb +2 -1
- data/app/models/qdm/physical_exam_order.rb +2 -1
- data/app/models/qdm/physical_exam_performed.rb +2 -1
- data/app/models/qdm/physical_exam_recommended.rb +2 -1
- data/app/models/qdm/procedure_order.rb +2 -1
- data/app/models/qdm/procedure_performed.rb +2 -1
- data/app/models/qdm/procedure_recommended.rb +2 -1
- data/app/models/qdm/provider_care_experience.rb +2 -1
- data/app/models/qdm/provider_characteristic.rb +2 -1
- data/app/models/qdm/substance_administered.rb +2 -1
- data/app/models/qdm/substance_order.rb +2 -1
- data/app/models/qdm/substance_recommended.rb +2 -1
- data/app/models/qdm/symptom.rb +2 -1
- data/bin/build_cql_execution.sh +8 -0
- data/bin/validate_browser.sh +17 -0
- data/bin/validate_generator.sh +12 -0
- data/cqm-models.gemspec +5 -2
- data/data/oids_qdm_5.4.json +321 -0
- data/data/{oids.json → oids_unversioned.json} +0 -0
- data/dist/browser.js +102937 -0
- data/dist/index.js +36637 -36540
- data/lib/generate_models.rb +89 -93
- data/lib/generate_patients.rb +125 -0
- data/lib/generate_types.rb +64 -0
- data/lib/generators/custom_mongo/model.rb.tt +20 -0
- data/lib/generators/custom_mongo/model_generator.rb +34 -0
- data/notice.md +9 -0
- data/package.json +12 -6
- data/templates/id_template.js.erb +8 -3
- data/templates/index_template.js.erb +18 -8
- data/templates/models_template.rb.erb +20 -4
- data/templates/mongoose_template.js.erb +23 -15
- data/templates/patient_extension.rb.erb +7 -4
- data/templates/patient_template.js.erb +88 -87
- data/yarn.lock +552 -347
- metadata +86 -19
- data/app/assets/javascripts/Component.js +0 -26
- data/app/assets/javascripts/Concept.js +0 -14
- data/app/assets/javascripts/FacilityLocation.js +0 -26
- data/app/assets/javascripts/Measure.js +0 -78
- data/app/assets/javascripts/Patient.js +0 -262
- data/app/assets/javascripts/ValueSet.js +0 -30
- data/app/models/qdm/tacoma/measure.rb +0 -174
- data/app/models/qdm/tacoma/valueset.rb +0 -68
@@ -0,0 +1,30 @@
|
|
1
|
+
const mongoose = require('mongoose/browser');
|
2
|
+
|
3
|
+
const Code = require('../basetypes/Code');
|
4
|
+
const Interval = require('../basetypes/Interval');
|
5
|
+
const Quantity = require('../basetypes/Quantity');
|
6
|
+
const DateTime = require('../basetypes/DateTime');
|
7
|
+
const Any = require('../basetypes/Any');
|
8
|
+
|
9
|
+
|
10
|
+
const [Number, String] = [
|
11
|
+
mongoose.Schema.Types.Number,
|
12
|
+
mongoose.Schema.Types.String,
|
13
|
+
];
|
14
|
+
|
15
|
+
const ComponentSchema = new mongoose.Schema({
|
16
|
+
code: Code,
|
17
|
+
result: Any,
|
18
|
+
qdmVersion: { type: String, default: '5.4' },
|
19
|
+
_type: { type: String, default: 'QDM::Component' },
|
20
|
+
|
21
|
+
});
|
22
|
+
|
23
|
+
module.exports.ComponentSchema = ComponentSchema;
|
24
|
+
class Component extends mongoose.Document {
|
25
|
+
constructor(object) {
|
26
|
+
super(object, ComponentSchema);
|
27
|
+
this._type = 'QDM::Component';
|
28
|
+
}
|
29
|
+
}
|
30
|
+
module.exports.Component = Component;
|
@@ -0,0 +1,30 @@
|
|
1
|
+
const mongoose = require('mongoose/browser');
|
2
|
+
|
3
|
+
const Code = require('../basetypes/Code');
|
4
|
+
const Interval = require('../basetypes/Interval');
|
5
|
+
const Quantity = require('../basetypes/Quantity');
|
6
|
+
const DateTime = require('../basetypes/DateTime');
|
7
|
+
const Any = require('../basetypes/Any');
|
8
|
+
|
9
|
+
|
10
|
+
const [Number, String] = [
|
11
|
+
mongoose.Schema.Types.Number,
|
12
|
+
mongoose.Schema.Types.String,
|
13
|
+
];
|
14
|
+
|
15
|
+
const FacilityLocationSchema = new mongoose.Schema({
|
16
|
+
code: Code,
|
17
|
+
locationPeriod: Interval,
|
18
|
+
qdmVersion: { type: String, default: '5.4' },
|
19
|
+
_type: { type: String, default: 'QDM::FacilityLocation' },
|
20
|
+
|
21
|
+
});
|
22
|
+
|
23
|
+
module.exports.FacilityLocationSchema = FacilityLocationSchema;
|
24
|
+
class FacilityLocation extends mongoose.Document {
|
25
|
+
constructor(object) {
|
26
|
+
super(object, FacilityLocationSchema);
|
27
|
+
this._type = 'QDM::FacilityLocation';
|
28
|
+
}
|
29
|
+
}
|
30
|
+
module.exports.FacilityLocation = FacilityLocation;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
const mongoose = require('mongoose');
|
1
|
+
const mongoose = require('mongoose/browser');
|
2
2
|
const Code = require('./Code.js');
|
3
3
|
const cql = require('cql-execution');
|
4
4
|
const Id = require('../Id');
|
@@ -9,6 +9,7 @@ function DataElementSchema(add, options) {
|
|
9
9
|
const extended = new Schema({
|
10
10
|
dataElementCodes: { type: [] },
|
11
11
|
description: { type: String },
|
12
|
+
codeListId: { type: String },
|
12
13
|
id: {
|
13
14
|
type: Id.IdSchema,
|
14
15
|
default() {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
const mongoose = require('mongoose');
|
1
|
+
const mongoose = require('mongoose/browser');
|
2
2
|
const cql = require('cql-execution');
|
3
3
|
|
4
4
|
function DateTime(key, options) {
|
@@ -7,6 +7,10 @@ function DateTime(key, options) {
|
|
7
7
|
DateTime.prototype = Object.create(mongoose.SchemaType.prototype);
|
8
8
|
|
9
9
|
DateTime.prototype.cast = (dateTime) => {
|
10
|
+
if (dateTime.isDateTime) {
|
11
|
+
return dateTime;
|
12
|
+
}
|
13
|
+
|
10
14
|
if (!Date.parse(dateTime)) {
|
11
15
|
throw new Error(`DateTime: ${dateTime} is not a valid DateTime`);
|
12
16
|
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module.exports.Measure = require('./Measure.js').Measure;
|
2
|
+
module.exports.MeasureSchema = require('./Measure.js').MeasureSchema;
|
3
|
+
module.exports.MeasurePackage = require('./MeasurePackage.js').MeasurePackage;
|
4
|
+
module.exports.MeasurePackageSchema = require('./MeasurePackage.js').MeasurePackageSchema;
|
5
|
+
module.exports.StatementDependency = require('./CQLStatementDependency.js').StatementDependency;
|
6
|
+
module.exports.StatementDependencySchema = require('./CQLStatementDependency.js').StatementDependencySchema;
|
7
|
+
module.exports.StatementReference = require('./CQLStatementDependency.js').StatementReference;
|
8
|
+
module.exports.StatementReferenceSchema = require('./CQLStatementDependency.js').StatementReferenceSchema;
|
9
|
+
module.exports.CQLLibrary = require('./CQLLibrary.js').CQLLibrary;
|
10
|
+
module.exports.CQLLibrarySchema = require('./CQLLibrary.js').CQLLibrarySchema;
|
11
|
+
module.exports.ValueSet = require('./ValueSet.js').ValueSet;
|
12
|
+
module.exports.ValueSetSchema = require('./ValueSet.js').ValueSetSchema;
|
13
|
+
module.exports.Concept = require('./Concept.js').Concept;
|
14
|
+
module.exports.ConceptSchema = require('./Concept.js').ConceptSchema;
|
15
|
+
module.exports.PopulationSet = require('./PopulationSet.js').PopulationSet;
|
16
|
+
module.exports.PopulationSetSchema = require('./PopulationSet.js').PopulationSetSchema;
|
17
|
+
module.exports.PopulationMap = require('./PopulationSet.js').PopulationMap;
|
18
|
+
module.exports.PopulationMapSchema = require('./PopulationSet.js').PopulationMapSchema;
|
19
|
+
module.exports.Stratification = require('./PopulationSet.js').Stratification;
|
20
|
+
module.exports.StratificationSchema = require('./PopulationSet.js').StratificationSchema;
|
21
|
+
module.exports.Patient = require('./Patient.js').Patient;
|
22
|
+
module.exports.PatientSchema = require('./Patient.js').PatientSchema;
|
23
|
+
module.exports.Provider = require('./Provider.js').Provider;
|
24
|
+
module.exports.ProviderSchema = require('./Provider.js').ProviderSchema;
|
@@ -0,0 +1,32 @@
|
|
1
|
+
const mongoose = require('mongoose/browser');
|
2
|
+
const { StatementDependencySchema } = require('./CQLStatementDependency');
|
3
|
+
|
4
|
+
const [Mixed, mDate] = [
|
5
|
+
mongoose.Schema.Types.Mixed,
|
6
|
+
mongoose.Schema.Types.Date,
|
7
|
+
];
|
8
|
+
|
9
|
+
const CQLLibrarySchema = new mongoose.Schema(
|
10
|
+
{
|
11
|
+
library_name: String,
|
12
|
+
library_version: String,
|
13
|
+
cql: String,
|
14
|
+
elm: Mixed,
|
15
|
+
elm_annotations: Mixed,
|
16
|
+
is_main_library: { type: Boolean, default: false },
|
17
|
+
is_top_level: { type: Boolean, default: true },
|
18
|
+
statement_dependencies: [StatementDependencySchema],
|
19
|
+
},
|
20
|
+
// Options
|
21
|
+
{
|
22
|
+
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }, // These are the Mongoid conventions for timestamps
|
23
|
+
}
|
24
|
+
);
|
25
|
+
|
26
|
+
module.exports.CQLLibrarySchema = CQLLibrarySchema;
|
27
|
+
class CQLLibrary extends mongoose.Document {
|
28
|
+
constructor(object) {
|
29
|
+
super(object, CQLLibrarySchema);
|
30
|
+
}
|
31
|
+
}
|
32
|
+
module.exports.CQLLibrary = CQLLibrary;
|
@@ -0,0 +1,28 @@
|
|
1
|
+
const mongoose = require('mongoose/browser');
|
2
|
+
|
3
|
+
const StatementReferenceSchema = new mongoose.Schema({
|
4
|
+
library_name: String,
|
5
|
+
statement_name: String,
|
6
|
+
hqmf_id: String,
|
7
|
+
});
|
8
|
+
|
9
|
+
const StatementDependencySchema = new mongoose.Schema({
|
10
|
+
statement_name: String,
|
11
|
+
statement_references: [StatementReferenceSchema],
|
12
|
+
});
|
13
|
+
|
14
|
+
module.exports.StatementReferenceSchema = StatementReferenceSchema;
|
15
|
+
class StatementReference extends mongoose.Document {
|
16
|
+
constructor(object) {
|
17
|
+
super(object, StatementReferenceSchema);
|
18
|
+
}
|
19
|
+
}
|
20
|
+
module.exports.StatementReference = StatementReference;
|
21
|
+
|
22
|
+
module.exports.StatementDependencySchema = StatementDependencySchema;
|
23
|
+
class StatementDependency extends mongoose.Document {
|
24
|
+
constructor(object) {
|
25
|
+
super(object, StatementDependencySchema);
|
26
|
+
}
|
27
|
+
}
|
28
|
+
module.exports.StatementDependency = StatementDependency;
|
@@ -0,0 +1,17 @@
|
|
1
|
+
const mongoose = require('mongoose/browser');
|
2
|
+
|
3
|
+
const ConceptSchema = new mongoose.Schema({
|
4
|
+
code: String,
|
5
|
+
code_system_oid: String,
|
6
|
+
code_system_name: String,
|
7
|
+
code_system_version: String,
|
8
|
+
display_name: String,
|
9
|
+
});
|
10
|
+
|
11
|
+
module.exports.ConceptSchema = ConceptSchema;
|
12
|
+
class Concept extends mongoose.Document {
|
13
|
+
constructor(object) {
|
14
|
+
super(object, ConceptSchema);
|
15
|
+
}
|
16
|
+
}
|
17
|
+
module.exports.Concept = Concept;
|
@@ -0,0 +1,108 @@
|
|
1
|
+
const mongoose = require('mongoose/browser');
|
2
|
+
const Code = require('../basetypes/Code');
|
3
|
+
const Interval = require('../basetypes/Interval');
|
4
|
+
const Quantity = require('../basetypes/Quantity');
|
5
|
+
const DataElementSchema = require('../basetypes/DataElement').DataElementSchema();
|
6
|
+
const AllDataElements = require('../AllDataElements');
|
7
|
+
const { CQLLibrarySchema } = require('./CQLLibrary');
|
8
|
+
const { PopulationSetSchema } = require('./PopulationSet');
|
9
|
+
|
10
|
+
const [Number, String, Boolean, Mixed, ObjectId, Date] = [
|
11
|
+
mongoose.Schema.Types.Number,
|
12
|
+
mongoose.Schema.Types.String,
|
13
|
+
mongoose.Schema.Types.Boolean,
|
14
|
+
mongoose.Schema.Types.Mixed,
|
15
|
+
mongoose.Schema.Types.ObjectId,
|
16
|
+
mongoose.Schema.Types.Date,
|
17
|
+
];
|
18
|
+
|
19
|
+
const MeasureSchema = new mongoose.Schema(
|
20
|
+
{
|
21
|
+
// A version-specific UUID for the measure
|
22
|
+
hqmf_id: String,
|
23
|
+
// A version-neutral UUID for the measure
|
24
|
+
hqmf_set_id: String,
|
25
|
+
// A Semantic Version-compliant string (e.g. "2.3.4") for the measure
|
26
|
+
hqmf_version_number: String,
|
27
|
+
// A CMS-style string (e.g. "CMS2v4") for the measure
|
28
|
+
cms_id: String,
|
29
|
+
title: String,
|
30
|
+
description: String,
|
31
|
+
|
32
|
+
// Composite/component measure fields
|
33
|
+
composite: {
|
34
|
+
type: Boolean,
|
35
|
+
default: false,
|
36
|
+
},
|
37
|
+
component: {
|
38
|
+
type: Boolean,
|
39
|
+
default: false,
|
40
|
+
},
|
41
|
+
component_hqmf_set_ids: [String],
|
42
|
+
composite_hqmf_set_id: String,
|
43
|
+
|
44
|
+
// Measure type variables
|
45
|
+
measure_scoring: {
|
46
|
+
type: String,
|
47
|
+
enum: ['PROPORTION', 'RATIO', 'CONTINUOUS_VARIABLE', 'COHORT'],
|
48
|
+
default: 'PROPORTION',
|
49
|
+
},
|
50
|
+
calculation_method: {
|
51
|
+
type: String,
|
52
|
+
enum: ['PATIENT', 'EPISODE_OF_CARE'],
|
53
|
+
default: 'PATIENT',
|
54
|
+
},
|
55
|
+
calculate_sdes: Boolean,
|
56
|
+
|
57
|
+
// ELM/CQL Measure-logic related data encapsulated in CQLLibrarySchema
|
58
|
+
// Field name changed from 'cql' to 'cql_libraries' because the semantics of
|
59
|
+
// embeds_many: cqls (on the Ruby side) sounded weird,
|
60
|
+
// and we wanted to keep the API consistent
|
61
|
+
cql_libraries: [CQLLibrarySchema],
|
62
|
+
main_cql_library: String,
|
63
|
+
|
64
|
+
// HQMF/Tacoma-specific Measure-logic related data
|
65
|
+
population_criteria: Mixed,
|
66
|
+
source_data_criteria: [],
|
67
|
+
measure_period: Interval,
|
68
|
+
measure_attributes: [],
|
69
|
+
|
70
|
+
population_sets: [PopulationSetSchema],
|
71
|
+
|
72
|
+
// Relations to other model classes
|
73
|
+
bundle: { type: ObjectId, ref: 'Bundle' }, // Cypress-specific, until we migrate the Bundle into cqm-models
|
74
|
+
package: { type: ObjectId, ref: 'MeasurePackage' }, // Bonnie-specific
|
75
|
+
patients: [{ type: ObjectId, ref: 'Patient', index: true }],
|
76
|
+
|
77
|
+
value_sets: [{ type: ObjectId, ref: 'ValueSet' }],
|
78
|
+
},
|
79
|
+
// Options
|
80
|
+
{
|
81
|
+
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }, // These are the Mongoid conventions for timestamps
|
82
|
+
}
|
83
|
+
);
|
84
|
+
|
85
|
+
// After initialization of a Measure model, initialize every individual data element
|
86
|
+
// to its respective Mongoose Model
|
87
|
+
MeasureSchema.methods.initializeDataElements = function initializeDataElements() {
|
88
|
+
let typeStripped;
|
89
|
+
const sourceDataCriteriaInit = [];
|
90
|
+
this.source_data_criteria.forEach((element) => {
|
91
|
+
typeStripped = element._type.replace(/QDM::/, '');
|
92
|
+
sourceDataCriteriaInit.push(new AllDataElements[typeStripped](element));
|
93
|
+
});
|
94
|
+
this.set('source_data_criteria', sourceDataCriteriaInit);
|
95
|
+
};
|
96
|
+
|
97
|
+
MeasureSchema.methods.all_stratifications = function all_stratifications() {
|
98
|
+
return this.population_sets.flatMap(ps => ps.stratifications);
|
99
|
+
};
|
100
|
+
|
101
|
+
module.exports.MeasureSchema = MeasureSchema;
|
102
|
+
class Measure extends mongoose.Document {
|
103
|
+
constructor(object) {
|
104
|
+
super(object, MeasureSchema);
|
105
|
+
this.initializeDataElements();
|
106
|
+
}
|
107
|
+
}
|
108
|
+
module.exports.Measure = Measure;
|
@@ -1,11 +1,12 @@
|
|
1
|
-
const mongoose = require('mongoose');
|
1
|
+
const mongoose = require('mongoose/browser');
|
2
2
|
|
3
|
+
// using mBuffer to not conflict with system Buffer
|
3
4
|
const [mBuffer, ObjectId] = [
|
4
5
|
mongoose.Schema.Types.Buffer,
|
5
6
|
mongoose.Schema.Types.ObjectId,
|
6
7
|
];
|
7
8
|
|
8
|
-
const MeasurePackageSchema = mongoose.Schema(
|
9
|
+
const MeasurePackageSchema = new mongoose.Schema(
|
9
10
|
{
|
10
11
|
file: mBuffer,
|
11
12
|
measure: { type: ObjectId, ref: 'Measure' },
|
@@ -17,4 +18,9 @@ const MeasurePackageSchema = mongoose.Schema(
|
|
17
18
|
);
|
18
19
|
|
19
20
|
module.exports.MeasurePackageSchema = MeasurePackageSchema;
|
20
|
-
|
21
|
+
class MeasurePackage extends mongoose.Document {
|
22
|
+
constructor(object) {
|
23
|
+
super(object, MeasurePackageSchema);
|
24
|
+
}
|
25
|
+
}
|
26
|
+
module.exports.MeasurePackage = MeasurePackage;
|
@@ -0,0 +1,38 @@
|
|
1
|
+
const mongoose = require('mongoose/browser');
|
2
|
+
const Code = require('../basetypes/Code');
|
3
|
+
const Interval = require('../basetypes/Interval');
|
4
|
+
const Quantity = require('../basetypes/Quantity');
|
5
|
+
const DateTime = require('../basetypes/DateTime');
|
6
|
+
const { QDMPatientSchema, QDMPatient } = require('../QDMPatient');
|
7
|
+
const { ProviderSchema } = require('./Provider');
|
8
|
+
|
9
|
+
const [Schema, Number, String, Mixed] = [
|
10
|
+
mongoose.Schema,
|
11
|
+
mongoose.Schema.Types.Number,
|
12
|
+
mongoose.Schema.Types.String,
|
13
|
+
mongoose.Schema.Types.Mixed,
|
14
|
+
];
|
15
|
+
|
16
|
+
const PatientSchema = new Schema({
|
17
|
+
|
18
|
+
givenNames: [String],
|
19
|
+
familyName: String,
|
20
|
+
bundleId: String,
|
21
|
+
expectedValues: [],
|
22
|
+
notes: String,
|
23
|
+
qdmPatient: QDMPatientSchema,
|
24
|
+
providers: [ProviderSchema],
|
25
|
+
measure_ids: [String],
|
26
|
+
|
27
|
+
}, { id: false });
|
28
|
+
|
29
|
+
module.exports.PatientSchema = PatientSchema;
|
30
|
+
class Patient extends mongoose.Document {
|
31
|
+
constructor(object) {
|
32
|
+
super(object, PatientSchema);
|
33
|
+
if (this.qdmPatient) {
|
34
|
+
this.qdmPatient = new QDMPatient(this.qdmPatient.toJSON());
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
module.exports.Patient = Patient;
|
@@ -0,0 +1,88 @@
|
|
1
|
+
/* eslint-disable no-unused-vars, no-param-reassign */
|
2
|
+
const mongoose = require('mongoose/browser');
|
3
|
+
const { StatementReferenceSchema } = require('./CQLStatementDependency');
|
4
|
+
|
5
|
+
const [Mixed] = [
|
6
|
+
mongoose.Schema.Types.Mixed,
|
7
|
+
];
|
8
|
+
|
9
|
+
// TODO: figure out if there is a better way to handle inheritance like mongoid.
|
10
|
+
// _type is how mongoid stores the specific type of the embedded document.
|
11
|
+
const PopulationMapSchema = new mongoose.Schema({
|
12
|
+
_type: String,
|
13
|
+
IPP: StatementReferenceSchema,
|
14
|
+
DENOM: StatementReferenceSchema,
|
15
|
+
NUMER: StatementReferenceSchema,
|
16
|
+
NUMEX: StatementReferenceSchema,
|
17
|
+
DENEX: StatementReferenceSchema,
|
18
|
+
DENEXCEP: StatementReferenceSchema,
|
19
|
+
MSRPOPL: StatementReferenceSchema,
|
20
|
+
MSRPOPLEX: StatementReferenceSchema,
|
21
|
+
// STRAT is only here so cqm-execution can handle stratification results compliation with the current approach.
|
22
|
+
STRAT: StatementReferenceSchema,
|
23
|
+
});
|
24
|
+
|
25
|
+
if (!PopulationMapSchema.options.toObject) PopulationMapSchema.options.toObject = {};
|
26
|
+
PopulationMapSchema.options.toObject.transform = function transform(doc, ret, options) {
|
27
|
+
// remove the _id and _type of every document before returning the result
|
28
|
+
delete ret._id;
|
29
|
+
delete ret._type;
|
30
|
+
return ret;
|
31
|
+
};
|
32
|
+
|
33
|
+
|
34
|
+
const StratificationSchema = new mongoose.Schema({
|
35
|
+
title: String,
|
36
|
+
stratification_id: String,
|
37
|
+
hqmf_id: String,
|
38
|
+
statement: StatementReferenceSchema,
|
39
|
+
});
|
40
|
+
|
41
|
+
const ObservationSchema = new mongoose.Schema({
|
42
|
+
title: String,
|
43
|
+
observation_function: StatementReferenceSchema,
|
44
|
+
observation_parameter: StatementReferenceSchema,
|
45
|
+
aggregation_type: String,
|
46
|
+
hqmf_id: String,
|
47
|
+
});
|
48
|
+
|
49
|
+
const PopulationSetSchema = new mongoose.Schema({
|
50
|
+
title: String,
|
51
|
+
population_set_id: String,
|
52
|
+
populations: PopulationMapSchema,
|
53
|
+
stratifications: [StratificationSchema],
|
54
|
+
supplemental_data_elements: [StatementReferenceSchema],
|
55
|
+
observations: [ObservationSchema],
|
56
|
+
});
|
57
|
+
|
58
|
+
module.exports.StratificationSchema = StratificationSchema;
|
59
|
+
class Stratification extends mongoose.Document {
|
60
|
+
constructor(object) {
|
61
|
+
super(object, StratificationSchema);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
module.exports.Stratification = Stratification;
|
65
|
+
|
66
|
+
module.exports.ObservationSchema = ObservationSchema;
|
67
|
+
class Observation extends mongoose.Document {
|
68
|
+
constructor(object) {
|
69
|
+
super(object, ObservationSchema);
|
70
|
+
}
|
71
|
+
}
|
72
|
+
module.exports.Observation = Observation;
|
73
|
+
|
74
|
+
module.exports.PopulationMapSchema = PopulationMapSchema;
|
75
|
+
class PopulationMap extends mongoose.Document {
|
76
|
+
constructor(object) {
|
77
|
+
super(object, PopulationMapSchema);
|
78
|
+
}
|
79
|
+
}
|
80
|
+
module.exports.PopulationMap = PopulationMap;
|
81
|
+
|
82
|
+
module.exports.PopulationSetSchema = PopulationSetSchema;
|
83
|
+
class PopulationSet extends mongoose.Document {
|
84
|
+
constructor(object) {
|
85
|
+
super(object, PopulationSetSchema);
|
86
|
+
}
|
87
|
+
}
|
88
|
+
module.exports.PopulationSet = PopulationSet;
|