deep_pluck 0.1.4 → 1.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7dd60ee2a2873d438651509c33b1aad2e046c16c
4
- data.tar.gz: b413505ee2ce1109174954377a7e99fb4bc4e4c3
3
+ metadata.gz: 447d5c0f34cda3c5fc8d241abac799236ff6e09b
4
+ data.tar.gz: c0aed3f2c80dbf2364ece10fee44f3d97c979f08
5
5
  SHA512:
6
- metadata.gz: 93a7cd552701c578a624fae3823e588a2eb881f83d482536500228f3d0c9cdadc6e0177ba6b1023dcfa3e7ac03be124554c65e46a8993d1072f7c3335282fecf
7
- data.tar.gz: ed86dcb371deac4a1b4603d0cfa7785797345c859b9e9b7d8d99ce36cc6d660565534ba99851074df7c0dc6a6a3305d454c08a4d813b5177e9f858e24c8edc59
6
+ metadata.gz: 4ee9e958b7a168d182a56695096cc756fcccaa1b6b07bffb4c027a98848b97a539c0a5e39ed84bdb6d09f84327d7723da0495590656853a16e6343e5aba77515
7
+ data.tar.gz: cf325186ebb8cc23bd989f9302c10b91d2fe1688b728f704e303a7b3d0cb75bc89ac57822fdb12f81408eea0aef44ffee69ac411c80f55ae55db575925899f89
data/deep_pluck.gemspec CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency "sqlite3", "~> 1.3"
33
33
  spec.add_development_dependency "minitest", "~> 5.0"
34
34
 
35
- spec.add_dependency "rails", ">= 3"
35
+ spec.add_dependency "active_record", "> 3.x"
36
36
  spec.add_dependency "pluck_all", "~> 1.2.2"
37
37
 
38
38
  end
@@ -0,0 +1,37 @@
1
+ module DeepPluck
2
+ module DataCombiner
3
+ class << self
4
+ def combine_data(parent, children, primary_key, column_name, foreign_key, reverse, collection)
5
+ source = reverse ? parent : children
6
+ target = !reverse ? parent : children
7
+ data_hash = make_data_hash(collection, source, primary_key, column_name)
8
+ assign_values_to_parent(collection, target, data_hash, column_name, foreign_key, reverse: reverse)
9
+ return children
10
+ end
11
+ private
12
+ def make_data_hash(collection, parent, primary_key, column_name)
13
+ return parent.map{|s| [s[primary_key], s]}.to_h if !collection
14
+ hash = {}
15
+ parent.each do |model_hash|
16
+ key = model_hash[primary_key]
17
+ array = (hash[key] ? hash[key][column_name] : []) #share the children if id is duplicated
18
+ model_hash[column_name] = array
19
+ hash[key] = model_hash
20
+ end
21
+ return hash
22
+ end
23
+ def assign_values_to_parent(collection, parent, children_hash, column_name, foreign_key, reverse: false)
24
+ parent.each{|s|
25
+ next if (id = s[foreign_key]) == nil
26
+ left = reverse ? children_hash[id] : s
27
+ right = !reverse ? children_hash[id] : s
28
+ if collection
29
+ left[column_name] << right
30
+ else
31
+ left[column_name] = right
32
+ end
33
+ }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,3 +1,4 @@
1
+ require 'deep_pluck/data_combiner'
1
2
  module DeepPluck
2
3
  class Model
3
4
  #---------------------------------------
@@ -23,10 +24,10 @@ module DeepPluck
23
24
  relation = relation.where(options[:conditions]) if options[:conditions]
24
25
  return relation
25
26
  end
26
- def get_join_table(reflect, bool_flag = false)
27
+ def get_join_table(reflect)
27
28
  return reflect.options[:through] if reflect.options[:through]
28
29
  return (reflect.options[:join_table] || reflect.send(:derive_join_table)) if reflect.macro == :has_and_belongs_to_many
29
- return
30
+ return nil
30
31
  end
31
32
  def get_primary_key(reflect)
32
33
  return (reflect.belongs_to? ? reflect.klass : reflect.active_record).primary_key
@@ -35,12 +36,11 @@ module DeepPluck
35
36
  if reverse and (table_name = get_join_table(reflect)) #reverse = parent
36
37
  key = reflect.chain.last.foreign_key
37
38
  else
38
- return (reflect.belongs_to? ? get_primary_key(reflect) : reflect.foreign_key).to_s if reverse
39
- table_name = reflect.active_record.table_name
40
- key = (reflect.belongs_to? ? reflect.foreign_key : get_primary_key(reflect))
39
+ key = (reflect.belongs_to? == reverse ? get_primary_key(reflect) : reflect.foreign_key)
40
+ table_name = (reverse ? reflect.klass : reflect.active_record).table_name
41
41
  end
42
- return key.to_s if !with_table_name #key may be symbol if specify foreign_key in association options
43
- return "#{table_name}.#{key}"
42
+ return "#{table_name}.#{key}" if with_table_name
43
+ return key.to_s #key may be symbol if specify foreign_key in association options
44
44
  end
45
45
  #---------------------------------------
46
46
  # Contruction OPs
@@ -80,40 +80,15 @@ module DeepPluck
80
80
  relation = with_conditions(reflect, relation)
81
81
  return relation.joins(get_join_table(reflect)).where(relation_key => ids)
82
82
  end
83
- private
84
- def set_includes_data(parent, children_store_name, model)
85
- reflect = get_reflect(children_store_name)
83
+ def set_includes_data(parent, column_name, model)
84
+ reflect = get_reflect(column_name)
85
+ reverse = !reflect.belongs_to?
86
+ foreign_key = get_foreign_key(reflect, reverse: reverse)
86
87
  primary_key = get_primary_key(reflect)
87
- if reflect.belongs_to? #Child.where(:id => parent.pluck(:child_id))
88
- children = model.load_data{|relation| do_query(parent, reflect, relation) }
89
- children_hash = children.map{|s| [s[primary_key], s]}.to_h
90
- foreign_key = get_foreign_key(reflect)
91
- parent.each{|s|
92
- next if (id = s[foreign_key]) == nil
93
- s[children_store_name] = children_hash[id]
94
- }
95
- else #Child.where(:parent_id => parent.pluck(:id))
96
- parent_hash = {}
97
- parent.each do |model_hash|
98
- key = model_hash[primary_key]
99
- if reflect.collection?
100
- array = (parent_hash[key] ? parent_hash[key][children_store_name] : []) #share the children if id is duplicated
101
- model_hash[children_store_name] = array
102
- end
103
- parent_hash[key] = model_hash
104
- end
105
- children = model.load_data{|relation| do_query(parent, reflect, relation) }
106
- foreign_key = get_foreign_key(reflect, reverse: true)
107
- children.each{|s|
108
- next if (id = s[foreign_key]) == nil
109
- if reflect.collection?
110
- parent_hash[id][children_store_name] << s
111
- else
112
- parent_hash[id][children_store_name] = s
113
- end
114
- }
115
- end
116
- return children
88
+ children = model.load_data{|relation| do_query(parent, reflect, relation) }
89
+ #reverse = false: Child.where(:id => parent.pluck(:child_id))
90
+ #reverse = true : Child.where(:parent_id => parent.pluck(:id))
91
+ return DataCombiner.combine_data(parent, children, primary_key, column_name, foreign_key, reverse, reflect.collection?)
117
92
  end
118
93
  public
119
94
  def load_data
@@ -1,3 +1,3 @@
1
1
  module DeepPluck
2
- VERSION = "0.1.4"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deep_pluck
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - khiav reoy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-27 00:00:00.000000000 Z
11
+ date: 2017-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -67,19 +67,19 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '5.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rails
70
+ name: active_record
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - ">"
74
74
  - !ruby/object:Gem::Version
75
- version: '3'
75
+ version: 3.x
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - ">"
81
81
  - !ruby/object:Gem::Version
82
- version: '3'
82
+ version: 3.x
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: pluck_all
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -116,6 +116,7 @@ files:
116
116
  - gemfiles/4.2.gemfile
117
117
  - gemfiles/5.0.gemfile
118
118
  - lib/deep_pluck.rb
119
+ - lib/deep_pluck/data_combiner.rb
119
120
  - lib/deep_pluck/model.rb
120
121
  - lib/deep_pluck/version.rb
121
122
  homepage: https://github.com/khiav223577/deep_pluck
@@ -138,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
139
  version: '0'
139
140
  requirements: []
140
141
  rubyforge_project:
141
- rubygems_version: 2.4.8
142
+ rubygems_version: 2.6.8
142
143
  signing_key:
143
144
  specification_version: 4
144
145
  summary: Use deep_pluck as a shortcut to select one or more attributes and include