simple_mysql_api 0.0.3 → 0.0.4
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.
- data/.gitignore +1 -0
- data/lib/simple_mysql_api.rb +9 -4
- data/lib/simple_mysql_api/class_methods.rb +120 -41
- data/lib/simple_mysql_api/version.rb +1 -1
- data/simple_mysql_api.gemspec +7 -5
- metadata +22 -8
data/.gitignore
CHANGED
data/lib/simple_mysql_api.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
-
# require File.join(File.expand_path(File.dirname(__FILE__)), 'simple_mysql_api/version')
|
2
|
-
# require File.join(File.expand_path(File.dirname(__FILE__)), 'simple_mysql_api/class_methods')
|
3
1
|
require "simple_mysql_api/version"
|
4
|
-
require "simple_mysql_api/class_methods"
|
2
|
+
require "simple_mysql_api/class_methods.rb"
|
5
3
|
module SimpleMysqlApi
|
6
|
-
|
4
|
+
|
5
|
+
# def self.connection_adapter
|
6
|
+
# /mysql|pg/.match(ActiveRecord::Base.configurations[Rails.env]['adapter'].downcase).to_s
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
# # Add the class methods to the models
|
10
|
+
# ActiveRecord::Base.send(:include, MySqlMethods) if SimpleMysqlApi.connection_adapter=="mysql"
|
11
|
+
# ActiveRecord::Base.send(:include, PgMethods) if SimpleMysqlApi.connection_adapter=="pg"
|
7
12
|
end
|
@@ -1,95 +1,174 @@
|
|
1
1
|
module SimpleMysqlApi
|
2
|
+
|
3
|
+
#To add the class methods to Models
|
2
4
|
module SimpleMysqlApiMethods
|
5
|
+
|
6
|
+
#Class methods for modles
|
3
7
|
module ClassMethods
|
4
|
-
|
5
|
-
|
8
|
+
|
9
|
+
# Returns the asscociated models with their table name, class name, forignkey
|
10
|
+
# eg. User.tables_by_relation(:has_many)
|
11
|
+
# returns {"City"=>{:t_name=>"cities", :f_key=>"user_id"}}
|
12
|
+
def tables_by_relation(rel)
|
13
|
+
self.reflect_on_all_associations(rel).inject({}) do |r, e|
|
6
14
|
r[e.class_name] = {:t_name=> e.table_name, :f_key=> e.foreign_key }
|
7
15
|
r
|
8
16
|
end
|
9
17
|
end
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
18
|
+
|
19
|
+
# Returns the hash of attributes of the table and their type
|
20
|
+
# eg. User.attributes
|
21
|
+
# returns [{:attr=>"id", :type=>"integer", :param_name=>:id}, {:attr=>"name", :type=>"string", :param_name=>:name}]
|
22
|
+
def attributes(c_name=nil)
|
23
|
+
self.columns.inject([]) do |r,e|
|
24
|
+
r << {:attr=>e.name, :type=>e.type.to_s, :param_name => (c_name ? (c_name.downcase+ "_" + e.name) : e.name).to_sym }
|
14
25
|
r
|
15
26
|
end
|
16
27
|
end
|
17
|
-
|
28
|
+
|
29
|
+
# Returns the primary key
|
18
30
|
def pri_key
|
19
31
|
self.primary_key
|
20
32
|
end
|
21
33
|
|
22
|
-
|
23
|
-
|
34
|
+
# returns all the attributes except primary keys and foreign keys
|
35
|
+
def searchable_attributes(c_name=nil)
|
36
|
+
self.attributes(c_name).delete_if{|v| (self.primary_key==v[:attr].to_s || self.foreign_keys.include?(v[:attr].to_s)) }
|
24
37
|
end
|
25
|
-
|
38
|
+
|
39
|
+
# Adds the conditions for the attributes passed based on the attributes type
|
26
40
|
def search_conditions(attributes,params,act_relation,t_type)
|
27
|
-
attributes.each do |
|
28
|
-
case(value)
|
41
|
+
attributes.each do |value|
|
42
|
+
case(value[:type])
|
29
43
|
when "string","text"
|
30
|
-
act_relation = text_search(
|
44
|
+
act_relation = text_search(value,params,act_relation,t_type)
|
31
45
|
when "integer","float"
|
32
|
-
act_relation = range_search(
|
46
|
+
act_relation = range_search(value,params,act_relation,t_type)
|
47
|
+
when "datetime"
|
48
|
+
act_relation = date_search(value,params,act_relation,t_type)
|
33
49
|
when "boolean"
|
34
|
-
act_relation = boolean_search(
|
35
|
-
end
|
50
|
+
act_relation = boolean_search(value,params,act_relation,t_type)
|
51
|
+
end if params[value[:param_name]]
|
36
52
|
end
|
37
53
|
act_relation
|
38
54
|
end
|
39
|
-
|
55
|
+
|
56
|
+
# for the text search if it contains the string
|
40
57
|
def text_search(attr,params,act_relation,t_type)
|
41
|
-
obj = "%#{params[attr]}%"
|
42
|
-
act_relation.where(["LOWER(#{t_type.constantize.table_name}.#{attr}) like
|
58
|
+
obj = "%#{params[attr[:param_name]].downcase}%"
|
59
|
+
act_relation.where(["LOWER(#{t_type.constantize.table_name}.#{attr[:attr]}) like ?",obj])
|
43
60
|
end
|
44
|
-
|
61
|
+
|
62
|
+
# for the integer, float attributes
|
63
|
+
# eg. price="12"
|
64
|
+
# price="12-100"
|
65
|
+
# price="<100"
|
66
|
+
# price=">100"
|
45
67
|
def range_search(attr,params,act_relation,t_type)
|
46
|
-
attr_opp = /[-,<,>]/.match(params[attr]).to_s
|
47
|
-
table_name = "#{t_type.constantize.table_name}"
|
68
|
+
attr_opp = /[-,<,>]/.match(params[attr[:param_name]]).to_s + /[=]/.match(params[attr[:param_name]]).to_s
|
69
|
+
table_name = "#{t_type.constantize.table_name}"
|
48
70
|
case(attr_opp)
|
49
71
|
when "-"
|
50
|
-
attr_val = params[attr].split("-").inject([]){|r,e| r << e.to_f}
|
51
|
-
act_relation = act_relation.where(["CAST(#{table_name}.#{attr} AS DECIMAL) >= ? and CAST(#{table_name}.#{attr} AS DECIMAL) <= ?",attr_val[0],attr_val[1]]) if attr_val
|
52
|
-
when "<",">"
|
53
|
-
attr_val = params[attr].split(attr_opp)[1].to_f
|
54
|
-
act_relation = act_relation.where(["
|
72
|
+
attr_val = params[attr[:param_name]].split("-").inject([]){|r,e| r << e.to_f}
|
73
|
+
act_relation = act_relation.where(["CAST(#{table_name}.#{attr[:attr]} AS DECIMAL) >= ? and CAST(#{table_name}.#{attr[:attr]} AS DECIMAL) <= ?",attr_val[0],attr_val[1]]) if attr_val
|
74
|
+
when "<",">","<=",">="
|
75
|
+
attr_val = params[attr[:param_name]].split(attr_opp)[1].to_f
|
76
|
+
act_relation = act_relation.where(["CAST(#{table_name}.#{attr[:attr]} AS DECIMAL) #{attr_opp} ?",attr_val]) if attr_val
|
55
77
|
else
|
56
|
-
attr_val = params[attr].to_f
|
57
|
-
act_relation = act_relation.where(["CAST(#{table_name}.#{attr} AS DECIMAL) = ?",attr_val]) if attr_val
|
78
|
+
attr_val = params[attr[:param_name]].to_f
|
79
|
+
act_relation = act_relation.where(["CAST(#{table_name}.#{attr[:attr]} AS DECIMAL) = ?",attr_val]) if attr_val
|
80
|
+
end if attr_opp
|
81
|
+
act_relation
|
82
|
+
end
|
83
|
+
|
84
|
+
# for the datetime
|
85
|
+
# eg. created_at ="2012-08-28 16:21:37 +0530"
|
86
|
+
# created_at = "2012-08-28 16:21:37 +0530..2012-09-28 16:21:37 +0530""
|
87
|
+
# created_at="<2012-08-28 16:21:37 +0530"
|
88
|
+
# created_at=">2012-08-28 16:21:37 +0530"
|
89
|
+
def date_search(attr,params,act_relation,t_type)
|
90
|
+
attr_opp = /[<,>]/.match(params[attr[:param_name]]).to_s + /[=]/.match(params[attr[:param_name]]).to_s
|
91
|
+
attr_opp = params[attr[:param_name]].index("..") ? ".." : attr_opp
|
92
|
+
table_name = "#{t_type.constantize.table_name}"
|
93
|
+
case(attr_opp)
|
94
|
+
when ".."
|
95
|
+
attr_val = params[attr[:param_name]].split("..").inject([]){|r,e| r << e}
|
96
|
+
act_relation = act_relation.where(["#{table_name}.#{attr[:attr]} >= ? and #{table_name}.#{attr[:attr]} <= ?",attr_val[0],attr_val[1]]) if attr_val
|
97
|
+
when "<",">","<=",">="
|
98
|
+
attr_val = params[attr[:param_name]].split(attr_opp)[1]
|
99
|
+
act_relation = act_relation.where(["#{table_name}.#{attr[:attr]} #{attr_opp} ?",attr_val]) if attr_val
|
100
|
+
else
|
101
|
+
attr_val = params[attr[:param_name]].split(attr_opp)[1]
|
102
|
+
act_relation = act_relation.where(["#{table_name}.#{attr[:attr]} = ?",attr_val]) if attr_val
|
58
103
|
end if attr_opp
|
59
104
|
act_relation
|
60
105
|
end
|
61
106
|
|
107
|
+
# for any type
|
108
|
+
# eg. price="12"
|
62
109
|
def equal_search(attr,params,act_relation,t_type)
|
63
|
-
act_relation = act_relation.where(["#{t_type.constantize.table_name}.#{attr} = ?",params[attr]])
|
110
|
+
act_relation = act_relation.where(["#{t_type.constantize.table_name}.#{attr[:attr]} = ?",params[attr[:param_name]]])
|
64
111
|
end
|
65
|
-
|
112
|
+
|
113
|
+
# for boolean type
|
114
|
+
# eg. price="true"
|
66
115
|
def boolean_search(attr,params,act_relation,t_type)
|
67
|
-
val = params[attr].match(/(true|t|yes|y|1)$/i) != nil ? 1 : 0
|
68
|
-
act_relation = act_relation.where(["CAST(#{t_type.constantize.table_name}.#{attr} AS CHAR) = ?",val.to_s])
|
116
|
+
val = params[attr[:param_name]].match(/(true|t|yes|y|1)$/i) != nil ? 1 : 0
|
117
|
+
act_relation = act_relation.where(["CAST(#{t_type.constantize.table_name}.#{attr[:attr]} AS CHAR) = ?",val.to_s])
|
69
118
|
end
|
70
|
-
|
119
|
+
|
120
|
+
# Returns all foreign keys of the model
|
71
121
|
def foreign_keys
|
72
122
|
self.reflect_on_all_associations.inject([]) do |r, e|
|
73
123
|
r << e.foreign_key
|
74
124
|
r
|
75
|
-
end
|
125
|
+
end.uniq
|
76
126
|
end
|
77
|
-
|
78
|
-
|
127
|
+
|
128
|
+
# Main method:
|
129
|
+
# Used for search
|
130
|
+
# You have params= {name: "Joh", city: "New"}
|
131
|
+
# set has_many, belongs_to to true if you want to search for associated models
|
132
|
+
# Search: User.search({search_params: params, has_many: true, belongs_to: false})
|
133
|
+
def mysql_search(options={})
|
134
|
+
params = options[:search_params]
|
135
|
+
search_params = options[:custom_params] || nil
|
79
136
|
act_relation = self
|
80
|
-
attributes = (search_params||self.attributes).delete_if{|
|
81
|
-
|
137
|
+
attributes = (search_params||self.attributes).delete_if{|v| (self.primary_key==v[:attr].to_s || self.foreign_keys.include?(v[:attr].to_s)) }
|
138
|
+
act_relation = belongs_to_search(act_relation, params) if options[:belongs_to] && options[:belongs_to]==true
|
139
|
+
act_relation = has_many_search(act_relation, params) if options[:has_many] && options[:has_many]==true
|
140
|
+
act_relation = search_conditions(attributes,params,act_relation,self.to_s)
|
141
|
+
act_relation.select("DISTINCT #{self.table_name}.*")
|
142
|
+
end
|
143
|
+
|
144
|
+
# For joining belongs to relational models and searches their params
|
145
|
+
def belongs_to_search(act_relation, params)
|
146
|
+
self.tables_by_relation(:belongs_to).each do |c_name,values|
|
82
147
|
act_relation = act_relation.joins("LEFT JOIN #{values[:t_name]} #{values[:t_name]} ON #{self.table_name}.#{values[:f_key]}=#{values[:t_name]}.#{c_name.constantize.pri_key}")
|
83
|
-
new_attributes = c_name.constantize.searchable_attributes
|
148
|
+
new_attributes = c_name.constantize.searchable_attributes(c_name)#c_name.constantize.searchable_attributes
|
84
149
|
act_relation = search_conditions(new_attributes,params,act_relation,c_name)
|
85
150
|
end
|
86
|
-
act_relation = search_conditions(attributes,params,act_relation,self.to_s)
|
87
151
|
act_relation
|
88
152
|
end
|
153
|
+
|
154
|
+
# For joining has many relational models and searches their params
|
155
|
+
def has_many_search(act_relation, params)
|
156
|
+
self.tables_by_relation(:has_many).each do |c_name,values|
|
157
|
+
act_relation = act_relation.joins("LEFT JOIN #{values[:t_name]} #{values[:t_name]} ON #{self.table_name}.#{self.pri_key}=#{values[:t_name]}.#{values[:f_key]}")
|
158
|
+
new_attributes = c_name.constantize.searchable_attributes(c_name)#c_name.constantize.searchable_attributes
|
159
|
+
act_relation = search_conditions(new_attributes,params,act_relation,c_name)
|
160
|
+
end
|
161
|
+
act_relation
|
162
|
+
end
|
163
|
+
|
89
164
|
end
|
165
|
+
|
166
|
+
# includes as class methods for the Class
|
90
167
|
def self.included(base)
|
91
168
|
base.extend ClassMethods
|
92
169
|
end
|
93
170
|
end
|
171
|
+
|
172
|
+
# Add the class methods to the models
|
94
173
|
ActiveRecord::Base.send(:include, SimpleMysqlApiMethods)
|
95
174
|
end
|
data/simple_mysql_api.gemspec
CHANGED
@@ -5,11 +5,13 @@ require 'simple_mysql_api/version'
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "simple_mysql_api"
|
7
7
|
gem.version = SimpleMysqlApi::VERSION
|
8
|
-
gem.authors = ["
|
9
|
-
gem.email = ["
|
10
|
-
gem.description = "
|
11
|
-
gem.summary = "
|
12
|
-
gem.homepage = ""
|
8
|
+
gem.authors = ["Jalendra Bhanarkar"]
|
9
|
+
gem.email = ["jbmyid@gmail.com"]
|
10
|
+
gem.description = "Search the records by attributes of the same table or associated tables. Search: Ex. User.search({search_params: {name: \"Alex\", city: \"New\"}, belongs_to: false, has_many: true}) will return the User active relation with conditioning name=Alex and city=new"
|
11
|
+
gem.summary = "Search the records by attributes of the same table or associated tables."
|
12
|
+
gem.homepage = "http://jbmyid.wordpress.com"
|
13
|
+
gem.add_dependency('rails', '>= 3.2')
|
14
|
+
# gem.add_dependency('ActiveRecord','>= 3.2')
|
13
15
|
|
14
16
|
gem.files = `git ls-files`.split($/)
|
15
17
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
metadata
CHANGED
@@ -1,19 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_mysql_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
-
|
8
|
+
- Jalendra Bhanarkar
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
13
|
-
dependencies:
|
14
|
-
|
12
|
+
date: 2012-09-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: &2151943920 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.2'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2151943920
|
25
|
+
description: ! 'Search the records by attributes of the same table or associated tables.
|
26
|
+
Search: Ex. User.search({search_params: {name: "Alex", city: "New"}, belongs_to:
|
27
|
+
false, has_many: true}) will return the User active relation with conditioning name=Alex
|
28
|
+
and city=new'
|
15
29
|
email:
|
16
|
-
-
|
30
|
+
- jbmyid@gmail.com
|
17
31
|
executables: []
|
18
32
|
extensions: []
|
19
33
|
extra_rdoc_files: []
|
@@ -28,7 +42,7 @@ files:
|
|
28
42
|
- lib/simple_mysql_api/class_methods.rb
|
29
43
|
- lib/simple_mysql_api/version.rb
|
30
44
|
- simple_mysql_api.gemspec
|
31
|
-
homepage:
|
45
|
+
homepage: http://jbmyid.wordpress.com
|
32
46
|
licenses: []
|
33
47
|
post_install_message:
|
34
48
|
rdoc_options: []
|
@@ -51,5 +65,5 @@ rubyforge_project:
|
|
51
65
|
rubygems_version: 1.8.15
|
52
66
|
signing_key:
|
53
67
|
specification_version: 3
|
54
|
-
summary:
|
68
|
+
summary: Search the records by attributes of the same table or associated tables.
|
55
69
|
test_files: []
|