ensembl 0.0.6 → 0.0.7
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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Gemfile +0 -3
- data/README.md +2 -14
- data/config/database.yml.example +17 -0
- data/ensembl.gemspec +1 -1
- data/lib/ensembl/core/activerecord.rb +1 -7
- data/lib/ensembl/helpers/like_search.rb +22 -0
- data/lib/ensembl/helpers/variation_position.rb +30 -0
- data/lib/ensembl/variation/activerecord.rb +209 -51
- data/lib/ensembl/variation/tableless.rb +2 -4
- data/lib/ensembl/version.rb +1 -1
- data/lib/ensembl.rb +15 -95
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16d2860f71a33c2c465b0fccf217377d71d583d9
|
4
|
+
data.tar.gz: bb8022c713d11e6fcc6c5baed00676bb3d9edd93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdf044fbd9e8c20534d035448afc3b2ee272ed229ebdca887e66f982f17881039b91e3ea8cc1186993893c45a130a9900f48e019046143807bf8d39dd47b3d95
|
7
|
+
data.tar.gz: 8f0aba8e3951d048296d4baab25e65e82d3c4244918856bd5890e43c9be2262d191a37b5e7c0d42e6ddc32659983ea34b28167a957021b04158d73b58e26bb1f
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -20,25 +20,13 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
-
|
23
|
+
Copy config/database.yml.example to database.yml and change parameters if needed
|
24
24
|
|
25
|
-
###
|
25
|
+
### Using
|
26
26
|
|
27
27
|
Ensembl::Variation::Variation.first
|
28
28
|
|
29
29
|
Ensembl::Variation::Variation.first.source
|
30
|
-
|
31
|
-
### Custom database
|
32
|
-
|
33
|
-
# Set following values before using - Only Human databases is somewhat tested.
|
34
|
-
|
35
|
-
Ensembl.host = 'myhost.example.com'
|
36
|
-
Ensembl.port = 3306 # default
|
37
|
-
Ensembl.username = 'anonymous' # default
|
38
|
-
Ensembl.password = '' # default
|
39
|
-
Ensembl.species = 'homo_sapiens' # default
|
40
|
-
Ensembl.version = 75 # default
|
41
|
-
Ensembl.hg_version = 37 # default
|
42
30
|
|
43
31
|
|
44
32
|
## Contributing
|
@@ -0,0 +1,17 @@
|
|
1
|
+
default: &default
|
2
|
+
adapter: mysql2
|
3
|
+
host: ensembldb.ensembl.org
|
4
|
+
port: 3306
|
5
|
+
username: anonymous
|
6
|
+
password: ''
|
7
|
+
reconnect: true
|
8
|
+
timeout: 1000
|
9
|
+
pool: 5
|
10
|
+
|
11
|
+
core:
|
12
|
+
<<: *default
|
13
|
+
database: homo_sapiens_core_75_37
|
14
|
+
|
15
|
+
variation:
|
16
|
+
<<: *default
|
17
|
+
database: homo_sapiens_variation_75_37
|
data/ensembl.gemspec
CHANGED
@@ -12,13 +12,7 @@ module Ensembl
|
|
12
12
|
|
13
13
|
self.abstract_class = true
|
14
14
|
|
15
|
-
self.establish_connection :
|
16
|
-
:host => Ensembl.host,
|
17
|
-
:username => Ensembl.username,
|
18
|
-
:password => Ensembl.password,
|
19
|
-
:database => Ensembl.species+'_core_'+Ensembl.version+'_'+Ensembl.hg_version,
|
20
|
-
:reconnect => true
|
21
|
-
|
15
|
+
self.establish_connection :core
|
22
16
|
end
|
23
17
|
|
24
18
|
class ModelBase < Connection
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module LikeSearch
|
3
|
+
def table
|
4
|
+
self.arel_table
|
5
|
+
end
|
6
|
+
|
7
|
+
def starts_with(attribute, string)
|
8
|
+
where(table[attribute].matches("#{string}%"))
|
9
|
+
end
|
10
|
+
|
11
|
+
def ends_with(attribute,string)
|
12
|
+
where(table[attribute].matches("%#{string}"))
|
13
|
+
end
|
14
|
+
|
15
|
+
def contains(attribute,string)
|
16
|
+
where(table[attribute].matches("%#{string}%"))
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
Base.extend LikeSearch
|
22
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Ensembl
|
2
|
+
module Helpers
|
3
|
+
#TODO: Implement phased
|
4
|
+
class Genotype
|
5
|
+
def initialize(attrib)
|
6
|
+
@left=attrib[1]
|
7
|
+
@right=attrib[2]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class VariationPosition
|
12
|
+
attr_reader :chromosome,:start_pos,:end_pos
|
13
|
+
|
14
|
+
def initialize(row)
|
15
|
+
@chromosome,@start_pos,@end_pos,@strand=row
|
16
|
+
end
|
17
|
+
|
18
|
+
def strand
|
19
|
+
if @strand==1
|
20
|
+
return 'forward'
|
21
|
+
end
|
22
|
+
'reverse'
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
'Chromosome: ' + @chromosome + ' ' + @start_pos.to_s + ':' + @end_pos.to_s
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -7,12 +7,7 @@ module Ensembl
|
|
7
7
|
|
8
8
|
self.abstract_class = true
|
9
9
|
|
10
|
-
self.establish_connection :
|
11
|
-
:host => Ensembl.host,
|
12
|
-
:username => Ensembl.username,
|
13
|
-
:password => Ensembl.password,
|
14
|
-
:database => Ensembl.species+'_variation_'+Ensembl.version+'_'+Ensembl.hg_version,
|
15
|
-
:reconnect => true
|
10
|
+
self.establish_connection :variation
|
16
11
|
|
17
12
|
end
|
18
13
|
|
@@ -42,7 +37,7 @@ module Ensembl
|
|
42
37
|
end
|
43
38
|
|
44
39
|
class Attrib < ModelBase
|
45
|
-
self.extend
|
40
|
+
# self.extend AttributeLike
|
46
41
|
|
47
42
|
belongs_to :attrib_type
|
48
43
|
end
|
@@ -52,10 +47,24 @@ module Ensembl
|
|
52
47
|
end
|
53
48
|
|
54
49
|
class AttribType < ModelBase
|
50
|
+
|
55
51
|
has_many :attribs, class_name: 'Attrib'
|
56
52
|
has_many :pheotype_feature_attrib
|
57
53
|
has_many :phenotype_features, through: :phenotype_feature_attrib
|
58
54
|
|
55
|
+
scope :common_values, -> { where(attrib_type_id: self.mapping_hash.keys)}
|
56
|
+
|
57
|
+
def self.mapping_hash
|
58
|
+
@mapping_hash||={14=>:risk_allele,15=>:p_value,23=>:odds_ratio,24=>:beta}
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.key(value)
|
62
|
+
mapping_hash.key(value)
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.symbol(key)
|
66
|
+
mapping_hash[key]
|
67
|
+
end
|
59
68
|
end
|
60
69
|
|
61
70
|
class CompressedGenotypeRegion < Connection
|
@@ -74,11 +83,9 @@ module Ensembl
|
|
74
83
|
# FIXME: Should be in GenotypeCodes class or should use caching
|
75
84
|
allele_codes=GenotypeCode.eager_load(:allele_code).where(:genotype_code_id=>genotype_code_ids.uniq).inject({}){|hsh,gc|hsh[gc.genotype_code_id]=gc.allele_code.allele;hsh}
|
76
85
|
|
77
|
-
#genotype_code_ids.uniq.inject({}) { |hsh, gc_id | hsh[gc_id]=GenotypeCode.find(gc_id).allele_code.allele;hsh }
|
78
|
-
|
79
86
|
@igs||=unpacked_genotypes.map{|s|
|
80
87
|
IndividualGenotype.new({ individual_id: s[0],
|
81
|
-
genotype_code_id:s[1],
|
88
|
+
genotype_code_id: s[1],
|
82
89
|
allele: allele_codes[s[1]] })}
|
83
90
|
end
|
84
91
|
|
@@ -127,9 +134,19 @@ module Ensembl
|
|
127
134
|
end
|
128
135
|
|
129
136
|
class GenotypeCode < ModelBase
|
130
|
-
|
131
137
|
belongs_to :allele_code
|
132
138
|
|
139
|
+
def self.genotype_for(genotype_code_id)
|
140
|
+
joins(:allele_code).where(genotype_code_id: genotype_code_id).order(:haplotype_id).pluck('allele_code.allele').join('|')
|
141
|
+
end
|
142
|
+
|
143
|
+
def self.genotypes_for(genotype_code_ids)
|
144
|
+
includes(:allele_code).where(genotype_code_id: genotype_code_ids).pluck('genotype_code.genotype_code_id','genotype_code.haplotype_id','allele_code.allele').group_by{|r| r[0]}.map{|k,v| [k,v.sort_by{|f,s| f[1]<=>s[1]}.map{|v| v[2]}.join('|')]}
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.genotypes_hash_for(genotype_code_ids)
|
148
|
+
genotypes_for(genotype_code_ids).to_h
|
149
|
+
end
|
133
150
|
end
|
134
151
|
|
135
152
|
class Individual < ModelBase
|
@@ -161,8 +178,12 @@ module Ensembl
|
|
161
178
|
belongs_to :individual
|
162
179
|
belongs_to :population
|
163
180
|
|
164
|
-
scope :displayable, -> { joins(:population).
|
165
|
-
scope :
|
181
|
+
scope :displayable, -> { joins(:population).merge(Population.displayable) }
|
182
|
+
scope :thousand_genomes, -> { joins(:population).merge(Population.thousand_genomes)}
|
183
|
+
|
184
|
+
scope :by_individual_ids, ->(ids) { where(individual_id: ids) }
|
185
|
+
|
186
|
+
|
166
187
|
end
|
167
188
|
|
168
189
|
class IndividualSynonym < Connection
|
@@ -189,6 +210,17 @@ module Ensembl
|
|
189
210
|
|
190
211
|
class Phenotype < ModelBase
|
191
212
|
has_many :phenotype_features
|
213
|
+
|
214
|
+
def studies
|
215
|
+
ids=phenotype_features
|
216
|
+
.with_studies
|
217
|
+
.uniq
|
218
|
+
.pluck(:study_id)
|
219
|
+
|
220
|
+
return nil unless ids.size > 0 #
|
221
|
+
|
222
|
+
Study.where(study_id: ids)
|
223
|
+
end
|
192
224
|
end
|
193
225
|
|
194
226
|
class PhenotypeFeature < ModelBase
|
@@ -205,19 +237,53 @@ module Ensembl
|
|
205
237
|
has_many :phenotype_feature_attribs
|
206
238
|
has_many :attrib_types, through: :phenotype_feature_attribs
|
207
239
|
|
240
|
+
scope :significant, -> { where(is_significant: true )}
|
241
|
+
scope :with_studies, -> { where.not(study_id:nil)}
|
242
|
+
|
208
243
|
def variation
|
209
244
|
Variation.find_by name: object_id
|
210
245
|
end
|
211
246
|
|
247
|
+
def risk_allele
|
248
|
+
pf=phenotype_feature_attribs.risk_alleles.first
|
249
|
+
pf.value unless pf.nil?
|
250
|
+
end
|
251
|
+
|
252
|
+
def p_value
|
253
|
+
pf=phenotype_feature_attribs.p_values.first
|
254
|
+
pf.value unless pf.nil?
|
255
|
+
end
|
256
|
+
|
257
|
+
def odds_ratio
|
258
|
+
pf=phenotype_feature_attribs.odds_ratios.first
|
259
|
+
pf.value unless pf.nil?
|
260
|
+
end
|
261
|
+
|
262
|
+
def description
|
263
|
+
phenotype.description
|
264
|
+
end
|
265
|
+
|
212
266
|
end
|
213
267
|
|
214
268
|
class PhenotypeFeatureAttrib < Connection
|
215
269
|
belongs_to :attrib_type
|
216
270
|
belongs_to :phenotype_feature
|
271
|
+
|
272
|
+
scope :risk_alleles, -> {
|
273
|
+
where(attrib_type_id: AttribType.key(:risk_allele)) }
|
274
|
+
|
275
|
+
scope :p_values, -> {
|
276
|
+
where(attrib_type_id: AttribType.key(:p_value)) }
|
277
|
+
|
278
|
+
scope :odds_ratios, -> {
|
279
|
+
where(attrib_type_id: AttribType.key(:odds_ratio))}
|
280
|
+
|
281
|
+
scope :betas, -> {
|
282
|
+
where(attrib_type_id: AttribType.key(:beta))}
|
217
283
|
end
|
218
284
|
|
219
285
|
class Population < ModelBase
|
220
|
-
self.extend Ensembl::
|
286
|
+
# self.extend Ensembl::AttributeLike
|
221
287
|
|
222
288
|
has_many :alleles
|
223
289
|
has_many :population_synonyms
|
@@ -234,6 +300,7 @@ module Ensembl
|
|
234
300
|
has_many :population_genotypes
|
235
301
|
|
236
302
|
scope :displayable, -> { where(display:'LD')}
|
303
|
+
scope :thousand_genomes, -> { displayable.starts_with(:name,'1000GENOMES')}
|
237
304
|
|
238
305
|
def all_individual_populations
|
239
306
|
IndividualPopulation.where(population_id: sub_population_ids(self)<<id)
|
@@ -289,16 +356,8 @@ module Ensembl
|
|
289
356
|
belongs_to :variation_feature
|
290
357
|
end
|
291
358
|
|
292
|
-
# class SeqRegion < Ensembl::Core::SeqRegion
|
293
|
-
# belongs_to :coord_system
|
294
|
-
# has_many :compressed_genotype_regions
|
295
|
-
# has_many :phenotype_features
|
296
|
-
# has_many :structureal_variation_features
|
297
|
-
# end
|
298
|
-
|
299
359
|
class StrainGtypePoly < Connection
|
300
360
|
belongs_to :variation
|
301
|
-
|
302
361
|
end
|
303
362
|
|
304
363
|
class StructuralVariation < ModelBase
|
@@ -347,15 +406,25 @@ module Ensembl
|
|
347
406
|
end
|
348
407
|
|
349
408
|
class Source < ModelBase
|
409
|
+
has_many :studies
|
410
|
+
|
411
|
+
scope :no_db_gap, -> { where.not(source_id: 46)}
|
350
412
|
end
|
351
413
|
|
352
414
|
class Study < ModelBase
|
415
|
+
# include AttributeLike
|
416
|
+
|
417
|
+
default_scope -> { includes(:source) }
|
418
|
+
|
419
|
+
belongs_to :source
|
420
|
+
|
353
421
|
has_many :associate_studies, foreign_key: 'study1_id'
|
354
422
|
has_many :associated_studies, through: :associate_studies, source: :associated_study
|
355
423
|
|
356
424
|
# FIXME: No data in database
|
357
425
|
has_many :study_variations
|
358
426
|
has_many :variations, through: :study_variations
|
427
|
+
|
359
428
|
end
|
360
429
|
|
361
430
|
# FIXME: No data in database
|
@@ -394,7 +463,6 @@ module Ensembl
|
|
394
463
|
end
|
395
464
|
|
396
465
|
class Variation < ModelBase
|
397
|
-
self.extend Ensembl::SearchByName
|
398
466
|
|
399
467
|
belongs_to :source
|
400
468
|
|
@@ -420,32 +488,91 @@ module Ensembl
|
|
420
488
|
PhenotypeFeature.eager_load(:phenotype).where(object_id_column: name, type: 'Variation')
|
421
489
|
end
|
422
490
|
|
423
|
-
def
|
424
|
-
|
491
|
+
def all_phenotype_features
|
492
|
+
object_ids = synonyms
|
493
|
+
object_ids<<name
|
494
|
+
PhenotypeFeature.eager_load(:phenotype).where(object_id: object_ids, type: 'Variation')
|
495
|
+
end
|
496
|
+
|
497
|
+
# Made because of the need to cut down database queries
|
498
|
+
# @return
|
499
|
+
# { phenotype_feature_id =>
|
500
|
+
# { :phenotype=> "Phenotype description" ,
|
501
|
+
# :phenotype_id => _ ,
|
502
|
+
# :p_value => _ ,
|
503
|
+
# :odds_ratio => _,
|
504
|
+
# :risk_allele => _ },
|
505
|
+
# phenotype_feature_id =>
|
506
|
+
# { :phenotype=> "Phenotype description" ,
|
507
|
+
# :phenotype_id => _ ,
|
508
|
+
# :p_value => _ ,
|
509
|
+
# :odds_ratio => _,
|
510
|
+
# :risk_allele => _ }}
|
511
|
+
def phenotype_features_hash
|
512
|
+
|
513
|
+
# Do enable two level inserts hsh[:first][:second]
|
514
|
+
hash=Hash.new{ |hsh,key| hsh[key] = Hash.new {} }
|
515
|
+
|
516
|
+
all_phenotype_features
|
517
|
+
.joins(:phenotype)
|
518
|
+
.pluck(
|
519
|
+
:phenotype_feature_id,
|
520
|
+
'phenotype.description',
|
521
|
+
:phenotype_id)
|
522
|
+
.each{ |r| hash[r[0]][:phenotype]=r[1]; hash[r[0]][:phenotype_id]=r[2]}
|
523
|
+
|
524
|
+
PhenotypeFeatureAttrib
|
525
|
+
.where(phenotype_feature_id: hash.keys)
|
526
|
+
.pluck(
|
527
|
+
'phenotype_feature_attrib.phenotype_feature_id',
|
528
|
+
'phenotype_feature_attrib.value',
|
529
|
+
'phenotype_feature_attrib.attrib_type_id')
|
530
|
+
.each{ |v| hash[v[0]][AttribType.symbol(v[2])]=v[1] }
|
531
|
+
|
532
|
+
hash
|
533
|
+
end
|
534
|
+
|
535
|
+
def synonym_names
|
536
|
+
variation_synonyms.map{|vs| vs.name}
|
425
537
|
end
|
426
538
|
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
539
|
+
# Genotype counts for each population
|
540
|
+
# @returns {"CSHL-HAPMAP:HapMap-CEU"=>{"C|T"=>59, "C|C"=>102, "T|T"=>12},
|
541
|
+
# "CSHL-HAPMAP:HapMap-YRI"=>{"C|C"=>172, "C|T"=>1}}
|
542
|
+
def genotype_counts
|
543
|
+
counts = Hash.new{ |hsh,k| hsh[k] = Hash.new 0 }
|
544
|
+
|
545
|
+
individual_populations.pluck('population.name',:individual_id).map{|ip| [ip[0],genotype_codes[individual_genotypes[ip[1]]]] }.each{|r| counts[r[0]][r[1]]+=1}
|
546
|
+
|
547
|
+
return counts
|
548
|
+
end
|
549
|
+
|
550
|
+
# Individual and genotype_code id's related to variation
|
551
|
+
# @returns
|
552
|
+
# Example:
|
553
|
+
# [[1,2],[2,3],[<individual_id>,<genotype_code_id>]]
|
554
|
+
def individual_genotypes
|
555
|
+
@individual_genotypes||=compressed_genotype_vars.map{|cgv| cgv.unpacked_genotypes }.flatten(1).to_h
|
556
|
+
end
|
432
557
|
|
433
|
-
|
558
|
+
def individual_genotype_ids
|
559
|
+
individual_genotypes.keys
|
560
|
+
end
|
434
561
|
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
.
|
439
|
-
|
562
|
+
# IndividualPopulations from individual_genotypes
|
563
|
+
# @returns [IndividualPopulation,IndividualPopulation,...]
|
564
|
+
def individual_populations
|
565
|
+
IndividualPopulation.where(individual_id: individual_genotype_ids)
|
566
|
+
end
|
440
567
|
|
441
|
-
|
568
|
+
def genotype_code_ids
|
569
|
+
@genotype_code_ids||=individual_genotypes.values.uniq
|
442
570
|
end
|
443
571
|
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
.
|
448
|
-
.where(individual_population: { individual_id: individual_ids })
|
572
|
+
# Unique genotype codes from individual_genotypes
|
573
|
+
# @returns [<genotype_code_id>=>'G|C',2=>'A|A']
|
574
|
+
def genotype_codes
|
575
|
+
@genotype_codes||=GenotypeCode.genotypes_hash_for(genotype_code_ids)
|
449
576
|
end
|
450
577
|
|
451
578
|
# Find Variation by also using VariationSynonyms
|
@@ -455,18 +582,27 @@ module Ensembl
|
|
455
582
|
v = self.find_by(name: name)
|
456
583
|
return v unless v.nil?
|
457
584
|
vs = VariationSynonym.eager_load(:variation).find_by(name: name)
|
458
|
-
vs.variation unless vs.nil?
|
585
|
+
return vs.variation unless vs.nil?
|
586
|
+
nil
|
459
587
|
end
|
460
588
|
|
461
|
-
def
|
462
|
-
|
463
|
-
|
464
|
-
|
589
|
+
def self.find_all_by_name(name)
|
590
|
+
v_ids = where(name: name).pluck(:variation_id)
|
591
|
+
v_ids = variation_synonyms.where(name: name).pluck(:variation_id) if v_ids.nil?
|
592
|
+
|
593
|
+
return nil if v_ids.nil?
|
594
|
+
|
595
|
+
where(variation_id: v_ids).order(:name)
|
596
|
+
end
|
597
|
+
|
598
|
+
def genes
|
599
|
+
variation_genenames.pluck(:gene_name)
|
600
|
+
end
|
601
|
+
|
602
|
+
def positions
|
603
|
+
variation_features.includes(:seq_region).pluck('seq_region.name',:seq_region_start,:seq_region_end,:seq_region_strand).map{|r| Ensembl::Helpers::VariationPosition.new(r)}
|
465
604
|
end
|
466
605
|
|
467
|
-
# def population_genotypes
|
468
|
-
# PopulationGenotype.where(variation_id: id)
|
469
|
-
# end
|
470
606
|
end
|
471
607
|
|
472
608
|
class VariationCitation < Connection
|
@@ -488,6 +624,15 @@ module Ensembl
|
|
488
624
|
VariationSets.where[variation_set_id: [variation_set_id.split(',').map{|id| id.to_i }]] unless variation_set_id.nil?
|
489
625
|
end
|
490
626
|
|
627
|
+
def strand_name(id)
|
628
|
+
case(id)
|
629
|
+
when 1
|
630
|
+
'forward'
|
631
|
+
else
|
632
|
+
'reverse'
|
633
|
+
end
|
634
|
+
end
|
635
|
+
|
491
636
|
def class_type
|
492
637
|
Attrib.find(class_attrib_id) unless class_attrib_id.nil?
|
493
638
|
end
|
@@ -502,7 +647,7 @@ module Ensembl
|
|
502
647
|
end
|
503
648
|
|
504
649
|
class VariationSet < ModelBase
|
505
|
-
self.extend Ensembl::SearchByName
|
650
|
+
# self.extend Ensembl::SearchByName
|
506
651
|
|
507
652
|
belongs_to :short_name, foreign_key: 'short_name_attrib_id', class_name: 'Attrib'
|
508
653
|
has_many :structural_variations
|
@@ -536,6 +681,19 @@ module Ensembl
|
|
536
681
|
class VariationSynonym < ModelBase
|
537
682
|
belongs_to :variation
|
538
683
|
belongs_to :source
|
684
|
+
|
685
|
+
scope :name_like, ->(name, search_type=:starts_with){
|
686
|
+
at=self.arel_table
|
687
|
+
|
688
|
+
if search_type == :ends_with
|
689
|
+
where(at[:name].matches("%#{name}"))
|
690
|
+
elsif search_type == :starts_with
|
691
|
+
where(at[:name].matches("#{name}%"))
|
692
|
+
else
|
693
|
+
where(at[:name].matches("%#{name}%"))
|
694
|
+
end
|
695
|
+
|
696
|
+
}
|
539
697
|
end
|
540
698
|
end
|
541
699
|
end
|
@@ -3,6 +3,7 @@ require 'activerecord-tableless'
|
|
3
3
|
|
4
4
|
module Ensembl
|
5
5
|
module Variation
|
6
|
+
|
6
7
|
class IndividualGenotype < ActiveRecord::Base
|
7
8
|
has_no_table
|
8
9
|
|
@@ -13,12 +14,9 @@ module Ensembl
|
|
13
14
|
belongs_to :individual
|
14
15
|
belongs_to :genotype_code
|
15
16
|
|
16
|
-
#has_one :allele_code, through: :genotype_code
|
17
|
-
|
18
17
|
delegate :individual_populations, to: :individual
|
19
18
|
delegate :populations, to: :individual
|
20
|
-
|
21
|
-
|
22
19
|
end
|
20
|
+
|
23
21
|
end
|
24
22
|
end
|
data/lib/ensembl/version.rb
CHANGED
data/lib/ensembl.rb
CHANGED
@@ -1,42 +1,11 @@
|
|
1
1
|
require "ensembl/version"
|
2
2
|
require 'active_record'
|
3
|
+
require 'yaml'
|
3
4
|
require 'active_support/core_ext'
|
4
5
|
|
5
6
|
module Ensembl
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
attr_accessor :host, :port, :database, :username, :password
|
10
|
-
|
11
|
-
def host
|
12
|
-
@host||='ensembldb.ensembl.org'
|
13
|
-
end
|
14
|
-
|
15
|
-
def port
|
16
|
-
@port||=3306
|
17
|
-
end
|
18
|
-
|
19
|
-
def username
|
20
|
-
@username||='anonymous'
|
21
|
-
end
|
22
|
-
|
23
|
-
def password
|
24
|
-
@password||=''
|
25
|
-
end
|
26
|
-
|
27
|
-
def hg_version
|
28
|
-
@hg_version||='37'
|
29
|
-
end
|
30
|
-
|
31
|
-
def version
|
32
|
-
@version||='75'
|
33
|
-
end
|
34
|
-
|
35
|
-
def species
|
36
|
-
@species||='homo_sapiens'
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
7
|
+
# Load configuration from database.yml
|
8
|
+
ActiveRecord::Base.configurations = YAML::load(IO.read('config/database.yml'))
|
40
9
|
|
41
10
|
module TableNameOverrides
|
42
11
|
def table_name
|
@@ -50,71 +19,22 @@ module Ensembl
|
|
50
19
|
end
|
51
20
|
end
|
52
21
|
|
53
|
-
module
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
self.where(table[attribute].matches("%#{string}%"))
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# class BaseConnection < ActiveRecord::Base
|
68
|
-
# self.extend TableNameOverrides
|
69
|
-
# self.abstract_class = true
|
70
|
-
# end
|
71
|
-
|
72
|
-
# module Core
|
73
|
-
# class Connection < ActiveRecord::Base
|
74
|
-
# self.extend TableNameOverrides
|
75
|
-
#
|
76
|
-
# self.abstract_class = true
|
77
|
-
#
|
78
|
-
# self.establish_connection :adapter => "mysql2",
|
79
|
-
# :host => Ensembl.host,
|
80
|
-
# :username => Ensembl.username,
|
81
|
-
# :password => Ensembl.password,
|
82
|
-
# :database => Ensembl.species+'_core_'+Ensembl.version+'_'+Ensembl.hg_version,
|
83
|
-
# :reconnect => true
|
84
|
-
#
|
85
|
-
# end
|
86
|
-
#
|
87
|
-
# class ModelBase < Connection
|
88
|
-
# self.extend PrimaryKeyOverrides
|
89
|
-
#
|
90
|
-
# self.abstract_class = true
|
22
|
+
# module AttributeLike
|
23
|
+
# def a_like(attribute, string, search_type=:between)
|
24
|
+
# at=self.arel_table
|
25
|
+
# if search_type == :ends_with
|
26
|
+
# where(at[attribute].matches("%#{string}"))
|
27
|
+
# elsif search_type == :starts_with
|
28
|
+
# where(at[attribute].matches("#{string}%"))
|
29
|
+
# else
|
30
|
+
# where(at[attribute].matches("%#{string}%"))
|
31
|
+
# end
|
91
32
|
# end
|
92
33
|
# end
|
93
|
-
#
|
94
|
-
# module Variation
|
95
|
-
# class Connection < ActiveRecord::Base
|
96
|
-
# self.extend TableNameOverrides
|
97
|
-
#
|
98
|
-
# self.abstract_class = true
|
99
|
-
#
|
100
|
-
# self.establish_connection :adapter => "mysql2",
|
101
|
-
# :host => Ensembl.host,
|
102
|
-
# :username => Ensembl.username,
|
103
|
-
# :password => Ensembl.password,
|
104
|
-
# :database => Ensembl.species+'_variation_'+Ensembl.version+'_'+Ensembl.hg_version,
|
105
|
-
# :reconnect => true
|
106
|
-
#
|
107
|
-
# end
|
108
|
-
#
|
109
|
-
# class ModelBase < Connection
|
110
|
-
# self.extend PrimaryKeyOverrides
|
111
|
-
#
|
112
|
-
# self.abstract_class = true
|
113
|
-
# end
|
114
|
-
# end
|
115
|
-
|
116
34
|
end
|
117
35
|
|
36
|
+
require File.dirname(__FILE__) + '/ensembl/helpers/like_search.rb'
|
118
37
|
require File.dirname(__FILE__) + '/ensembl/core/activerecord.rb'
|
38
|
+
require File.dirname(__FILE__) + '/ensembl/helpers/variation_position.rb'
|
119
39
|
require File.dirname(__FILE__) + '/ensembl/variation/activerecord.rb'
|
120
40
|
require File.dirname(__FILE__) + '/ensembl/variation/tableless.rb'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ensembl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kristjan Metsalu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mysql2
|
@@ -106,9 +106,12 @@ files:
|
|
106
106
|
- LICENSE.txt
|
107
107
|
- README.md
|
108
108
|
- Rakefile
|
109
|
+
- config/database.yml.example
|
109
110
|
- ensembl.gemspec
|
110
111
|
- lib/ensembl.rb
|
111
112
|
- lib/ensembl/core/activerecord.rb
|
113
|
+
- lib/ensembl/helpers/like_search.rb
|
114
|
+
- lib/ensembl/helpers/variation_position.rb
|
112
115
|
- lib/ensembl/variation/activerecord.rb
|
113
116
|
- lib/ensembl/variation/tableless.rb
|
114
117
|
- lib/ensembl/version.rb
|