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 ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in quercle.gemspec
4
+ gemspec
5
+ gem 'rspec'
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
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,15 @@
1
+ module Quercle
2
+ module Operator
3
+ class Contains
4
+ attr_accessor :value
5
+
6
+ def initialize(value)
7
+ @value = "%#{value}%"
8
+ end
9
+
10
+ def sql_fragment
11
+ "like ?"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Quercle
2
+ module Operator
3
+ class EndsWith
4
+ attr_accessor :value
5
+
6
+ def initialize(value)
7
+ @value = "%#{value}"
8
+ end
9
+
10
+ def sql_fragment
11
+ "like ?"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Quercle
2
+ module Operator
3
+ class Equals
4
+ attr_accessor :value
5
+
6
+ def initialize(value)
7
+ @value = value
8
+ end
9
+
10
+ def sql_fragment
11
+ "= ?"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Quercle
2
+ module Operator
3
+ class GreaterThan
4
+ attr_accessor :value
5
+
6
+ def initialize(value)
7
+ @value = value
8
+ end
9
+
10
+ def sql_fragment
11
+ "> ?"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Quercle
2
+ module Operator
3
+ class LessThan
4
+ attr_accessor :value
5
+
6
+ def initialize(value)
7
+ @value = value
8
+ end
9
+
10
+ def sql_fragment
11
+ "< ?"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Quercle
2
+ module Operator
3
+ class StartsWith
4
+ attr_accessor :value
5
+
6
+ def initialize(value)
7
+ @value = "#{value}%"
8
+ end
9
+
10
+ def sql_fragment
11
+ "like ?"
12
+ end
13
+ end
14
+ end
15
+ 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
@@ -0,0 +1,3 @@
1
+ module Quercle
2
+ VERSION = "0.0.1"
3
+ 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
@@ -0,0 +1,8 @@
1
+ require 'rubygems'
2
+
3
+ require 'json'
4
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'quercle')
5
+
6
+ RSpec.configure do |config|
7
+ # some (optional) config here
8
+ end
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