quercle 0.0.1
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 +4 -0
- data/Gemfile +5 -0
- data/Rakefile +2 -0
- data/lib/quercle.rb +11 -0
- data/lib/quercle/operator.rb +24 -0
- data/lib/quercle/operator/contains.rb +15 -0
- data/lib/quercle/operator/ends_with.rb +15 -0
- data/lib/quercle/operator/equals.rb +15 -0
- data/lib/quercle/operator/greater_than.rb +15 -0
- data/lib/quercle/operator/less_than.rb +15 -0
- data/lib/quercle/operator/starts_with.rb +15 -0
- data/lib/quercle/predicate.rb +13 -0
- data/lib/quercle/predicate_set.rb +21 -0
- data/lib/quercle/version.rb +3 -0
- data/quercle.gemspec +24 -0
- data/spec/quercle_spec.rb +22 -0
- data/spec/spec_helper.rb +8 -0
- metadata +95 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/lib/quercle.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'quercle/version'
|
2
|
+
require 'quercle/predicate_set'
|
3
|
+
require 'quercle/predicate'
|
4
|
+
require 'quercle/operator'
|
5
|
+
|
6
|
+
module Quercle
|
7
|
+
def self.parse(json_or_hash)
|
8
|
+
json_or_hash = JSON.parse(json_or_hash) if json_or_hash.is_a?(String)
|
9
|
+
json_or_hash['predicates'] ? PredicateSet.new(json_or_hash) : Predicate.new(json_or_hash)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'quercle/operator/contains'
|
2
|
+
require 'quercle/operator/ends_with'
|
3
|
+
require 'quercle/operator/equals'
|
4
|
+
require 'quercle/operator/greater_than'
|
5
|
+
require 'quercle/operator/less_than'
|
6
|
+
require 'quercle/operator/starts_with'
|
7
|
+
|
8
|
+
module Quercle
|
9
|
+
module Operator
|
10
|
+
OPERATORS = {
|
11
|
+
'contains' => Contains,
|
12
|
+
'ends' => EndsWith,
|
13
|
+
'eq' => Equals,
|
14
|
+
'gt' => GreaterThan,
|
15
|
+
'lt' => LessThan,
|
16
|
+
'starts' => StartsWith
|
17
|
+
}
|
18
|
+
|
19
|
+
def self.get(key, value)
|
20
|
+
OPERATORS[key].new value
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Quercle
|
2
|
+
class Predicate
|
3
|
+
attr_reader :field, :operation
|
4
|
+
def initialize(json)
|
5
|
+
@field = json['field']
|
6
|
+
@operation = Operator.get(json['operator'], json['value'])
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_a
|
10
|
+
["#{field} #{operation.sql_fragment}", operation.value]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Quercle
|
2
|
+
class PredicateSet
|
3
|
+
attr_accessor :operator, :predicates
|
4
|
+
def initialize(json)
|
5
|
+
@operator = json['operator']
|
6
|
+
@predicates = json['predicates'].collect do |predicate_or_set|
|
7
|
+
Quercle.parse(predicate_or_set)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_a
|
12
|
+
fragments, values = [], []
|
13
|
+
predicates.each do |predicate_or_set|
|
14
|
+
array = predicate_or_set.to_a
|
15
|
+
fragments << array.shift
|
16
|
+
values += array
|
17
|
+
end
|
18
|
+
["(#{fragments.join(" #{operator} ")})", *values]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/quercle.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "quercle/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "quercle"
|
7
|
+
s.version = Quercle::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Henry Garner"]
|
10
|
+
s.email = ["henry.garner@mac.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{JSON -> Query conditions}
|
13
|
+
s.description = %q{Converts JSON hash representing SQL conditions into an array suitable for ActiveRecord or DataMapper queries}
|
14
|
+
|
15
|
+
s.rubyforge_project = "quercle"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency "json"
|
23
|
+
s.add_development_dependency "rspec"
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'quercle' do
|
4
|
+
specify 'should parse a single predicate' do
|
5
|
+
json = '{"field":"foo","operator":"contains","value":"bar"}'
|
6
|
+
parsed = Quercle.parse json
|
7
|
+
parsed.to_a.first.should == 'foo like ?'
|
8
|
+
parsed.to_a.last.should == '%bar%'
|
9
|
+
end
|
10
|
+
|
11
|
+
specify 'should parse a simple compound predicate' do
|
12
|
+
json = %q{{"operator":"AND","predicates":[{"field":"foo","operator":"contains","value":"bar"},{"field":"baz","operator":"gt","value":2000}]}}
|
13
|
+
parsed = Quercle.parse json
|
14
|
+
parsed.to_a.first.should == "(foo like ? AND baz > ?)"
|
15
|
+
end
|
16
|
+
|
17
|
+
specify 'should parse a complex compound predicate' do
|
18
|
+
json = %q{{"operator":"AND","predicates":[{"operator":"OR","predicates":[{"field":"foo","operator":"starts","value":"bar"},{"field":"baz","operator":"gt","value":2000}]},{"field":"rex","operator":"lt","value":10000}]}}
|
19
|
+
parsed = Quercle.parse json
|
20
|
+
parsed.to_a.first.should == '((foo like ? OR baz > ?) AND rex < ?)'
|
21
|
+
end
|
22
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: quercle
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Henry Garner
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-05-25 00:00:00 +01:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: json
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: "0"
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: "0"
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id002
|
38
|
+
description: Converts JSON hash representing SQL conditions into an array suitable for ActiveRecord or DataMapper queries
|
39
|
+
email:
|
40
|
+
- henry.garner@mac.com
|
41
|
+
executables: []
|
42
|
+
|
43
|
+
extensions: []
|
44
|
+
|
45
|
+
extra_rdoc_files: []
|
46
|
+
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- Gemfile
|
50
|
+
- Rakefile
|
51
|
+
- lib/quercle.rb
|
52
|
+
- lib/quercle/operator.rb
|
53
|
+
- lib/quercle/operator/contains.rb
|
54
|
+
- lib/quercle/operator/ends_with.rb
|
55
|
+
- lib/quercle/operator/equals.rb
|
56
|
+
- lib/quercle/operator/greater_than.rb
|
57
|
+
- lib/quercle/operator/less_than.rb
|
58
|
+
- lib/quercle/operator/starts_with.rb
|
59
|
+
- lib/quercle/predicate.rb
|
60
|
+
- lib/quercle/predicate_set.rb
|
61
|
+
- lib/quercle/version.rb
|
62
|
+
- quercle.gemspec
|
63
|
+
- spec/quercle_spec.rb
|
64
|
+
- spec/spec_helper.rb
|
65
|
+
has_rdoc: true
|
66
|
+
homepage: ""
|
67
|
+
licenses: []
|
68
|
+
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
|
72
|
+
require_paths:
|
73
|
+
- lib
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: "0"
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: "0"
|
86
|
+
requirements: []
|
87
|
+
|
88
|
+
rubyforge_project: quercle
|
89
|
+
rubygems_version: 1.6.2
|
90
|
+
signing_key:
|
91
|
+
specification_version: 3
|
92
|
+
summary: JSON -> Query conditions
|
93
|
+
test_files:
|
94
|
+
- spec/quercle_spec.rb
|
95
|
+
- spec/spec_helper.rb
|