rquery-activerecord 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/rquery_ar.rb +118 -0
  2. metadata +75 -0
data/lib/rquery_ar.rb ADDED
@@ -0,0 +1,118 @@
1
+ require 'json'
2
+
3
+ module RQuery
4
+ module ClassMethods
5
+ def rquery(cmd=nil)
6
+ if cmd
7
+ ar_statement = ''
8
+ # TODO includes_clause(JSON.parse(cmd[:includes])) if cmd[:includes]
9
+ # TODO joins_clause(JSON.parse(cmd[:joins])) if cmd[:joins]
10
+ ar_statement += where_clause(JSON.parse(cmd[:where])) if cmd[:where]
11
+ ar_statement += order_clause(JSON.parse(cmd[:order])) if cmd[:order]
12
+ ar_statement += limit_clause(cmd[:limit]) if cmd[:limit]
13
+ ar_statement += skip_clause(cmd[:skip]) if cmd[:skip]
14
+ ar_statement = (ar_statement == '' ? {:results => eval('all').to_a} : {:results => eval(ar_statement[1..-1]).to_a})
15
+ ar_statement = count_clause(cmd[:count], ar_statement) if cmd[:count]
16
+ ar_statement
17
+ else
18
+ {}
19
+ end
20
+ end
21
+
22
+ private
23
+ ## WHERE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24
+ def where_clause(cmd)
25
+ ar_statement, clause = ""
26
+ cmd.each do |key, value|
27
+ clause = value.kind_of?(Hash) ? where_key_value(key, value) : "#{key} = \"" + value + "\""
28
+ ar_statement += ".where('#{clause}')"
29
+ end
30
+ ar_statement
31
+ end
32
+
33
+ def where_key_value(key, value)
34
+ action, val = ''
35
+ value.each do |k, v|
36
+ action = replace(k) if k.match(/^\$/)
37
+ val = v
38
+ end
39
+ where_build_clause(key, action, val)
40
+ end
41
+
42
+ def where_build_clause(key, action, val)
43
+ if action == 'IS'
44
+ "#{key} #{action} #{val == '1' ? 'NOT NULL' : 'NULL'}"
45
+ elsif action == "IN" || action == "NOT IN"
46
+ "#{key} #{action} #{val.gsub("\'", "\"")}"
47
+ else
48
+ "#{key} #{action} \"" + val + "\""
49
+ end
50
+ end
51
+
52
+ ## ORDER ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
53
+ def order_clause(cmd)
54
+ ar_statement = ""
55
+ cmd.each do |value|
56
+ ar_statement += ".order('#{value}')"
57
+ end
58
+ ar_statement
59
+ end
60
+
61
+ ## LIMIT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
62
+ def limit_clause(cmd)
63
+ ar_statement = ""
64
+ cmd.each { |value| ar_statement += ".limit(#{value})" }
65
+ ar_statement
66
+ end
67
+
68
+ ## COUNT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
69
+ def count_clause(cmd, ar_statement)
70
+ if cmd == "1"
71
+ ar_statement.merge(:count => ar_statement[:results].count)
72
+ else
73
+ ar_statement
74
+ end
75
+ end
76
+
77
+ ## SKIP ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
78
+ def skip_clause(cmd)
79
+ ar_statement = ""
80
+ cmd.each { |value| ar_statement += ".offset(#{value})" }
81
+ ar_statement
82
+ end
83
+
84
+ #TODO
85
+ ## INCLUDES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
86
+ def includes_clause(cmd)
87
+ includes cmd
88
+ end
89
+
90
+ #TODO
91
+ ## JOINS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
92
+ def joins_clause(cmd)
93
+ joins cmd
94
+ end
95
+
96
+ ## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
97
+ def replace(match_data)
98
+ case match_data
99
+ when '$gt' then '>'
100
+ when '$lt' then '<'
101
+ when '$gte' then '>='
102
+ when '$lte' then '<='
103
+ when '$ne' then '!='
104
+ when '$in' then 'IN'
105
+ when '$nin' then 'NOT IN'
106
+ when '$exists' then 'IS'
107
+ when '$like' then 'LIKE'
108
+ when '$ilike' then 'ILIKE'
109
+ when '$regexp' then 'REGEXP'
110
+ end
111
+ end
112
+
113
+ end
114
+
115
+ def self.included(base)
116
+ base.extend(ClassMethods)
117
+ end
118
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rquery-activerecord
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 1
9
+ version: 0.1.1
10
+ platform: ruby
11
+ authors:
12
+ - Tom Wilson, Kris Windham, Andrew Kennedy
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2012-03-12 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: json
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 6
30
+ - 3
31
+ version: 1.6.3
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ description: Rquery is a ruby gem that will allow you to pass queries into your restful api as json. It will take the json formatted queries and convert them into ActiveRecord queries.
35
+ email: team@jackrussellsoftware.com
36
+ executables: []
37
+
38
+ extensions: []
39
+
40
+ extra_rdoc_files: []
41
+
42
+ files:
43
+ - ./lib/rquery_ar.rb
44
+ has_rdoc: true
45
+ homepage: https://github.com/jackruss/rquery
46
+ licenses: []
47
+
48
+ post_install_message:
49
+ rdoc_options: []
50
+
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ segments:
65
+ - 0
66
+ version: "0"
67
+ requirements: []
68
+
69
+ rubyforge_project:
70
+ rubygems_version: 1.3.6
71
+ signing_key:
72
+ specification_version: 3
73
+ summary: Queries for your restful api!
74
+ test_files: []
75
+