loadmop 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cdf767e8d88611fc7c22d76f75fdd7d84f26243a
4
+ data.tar.gz: 82a718413d1ad1ea267713fe341329f08bd47b2b
5
+ SHA512:
6
+ metadata.gz: 225f8f6fd5d8ad11322d54bbe0c8523ede5048a4417dd51e751335fec70e38c4b812c4769cc5c1f968138da0cadc295daf3c94c0935496f85222cbb4d4041bdf
7
+ data.tar.gz: 5f4c71425f17b4c045a139da9cc18c325571a328e86c91b94897441070228d9e093075b1d7a002ce82aa0dac6825073020ba88bcf03d38e55211b3eb5dfd1ff8
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
@@ -0,0 +1,30 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ ## 0.0.2 - 2014-07-11
5
+
6
+ ### Added
7
+ - Nothing.
8
+
9
+ ### Deprecated
10
+ - Nothing.
11
+
12
+ ### Removed
13
+ - Nothing.
14
+
15
+ ### Fixed
16
+ - Bug where schemas directory was not found when loadmop was installed as a gem
17
+
18
+ ## 0.0.1 - 2014-07-10
19
+
20
+ ### Added
21
+ - This project
22
+
23
+ ### Deprecated
24
+ - Nothing.
25
+
26
+ ### Removed
27
+ - Nothing.
28
+
29
+ ### Fixed
30
+ - Nothing.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+ # Specify your gem's dependencies in loadmop.gemspec
3
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Outcomes Insights, Inc.
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,105 @@
1
+ # Loadmop
2
+
3
+ Helps load up the OMOP [Vocabulary](http://imeds.reaganudall.org/Vocabularies)/[CDM](http://omop.org/CDM) into the database of your choice.
4
+
5
+ ## Requirements
6
+
7
+ - Ruby 2.0+
8
+ - [Bundler](http://bundler.io/)
9
+ - Some sort of RDBMS to store OMOP Vocabulary files in
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'loadmop'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install loadmop
24
+
25
+ ## Usage
26
+ Run `bundle exec loadmop` with no arguments to get a help screen and figure out which command you want to run
27
+
28
+ ### Preparation
29
+ Create a .env file in the root directory of the clone, specifying:
30
+
31
+ - SEQUELIZER_DATABASE
32
+ - The name of the database you want to install to
33
+ - Required
34
+ - SEQUELIZER_ADAPTER
35
+ - The name of the adapter to use (e.g. postgres, sqlite, mysql, oracle)
36
+ - Required
37
+ - SEQUELIZER_HOST
38
+ - The host on which the database lives
39
+ - Optional
40
+ - SEQUELIZER_USERNAME
41
+ - The username to connect to the database with
42
+ - Optional
43
+ - SEQUELIZER_PASSWORD
44
+ - The password to connect to the database with
45
+ - Optional
46
+ - SEQUELIZER_SEARCH_PATH
47
+ - At least for PostgreSQL, specifies a schema to install into
48
+ - Optional
49
+
50
+ See the [Sequelizer Gem](https://github.com/outcomesinsights/sequelizer) for [some .env examples](https://github.com/outcomesinsights/sequelizer/tree/master/examples)
51
+
52
+ Then:
53
+
54
+ - **Create the database you just specified in your .env file**
55
+ - loadmop isn't (yet) cool enough to actually create the database for you
56
+ - If you're using SQLite, you don't have to create the database file
57
+ - cd into a directory where you've defined a config/database.yml or .env file that is compatible with Sequelizer
58
+ - run `bundle install` to make sure you have all the needed dependencies installed
59
+ - run `bundle exec sequelizer config` to ensure your connection parameters are correctly set
60
+ - run `bundle exec sequelizer update_gemfile` to ensure your Gemfile has the right database gem
61
+
62
+ ### Loading Vocabulary Files
63
+
64
+ - Download the [OMOP Vocabulary Files](http://vocabbuild.omop.org/vocabulary-release) and unzip them to some directory.
65
+ - I recommend you use the restricted files since they include CPT codes and other useful vocabularies.
66
+ - Run `bundle exec loadmop create_vocab_database /path/to/directory/holding/unzipped/vocabulary/files`
67
+ - This runs all the steps for setting up the vocabulary database, namely
68
+ - Creating the proper tables
69
+ - Prepping the CSV files to load into the database
70
+ - Loading the CSV files into the database
71
+ - Adding some useful indexes to the vocabulary tables
72
+
73
+
74
+ ### Loading CDM Data
75
+ - Run `bundle exec loadmop create_vocab_database /path/to/directory/holding/cdm/data/files`
76
+ - This runs all the steps for loading CDM data into a database, namely
77
+ - Creating the proper CDM tables
78
+ - Prepping the CSV files to load into the database
79
+ - Loading the CSV files into the database
80
+ - Adding some useful indexes to the CDM tables
81
+
82
+ ## Pleas for Help
83
+
84
+ I've written methods to quickly load the data into PostgreSQL and SQLite, but I don't regularly use many other RDBMSs. Right now they use a method that should work for all RDBMSs, but is pretty slow.
85
+
86
+ Some of the faster methods are Unix-only as well. If there are fast, platform-independent ways to load the data, I'm interested.
87
+
88
+ Please submit suggestions or pull requests to speed up loading under other RDBMSs and I'll incorporate them. Thanks!
89
+
90
+ ## Contributing
91
+
92
+ 1. Fork it ( https://github.com/outcomesinsights/loadmop/fork )
93
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
94
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
95
+ 4. Push to the branch (`git push origin my-new-feature`)
96
+ 5. Create a new Pull Request
97
+
98
+ ## Thanks
99
+
100
+ - [Outcomes Insights, Inc.](http://outins.com)
101
+ - Many thanks for allowing me to release a portion of my work as Open Source Software!
102
+ - [IMEDS](http://imeds.reaganudall.org/Vocabularies)/[OMOP](http://omop.org)/[OHDSI](http://ohdsi.org)
103
+ - For developing the vocabulary files. What a fantastic resource!
104
+ - [OMOP](http://omop.org)/[OHDSI](http://ohdsi.org)
105
+ - For developing their [CDM](http://omop.org/CDM)
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../lib/loadmop/cli'
3
+
4
+ Loadmop::CLI.start(ARGV)
@@ -0,0 +1,2 @@
1
+ adapter: sqlite
2
+ database: omop_vocabulary.sqlite
@@ -0,0 +1,5 @@
1
+ require 'loadmop/version'
2
+
3
+ module Loadmop
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,54 @@
1
+ require_relative 'loader'
2
+
3
+ module Loadmop
4
+ class CDMv4Loader < Loader
5
+
6
+ def initialize(*args)
7
+ super(*args)
8
+ set_schema_if_necessary
9
+ end
10
+
11
+ private
12
+
13
+ def schemas_dir
14
+ 'schemas/cdmv4'
15
+ end
16
+
17
+ def files
18
+ ordered_file_names.map { |name| data_files_dir + name }.select(&:exist?)
19
+ end
20
+
21
+ def set_schema_if_necessary
22
+ return unless adapter == 'postgres'
23
+ return unless options[:schema]
24
+ db.create_schema(options[:schema], if_not_exists: true)
25
+ db.execute("SET search_path TO #{options[:schema]}")
26
+ end
27
+
28
+ def ordered_tables
29
+ %w(
30
+ person
31
+ visit_occurrence
32
+ condition_occurrence
33
+ procedure_occurrence
34
+ procedure_cost
35
+ observation
36
+ observation_period
37
+ payer_plan_period
38
+ drug_exposure
39
+ drug_cost
40
+ location
41
+ organization
42
+ provider
43
+ care_site
44
+ condition_era
45
+ death
46
+ cohort
47
+ )
48
+ end
49
+
50
+ def ordered_file_names
51
+ ordered_tables.map { |f| f + '.csv' }
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,23 @@
1
+ require 'thor'
2
+ require_relative 'cdmv4_loader'
3
+ require_relative 'vocab_loader'
4
+
5
+ module Loadmop
6
+ class CLI < Thor
7
+ include Sequelizer
8
+
9
+ desc 'create_vocab_database vocab_files_dir', 'Connects to database specified in the .env file and loads the OMOP Vocabulary schema and data into it'
10
+ def create_vocab_database(vocab_files_dir)
11
+ loader = VocabLoader.new(vocab_files_dir)
12
+ loader.create_database
13
+ end
14
+
15
+ desc 'create_cdmv4_data data_dir', 'Creates a schema in a database for OMOP CDMv4 then loads data into it as specified by data_files_dir'
16
+ option :schema, type: :string, desc: 'PostgreSQL ONLY - specifies the schema within the database that will house the CDM tables and data'
17
+ def create_cdmv4_database(data_files_dir)
18
+ cdm_loader = CDMv4Loader.new(data_files_dir, options)
19
+ cdm_loader.create_database
20
+ end
21
+ end
22
+ end
23
+
@@ -0,0 +1,169 @@
1
+ require 'pathname'
2
+ require 'csv'
3
+ require 'sequelizer'
4
+
5
+ module Loadmop
6
+ class Loader
7
+ include Sequelizer
8
+
9
+ attr :options, :data_files_dir, :headers
10
+
11
+ def initialize(data_files_dir, options = {})
12
+ @data_files_dir = Pathname.new(data_files_dir)
13
+ @options = options
14
+ @headers = {}
15
+ end
16
+
17
+ def create_database
18
+ create_tables
19
+ load_files
20
+ create_indexes
21
+ end
22
+
23
+ private
24
+ def create_tables
25
+ Sequel.extension :migration
26
+ Sequel::Migrator.run(db, base_dir + schemas_dir, target: 1)
27
+ end
28
+
29
+ def create_indexes
30
+ Sequel.extension :migration
31
+ Sequel::Migrator.run(db, base_dir + schemas_dir, target: 2)
32
+ end
33
+
34
+ def all_files
35
+ @all_files ||= make_all_files
36
+ end
37
+
38
+ def load_files
39
+ fast_load || slow_load
40
+ end
41
+
42
+ def fast_load
43
+ case adapter
44
+ when 'postgres'
45
+ fast_load_postgres
46
+ when 'sqlite'
47
+ fast_load_sqlite
48
+ else
49
+ nil
50
+ end
51
+ end
52
+
53
+ def fast_load_postgres
54
+ all_files.each do |table_name, files|
55
+ db[table_name].truncate(cascade: true)
56
+ files.each do |file|
57
+ puts "Loading #{file} into #{table_name}"
58
+ db.copy_into(
59
+ table_name,
60
+ format: :csv,
61
+ columns: headers[table_name],
62
+ data: File.read(file)
63
+ )
64
+ end
65
+ end
66
+ true
67
+ end
68
+
69
+ def fast_load_sqlite
70
+ return nil if `which sqlite3` =~ /not found/i
71
+ all_files.each do |table_name, files|
72
+ run_sqlite_commands(%Q(DELETE FROM #{table_name};))
73
+ commands = []
74
+ commands << %Q(.echo on)
75
+ commands << %Q(.log stdout)
76
+ commands << %Q(.mode csv)
77
+ commands << "placeholder"
78
+ files.each do |file|
79
+ puts "Loading #{file} into #{table_name}"
80
+ commands.pop
81
+ commands << ".import #{file} #{table_name}"
82
+ run_sqlite_commands(commands)
83
+ end
84
+ end
85
+ true
86
+ end
87
+
88
+ def run_sqlite_commands(*commands)
89
+ db_file_path = database
90
+ File.open('/tmp/sqlite.load', 'w') do |command_file|
91
+ command_file.puts commands.flatten.join("\n")
92
+ end
93
+ command = "sqlite3 #{db_file_path} '.read /tmp/sqlite.load'"
94
+ puts command
95
+ system(command)
96
+ end
97
+
98
+ def slow_load
99
+ all_files.each do |table_name, files|
100
+ files.each do |file|
101
+ puts "Loading #{file} into #{table_name}"
102
+ CSV.open(file, headers: true) do |csv|
103
+ csv.each_slice(1000) do |rows|
104
+ print '.'
105
+ db[table_name].import(headers_for(file), rows.map(&:fields))
106
+ end
107
+ end
108
+ puts
109
+ end
110
+ end
111
+ end
112
+
113
+ def adapter
114
+ db.sequelizer_options.adapter
115
+ end
116
+
117
+ def database
118
+ db.sequelizer_options.database
119
+ end
120
+
121
+ def headers_for(file)
122
+ header_line = File.open(file, &:readline).downcase.gsub(/\|$/, '')
123
+ CSV.parse(header_line).first.map(&:to_sym)
124
+ end
125
+
126
+ def files_of_interest
127
+ Pathname.glob(data_files_dir + '*.csv')
128
+ end
129
+
130
+ def lines_per_split
131
+ 100000
132
+ end
133
+
134
+ def additional_cleaning_steps
135
+ []
136
+ end
137
+
138
+ def make_all_files
139
+ split_dir = data_files_dir + 'split'
140
+ split_dir.mkdir unless split_dir.exist?
141
+ files = files_of_interest.map do |file|
142
+ table_name = file.basename('.*').to_s.downcase.to_sym
143
+ headers[table_name] = headers_for(file)
144
+ dir = split_dir + table_name.to_s
145
+ unless dir.exist?
146
+ dir.mkdir
147
+ Dir.chdir(dir) do
148
+ puts "Splitting #{file}"
149
+ steps = []
150
+ steps << "tail -n +2 #{file.expand_path}"
151
+ steps += additional_cleaning_steps
152
+ steps << "split -a 5 -l #{lines_per_split}"
153
+ system(steps.compact.join(" | "))
154
+ end
155
+ end
156
+ [table_name, dir.children.sort]
157
+ end
158
+
159
+ Hash[files]
160
+ end
161
+
162
+ # When installed as a gem, we need to find where the gem is installed
163
+ # and look for files relative to that path. base_dir returns the
164
+ # path to the loadmop gem
165
+ def base_dir
166
+ Pathname.new(__FILE__).dirname + '../..'
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,3 @@
1
+ module Loadmop
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,17 @@
1
+ require_relative 'loader'
2
+
3
+ module Loadmop
4
+ class VocabLoader < Loader
5
+
6
+ private
7
+
8
+ def schemas_dir
9
+ 'schemas/vocabulary'
10
+ end
11
+
12
+ def additional_cleaning_steps
13
+ ["sed 's/\|$//'"]
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'loadmop/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'loadmop'
8
+ spec.version = Loadmop::VERSION
9
+ spec.authors = ['Ryan Duryea']
10
+ spec.email = ['aguynamedryan@gmail.com']
11
+ spec.summary = %q{Ruby-based script to load OMOP Vocabulary/CDMv4 data into a database}
12
+ spec.description = %q{loadmop assits in loading OMOP Vocabulary files and OMOP CDMv4-compatible CSV files into your database}
13
+ spec.homepage = 'https://github.com/outcomesinsights/loadmop'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.6'
22
+ spec.add_dependency 'rake', '~> 10.3'
23
+ spec.add_dependency 'sequelizer', '~> 0.0'
24
+ spec.add_dependency 'thor', '~> 0.19'
25
+ end
@@ -0,0 +1,256 @@
1
+ Sequel.migration do
2
+ change do
3
+ create_table(:care_site, :ignore_index_errors=>true) do
4
+ Bignum :care_site_id, :null=>false
5
+ Bignum :location_id, :null=>false
6
+ Bignum :organization_id, :null=>false
7
+ Bignum :place_of_service_concept_id
8
+ String :care_site_source_value, :size=>50
9
+ String :place_of_service_source_value, :size=>50, :null=>false
10
+
11
+ primary_key [:care_site_id]
12
+ end
13
+
14
+ create_table(:cohort, :ignore_index_errors=>true) do
15
+ Bignum :cohort_id, :null=>false
16
+ Bignum :cohort_concept_id, :null=>false
17
+ Date :cohort_start_date, :null=>false
18
+ Date :cohort_end_date
19
+ Bignum :subject_id, :null=>false
20
+ String :stop_reason, :size=>20
21
+
22
+ primary_key [:cohort_id]
23
+ end
24
+
25
+ create_table(:location, :ignore_index_errors=>true) do
26
+ Bignum :location_id, :null=>false
27
+ String :address_1, :size=>50
28
+ String :address_2, :size=>50
29
+ String :city, :size=>50
30
+ String :state, :size=>2, :fixed=>true
31
+ String :zip, :size=>9
32
+ String :county, :size=>20
33
+ String :location_source_value, :size=>50
34
+
35
+ primary_key [:location_id]
36
+ end
37
+
38
+ create_table(:provider, :ignore_index_errors=>true) do
39
+ Bignum :provider_id, :null=>false
40
+ String :npi, :size=>20
41
+ String :dea, :size=>20
42
+ Bignum :specialty_concept_id
43
+ Bignum :care_site_id, :null=>false
44
+ String :provider_source_value, :size=>50, :null=>false
45
+ String :specialty_source_value, :size=>50
46
+
47
+ primary_key [:provider_id]
48
+ end
49
+
50
+ create_table(:organization, :ignore_index_errors=>true) do
51
+ Bignum :organization_id, :null=>false
52
+ Bignum :place_of_service_concept_id
53
+ foreign_key :location_id, :location, :type=>Bignum, :key=>[:location_id]
54
+ String :organization_source_value, :size=>50, :null=>false
55
+ String :place_of_service_source_value, :size=>50
56
+
57
+ primary_key [:organization_id]
58
+ end
59
+
60
+ create_table(:person, :ignore_index_errors=>true) do
61
+ Bignum :person_id, :null=>false
62
+ Bignum :gender_concept_id, :null=>false
63
+ Integer :year_of_birth, :null=>false
64
+ Integer :month_of_birth
65
+ Integer :day_of_birth
66
+ Bignum :race_concept_id
67
+ Bignum :ethnicity_concept_id
68
+ foreign_key :location_id, :location, :type=>Bignum, :key=>[:location_id]
69
+ foreign_key :provider_id, :provider, :type=>Bignum, :key=>[:provider_id]
70
+ Bignum :care_site_id
71
+ String :person_source_value, :size=>50
72
+ String :gender_source_value, :size=>50
73
+ String :race_source_value, :size=>50
74
+ String :ethnicity_source_value, :size=>50
75
+
76
+ primary_key [:person_id]
77
+ end
78
+
79
+ create_table(:condition_era, :ignore_index_errors=>true) do
80
+ Bignum :condition_era_id, :null=>false
81
+ foreign_key :person_id, :person, :type=>Bignum, :null=>false, :key=>[:person_id]
82
+ Bignum :condition_concept_id, :null=>false
83
+ Date :condition_era_start_date, :null=>false
84
+ Date :condition_era_end_date, :null=>false
85
+ Bignum :condition_type_concept_id, :null=>false
86
+ Integer :condition_occurrence_count
87
+
88
+ primary_key [:condition_era_id]
89
+ end
90
+
91
+ create_table(:condition_occurrence, :ignore_index_errors=>true) do
92
+ Bignum :condition_occurrence_id, :null=>false
93
+ foreign_key :person_id, :person, :type=>Bignum, :null=>false, :key=>[:person_id]
94
+ Bignum :condition_concept_id, :null=>false
95
+ Date :condition_start_date, :null=>false
96
+ Date :condition_end_date
97
+ Bignum :condition_type_concept_id, :null=>false
98
+ String :stop_reason, :size=>20
99
+ Bignum :associated_provider_id
100
+ Bignum :visit_occurrence_id
101
+ String :condition_source_value, :size=>50
102
+
103
+ primary_key [:condition_occurrence_id]
104
+ end
105
+
106
+ create_table(:death, :ignore_index_errors=>true) do
107
+ foreign_key :person_id, :person, :type=>Bignum, :null=>false, :key=>[:person_id]
108
+ Date :death_date, :null=>false
109
+ Bignum :death_type_concept_id, :null=>false
110
+ Bignum :cause_of_death_concept_id
111
+ String :cause_of_death_source_value, :size=>50
112
+
113
+ primary_key [:person_id]
114
+ end
115
+
116
+ create_table(:drug_era, :ignore_index_errors=>true) do
117
+ Bignum :drug_era_id, :null=>false
118
+ foreign_key :person_id, :person, :type=>Bignum, :null=>false, :key=>[:person_id]
119
+ Bignum :drug_concept_id, :null=>false
120
+ Date :drug_era_start_date, :null=>false
121
+ Date :drug_era_end_date, :null=>false
122
+ Bignum :drug_type_concept_id, :null=>false
123
+ Integer :drug_exposure_count
124
+
125
+ primary_key [:drug_era_id]
126
+ end
127
+
128
+ create_table(:drug_exposure, :ignore_index_errors=>true) do
129
+ Bignum :drug_exposure_id, :null=>false
130
+ foreign_key :person_id, :person, :type=>Bignum, :null=>false, :key=>[:person_id]
131
+ Bignum :drug_concept_id, :null=>false
132
+ Date :drug_exposure_start_date, :null=>false
133
+ Date :drug_exposure_end_date
134
+ Bignum :drug_type_concept_id, :null=>false
135
+ String :stop_reason, :size=>20
136
+ Integer :refills
137
+ Integer :quantity
138
+ Integer :days_supply
139
+ String :sig, :size=>500
140
+ Bignum :prescribing_provider_id
141
+ Bignum :visit_occurrence_id
142
+ Bignum :relevant_condition_concept_id
143
+ String :drug_source_value, :size=>50
144
+
145
+ primary_key [:drug_exposure_id]
146
+ end
147
+
148
+ create_table(:observation, :ignore_index_errors=>true) do
149
+ Bignum :observation_id, :null=>false
150
+ foreign_key :person_id, :person, :type=>Bignum, :null=>false, :key=>[:person_id]
151
+ Bignum :observation_concept_id, :null=>false
152
+ Date :observation_date, :null=>false
153
+ Date :observation_time
154
+ Float :value_as_number
155
+ String :value_as_string, :size=>60
156
+ Bignum :value_as_concept_id
157
+ Bignum :unit_concept_id
158
+ Float :range_low
159
+ Float :range_high
160
+ Bignum :observation_type_concept_id, :null=>false
161
+ Bignum :associated_provider_id
162
+ Bignum :visit_occurrence_id
163
+ Bignum :relevant_condition_concept_id
164
+ String :observation_source_value, :size=>50
165
+ String :units_source_value, :size=>50
166
+
167
+ primary_key [:observation_id]
168
+ end
169
+
170
+ create_table(:observation_period, :ignore_index_errors=>true) do
171
+ Bignum :observation_period_id, :null=>false
172
+ foreign_key :person_id, :person, :type=>Bignum, :null=>false, :key=>[:person_id]
173
+ Date :observation_period_start_date, :null=>false
174
+ Date :observation_period_end_date, :null=>false
175
+ Date :prev_ds_period_end_date
176
+
177
+ primary_key [:observation_period_id]
178
+ end
179
+
180
+ create_table(:payer_plan_period, :ignore_index_errors=>true) do
181
+ Bignum :payer_plan_period_id, :null=>false
182
+ foreign_key :person_id, :person, :type=>Bignum, :null=>false, :key=>[:person_id]
183
+ Date :payer_plan_period_start_date, :null=>false
184
+ Date :payer_plan_period_end_date, :null=>false
185
+ String :payer_source_value, :size=>50
186
+ String :plan_source_value, :size=>50
187
+ String :family_source_value, :size=>50
188
+ Date :prev_ds_period_end_date
189
+
190
+ primary_key [:payer_plan_period_id]
191
+ end
192
+
193
+ create_table(:procedure_occurrence, :ignore_index_errors=>true) do
194
+ Bignum :procedure_occurrence_id, :null=>false
195
+ foreign_key :person_id, :person, :type=>Bignum, :null=>false, :key=>[:person_id]
196
+ Bignum :procedure_concept_id, :null=>false
197
+ Date :procedure_date, :null=>false
198
+ Bignum :procedure_type_concept_id, :null=>false
199
+ Bignum :associated_provider_id
200
+ Bignum :visit_occurrence_id
201
+ Bignum :relevant_condition_concept_id
202
+ String :procedure_source_value, :size=>50
203
+
204
+ primary_key [:procedure_occurrence_id]
205
+ end
206
+
207
+ create_table(:visit_occurrence, :ignore_index_errors=>true) do
208
+ Bignum :visit_occurrence_id, :null=>false
209
+ foreign_key :person_id, :person, :type=>Bignum, :null=>false, :key=>[:person_id]
210
+ Date :visit_start_date, :null=>false
211
+ Date :visit_end_date, :null=>false
212
+ Bignum :place_of_service_concept_id, :null=>false
213
+ Bignum :care_site_id
214
+ String :place_of_service_source_value, :size=>50
215
+
216
+ primary_key [:visit_occurrence_id]
217
+ end
218
+
219
+ create_table(:drug_cost, :ignore_index_errors=>true) do
220
+ Bignum :drug_cost_id, :null=>false
221
+ foreign_key :drug_exposure_id, :drug_exposure, :type=>Bignum, :null=>false, :key=>[:drug_exposure_id]
222
+ Float :paid_copay
223
+ Float :paid_coinsurance
224
+ Float :paid_toward_deductible
225
+ Float :paid_by_payer
226
+ Float :paid_by_coordination_benefits
227
+ Float :total_out_of_pocket
228
+ Float :total_paid
229
+ Float :ingredient_cost
230
+ Float :dispensing_fee
231
+ Float :average_wholesale_price
232
+ Bignum :payer_plan_period_id
233
+
234
+ primary_key [:drug_cost_id]
235
+ end
236
+
237
+ create_table(:procedure_cost, :ignore_index_errors=>true) do
238
+ Bignum :procedure_cost_id, :null=>false
239
+ foreign_key :procedure_occurrence_id, :procedure_occurrence, :type=>Bignum, :null=>false, :key=>[:procedure_occurrence_id]
240
+ Float :paid_copay
241
+ Float :paid_coinsurance
242
+ Float :paid_toward_deductible
243
+ Float :paid_by_payer
244
+ Float :paid_by_coordination_benefits
245
+ Float :total_out_of_pocket
246
+ Float :total_paid
247
+ Bignum :disease_class_concept_id
248
+ Bignum :revenue_code_concept_id
249
+ Bignum :payer_plan_period_id
250
+ String :disease_class_source_value, :size=>50
251
+ String :revenue_code_source_value, :size=>50
252
+
253
+ primary_key [:procedure_cost_id]
254
+ end
255
+ end
256
+ end
@@ -0,0 +1,145 @@
1
+ Sequel.migration do
2
+ change do
3
+ alter_table(:care_site) do
4
+ add_index [:location_id, :organization_id, :place_of_service_source_value], :name=>:care_site_location_id_organization_id_place_of_service_sour_key, :unique=>true, :ignore_add_index_errors=>true
5
+ add_index [:care_site_id], :name=>:carsit_carsitid, :ignore_add_index_errors=>true
6
+ add_index [:location_id], :name=>:carsit_locid, :ignore_add_index_errors=>true
7
+ add_index [:organization_id], :name=>:carsit_orgid, :ignore_add_index_errors=>true
8
+ add_index [:place_of_service_concept_id], :name=>:carsit_plaofserconid, :ignore_add_index_errors=>true
9
+ add_index [:location_id, :organization_id, :place_of_service_source_value, :care_site_id], :name=>:idx_care_site_org_sources, :ignore_add_index_errors=>true
10
+ end
11
+
12
+ alter_table(:cohort) do
13
+ add_index [:cohort_concept_id], :name=>:coh_cohconid, :ignore_add_index_errors=>true
14
+ add_index [:cohort_id], :name=>:coh_cohid, :ignore_add_index_errors=>true
15
+ add_index [:subject_id], :name=>:coh_subid, :ignore_add_index_errors=>true
16
+ end
17
+
18
+ alter_table(:location) do
19
+ add_index [:location_id], :name=>:loc_locid, :ignore_add_index_errors=>true
20
+ add_index [:zip, :county], :name=>:location_zip_county_key, :unique=>true, :ignore_add_index_errors=>true
21
+ end
22
+
23
+ alter_table(:provider) do
24
+ add_index [:provider_source_value, :specialty_source_value, :provider_id, :care_site_id], :name=>:idx_provider_lkp, :ignore_add_index_errors=>true
25
+ add_index [:care_site_id], :name=>:pro_carsitid, :ignore_add_index_errors=>true
26
+ add_index [:provider_id], :name=>:pro_proid, :ignore_add_index_errors=>true
27
+ add_index [:specialty_concept_id], :name=>:pro_speconid, :ignore_add_index_errors=>true
28
+ end
29
+
30
+ alter_table(:organization) do
31
+ add_index [:location_id], :name=>:org_locid, :ignore_add_index_errors=>true
32
+ add_index [:organization_id], :name=>:org_orgid, :ignore_add_index_errors=>true
33
+ add_index [:place_of_service_concept_id], :name=>:org_plaofserconid, :ignore_add_index_errors=>true
34
+ end
35
+
36
+ alter_table(:person) do
37
+ add_index [:care_site_id], :name=>:per_carsitid, :ignore_add_index_errors=>true
38
+ add_index [:ethnicity_concept_id], :name=>:per_ethconid, :ignore_add_index_errors=>true
39
+ add_index [:gender_concept_id], :name=>:per_genconid, :ignore_add_index_errors=>true
40
+ add_index [:location_id], :name=>:per_locid, :ignore_add_index_errors=>true
41
+ add_index [:person_id], :name=>:per_perid, :ignore_add_index_errors=>true
42
+ add_index [:provider_id], :name=>:per_proid, :ignore_add_index_errors=>true
43
+ add_index [:race_concept_id], :name=>:per_racconid, :ignore_add_index_errors=>true
44
+ end
45
+
46
+ alter_table(:condition_era) do
47
+ add_index [:condition_concept_id], :name=>:conera_conconid, :ignore_add_index_errors=>true
48
+ add_index [:condition_era_id], :name=>:conera_coneraid, :ignore_add_index_errors=>true
49
+ add_index [:condition_type_concept_id], :name=>:conera_contypconid, :ignore_add_index_errors=>true
50
+ add_index [:person_id], :name=>:conera_perid, :ignore_add_index_errors=>true
51
+ end
52
+
53
+ alter_table(:condition_occurrence) do
54
+ add_index [:condition_concept_id], :name=>:cci, :ignore_add_index_errors=>true
55
+ add_index [:associated_provider_id], :name=>:conocc_assproid, :ignore_add_index_errors=>true
56
+ add_index [:condition_concept_id], :name=>:conocc_conconid, :ignore_add_index_errors=>true
57
+ add_index [:condition_occurrence_id], :name=>:conocc_conoccid, :ignore_add_index_errors=>true
58
+ add_index [:condition_source_value], :name=>:conocc_consouval, :ignore_add_index_errors=>true
59
+ add_index [:condition_type_concept_id], :name=>:conocc_contypconid, :ignore_add_index_errors=>true
60
+ add_index [:person_id], :name=>:conocc_perid, :ignore_add_index_errors=>true
61
+ add_index [:visit_occurrence_id], :name=>:conocc_visoccid, :ignore_add_index_errors=>true
62
+ add_index [:visit_occurrence_id], :name=>:voi, :ignore_add_index_errors=>true
63
+ end
64
+
65
+ alter_table(:death) do
66
+ add_index [:cause_of_death_concept_id], :name=>:dea_cauofdeaconid, :ignore_add_index_errors=>true
67
+ add_index [:death_type_concept_id], :name=>:dea_deatypconid, :ignore_add_index_errors=>true
68
+ add_index [:person_id], :name=>:dea_perid, :ignore_add_index_errors=>true
69
+ end
70
+
71
+ alter_table(:drug_era) do
72
+ add_index [:drug_concept_id], :name=>:druera_druconid, :ignore_add_index_errors=>true
73
+ add_index [:drug_era_id], :name=>:druera_drueraid, :ignore_add_index_errors=>true
74
+ add_index [:drug_type_concept_id], :name=>:druera_drutypconid, :ignore_add_index_errors=>true
75
+ add_index [:person_id], :name=>:druera_perid, :ignore_add_index_errors=>true
76
+ end
77
+
78
+ alter_table(:drug_exposure) do
79
+ add_index [:drug_concept_id], :name=>:druexp_druconid, :ignore_add_index_errors=>true
80
+ add_index [:drug_exposure_id], :name=>:druexp_druexpid, :ignore_add_index_errors=>true
81
+ add_index [:drug_type_concept_id], :name=>:druexp_drutypconid, :ignore_add_index_errors=>true
82
+ add_index [:person_id], :name=>:druexp_perid, :ignore_add_index_errors=>true
83
+ add_index [:prescribing_provider_id], :name=>:druexp_preproid, :ignore_add_index_errors=>true
84
+ add_index [:relevant_condition_concept_id], :name=>:druexp_relconconid, :ignore_add_index_errors=>true
85
+ add_index [:visit_occurrence_id], :name=>:druexp_visoccid, :ignore_add_index_errors=>true
86
+ end
87
+
88
+ alter_table(:observation) do
89
+ add_index [:associated_provider_id], :name=>:obs_assproid, :ignore_add_index_errors=>true
90
+ add_index [:observation_concept_id], :name=>:obs_obsconid, :ignore_add_index_errors=>true
91
+ add_index [:observation_id], :name=>:obs_obsid, :ignore_add_index_errors=>true
92
+ add_index [:observation_type_concept_id], :name=>:obs_obstypconid, :ignore_add_index_errors=>true
93
+ add_index [:person_id], :name=>:obs_perid, :ignore_add_index_errors=>true
94
+ add_index [:relevant_condition_concept_id], :name=>:obs_relconconid, :ignore_add_index_errors=>true
95
+ add_index [:unit_concept_id], :name=>:obs_uniconid, :ignore_add_index_errors=>true
96
+ add_index [:value_as_concept_id], :name=>:obs_valasconid, :ignore_add_index_errors=>true
97
+ add_index [:visit_occurrence_id], :name=>:obs_visoccid, :ignore_add_index_errors=>true
98
+ end
99
+
100
+ alter_table(:observation_period) do
101
+ add_index [:person_id, :observation_period_start_date, :observation_period_end_date], :name=>:idx_observation_period_lkp, :ignore_add_index_errors=>true
102
+ add_index [:observation_period_id], :name=>:obsper_obsperid, :ignore_add_index_errors=>true
103
+ add_index [:person_id], :name=>:obsper_perid, :ignore_add_index_errors=>true
104
+ end
105
+
106
+ alter_table(:payer_plan_period) do
107
+ add_index [:person_id, :plan_source_value, :payer_plan_period_start_date, :payer_plan_period_end_date], :name=>:idx_payer_plan_period_lkp, :ignore_add_index_errors=>true
108
+ add_index [:payer_plan_period_id], :name=>:payplaper_payplaperid, :ignore_add_index_errors=>true
109
+ add_index [:person_id], :name=>:payplaper_perid, :ignore_add_index_errors=>true
110
+ end
111
+
112
+ alter_table(:procedure_occurrence) do
113
+ add_index [:associated_provider_id], :name=>:proocc_assproid, :ignore_add_index_errors=>true
114
+ add_index [:person_id], :name=>:proocc_perid, :ignore_add_index_errors=>true
115
+ add_index [:procedure_concept_id], :name=>:proocc_proconid, :ignore_add_index_errors=>true
116
+ add_index [:procedure_occurrence_id], :name=>:proocc_prooccid, :ignore_add_index_errors=>true
117
+ add_index [:procedure_source_value], :name=>:proocc_prosouval, :ignore_add_index_errors=>true
118
+ add_index [:procedure_type_concept_id], :name=>:proocc_protypconid, :ignore_add_index_errors=>true
119
+ add_index [:relevant_condition_concept_id], :name=>:proocc_relconconid, :ignore_add_index_errors=>true
120
+ add_index [:visit_occurrence_id], :name=>:proocc_visoccid, :ignore_add_index_errors=>true
121
+ end
122
+
123
+ alter_table(:visit_occurrence) do
124
+ add_index [:person_id, :visit_start_date, :place_of_service_concept_id], :name=>:visit_occurrence_person_id_visit_start_date_place_of_servic_key, :ignore_add_index_errors=>true
125
+ add_index [:care_site_id], :name=>:visocc_carsitid, :ignore_add_index_errors=>true
126
+ add_index [:person_id], :name=>:visocc_perid, :ignore_add_index_errors=>true
127
+ add_index [:place_of_service_concept_id], :name=>:visocc_plaofserconid, :ignore_add_index_errors=>true
128
+ add_index [:visit_occurrence_id], :name=>:visocc_visoccid, :ignore_add_index_errors=>true
129
+ end
130
+
131
+ alter_table(:drug_cost) do
132
+ add_index [:drug_cost_id], :name=>:drucos_drucosid, :ignore_add_index_errors=>true
133
+ add_index [:drug_exposure_id], :name=>:drucos_druexpid, :ignore_add_index_errors=>true
134
+ add_index [:payer_plan_period_id], :name=>:drucos_payplaperid, :ignore_add_index_errors=>true
135
+ end
136
+
137
+ alter_table(:procedure_cost) do
138
+ add_index [:disease_class_concept_id], :name=>:procos_disclaconid, :ignore_add_index_errors=>true
139
+ add_index [:payer_plan_period_id], :name=>:procos_payplaperid, :ignore_add_index_errors=>true
140
+ add_index [:procedure_cost_id], :name=>:procos_procosid, :ignore_add_index_errors=>true
141
+ add_index [:procedure_occurrence_id], :name=>:procos_prooccid, :ignore_add_index_errors=>true
142
+ add_index [:revenue_code_concept_id], :name=>:procos_revcodconid, :ignore_add_index_errors=>true
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,96 @@
1
+ Sequel.migration do
2
+ change do
3
+ create_table(:concept) do
4
+ Bignum :concept_id, :null=>false
5
+ String :concept_name, :null=>false
6
+ BigDecimal :concept_level, :null=>false
7
+ String :concept_class, :null=>false
8
+ Bignum :vocabulary_id, :null=>false
9
+ String :concept_code, :null=>false
10
+ Date :valid_start_date, :null=>false
11
+ Date :valid_end_date, :null=>false
12
+ String :invalid_reason, :size=>1, :fixed=>true
13
+
14
+ primary_key [:concept_id]
15
+ end
16
+
17
+ create_table(:concept_ancestor) do
18
+ Bignum :ancestor_concept_id, :null=>false
19
+ Bignum :descendant_concept_id, :null=>false
20
+ BigDecimal :min_levels_of_separation
21
+ BigDecimal :max_levels_of_separation
22
+
23
+ primary_key [:ancestor_concept_id, :descendant_concept_id]
24
+ end
25
+
26
+ create_table(:concept_relationship) do
27
+ Bignum :concept_id_1, :null=>false
28
+ Bignum :concept_id_2, :null=>false
29
+ Bignum :relationship_id, :null=>false
30
+ Date :valid_start_date, :null=>false
31
+ Date :valid_end_date, :null=>false
32
+ String :invalid_reason, :size=>1, :fixed=>true
33
+
34
+ primary_key [:concept_id_1, :concept_id_2, :relationship_id]
35
+ end
36
+
37
+ create_table(:concept_synonym) do
38
+ Bignum :concept_synonym_id, :null=>false
39
+ Bignum :concept_id, :null=>false
40
+ String :concept_synonym_name, :null=>false
41
+
42
+ primary_key [:concept_synonym_id]
43
+ end
44
+
45
+ create_table(:drug_approval) do
46
+ Bignum :ingredient_concept_id, :null => false
47
+ Date :approval_date, :null => false
48
+ String :approved_by, :null => false
49
+ end
50
+
51
+ create_table(:drug_strength) do
52
+ Bignum :drug_concept_id, :null => false
53
+ Bignum :ingredient_concept_id, :null => false
54
+ BigDecimal :amount_value
55
+ String :amount_unit
56
+ BigDecimal :concentration_value
57
+ String :concentration_enum_unit
58
+ String :concentration_denom_unit
59
+ Date :valid_start_date, :null => false
60
+ Date :valid_end_date, :null => false
61
+ String :invalid_reason
62
+ end
63
+
64
+ create_table(:relationship) do
65
+ Bignum :relationship_id, :null=>false
66
+ String :relationship_name, :null=>false
67
+ String :is_hierarchical, :size=>1, :fixed=>true
68
+ String :defines_ancestry, :size=>1, :fixed=>true
69
+ Bignum :reverse_relationship
70
+
71
+ primary_key [:relationship_id]
72
+ end
73
+
74
+ create_table(:source_to_concept_map) do
75
+ String :source_code, :null=>false
76
+ Bignum :source_vocabulary_id, :null=>false
77
+ String :source_code_description
78
+ Bignum :target_concept_id, :null=>false
79
+ Bignum :target_vocabulary_id, :null=>false
80
+ String :mapping_type
81
+ String :primary_map, :size=>1, :fixed=>true
82
+ Date :valid_start_date, :null=>false
83
+ Date :valid_end_date, :null=>false
84
+ String :invalid_reason, :size=>1, :fixed=>true
85
+
86
+ primary_key [:source_code, :source_vocabulary_id, :target_concept_id, :valid_end_date]
87
+ end
88
+
89
+ create_table(:vocabulary) do
90
+ Bignum :vocabulary_id, :null=>false
91
+ String :vocabulary_name, :null=>false
92
+
93
+ primary_key [:vocabulary_id]
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,24 @@
1
+
2
+ Sequel.migration do
3
+ change do
4
+ puts "Adding indexes"
5
+ def do_index(*args)
6
+ puts args.inspect
7
+ add_index(*args)
8
+ rescue
9
+ puts $!.message
10
+ #nothing
11
+ end
12
+ do_index :concept, [:concept_code], name: "vocabulary_concept_concept_code_index"
13
+ do_index :concept, [:concept_id], name: "con_conid"
14
+ do_index :concept, [:vocabulary_id], name: "con_vocid"
15
+ do_index :concept_ancestor, [:ancestor_concept_id], name: "conanc_ancconid"
16
+ do_index :concept_ancestor, [:descendant_concept_id], name: "conanc_desconid"
17
+ do_index :concept_relationship, [:relationship_id], name: "conrel_relid"
18
+ do_index :relationship, [:relationship_id], name: "rel_relid"
19
+ do_index :source_to_concept_map, [:source_code, :source_vocabulary_id], name: "soutoconmap_soucod_souvocid"
20
+ do_index :source_to_concept_map, [:source_vocabulary_id], name: "soutoconmap_souvocid"
21
+ do_index :source_to_concept_map, [:target_concept_id], name: "soutoconmap_tarconid"
22
+ do_index :source_to_concept_map, [:target_vocabulary_id], name: "soutoconmap_tarvocid"
23
+ end
24
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: loadmop
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Duryea
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sequelizer
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.19'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.19'
69
+ description: loadmop assits in loading OMOP Vocabulary files and OMOP CDMv4-compatible
70
+ CSV files into your database
71
+ email:
72
+ - aguynamedryan@gmail.com
73
+ executables:
74
+ - loadmop
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - ".gitignore"
79
+ - CHANGELOG.md
80
+ - Gemfile
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - bin/loadmop
85
+ - config/database.yml.example
86
+ - lib/loadmop.rb
87
+ - lib/loadmop/cdmv4_loader.rb
88
+ - lib/loadmop/cli.rb
89
+ - lib/loadmop/loader.rb
90
+ - lib/loadmop/version.rb
91
+ - lib/loadmop/vocab_loader.rb
92
+ - loadmop.gemspec
93
+ - schemas/cdmv4/001_tables.rb
94
+ - schemas/cdmv4/002_indexes.rb
95
+ - schemas/vocabulary/001_tables.rb
96
+ - schemas/vocabulary/002_indexes.rb
97
+ homepage: https://github.com/outcomesinsights/loadmop
98
+ licenses:
99
+ - MIT
100
+ metadata: {}
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 2.2.2
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: Ruby-based script to load OMOP Vocabulary/CDMv4 data into a database
121
+ test_files: []
122
+ has_rdoc: