aquel 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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +6 -0
- data/aquel.gemspec +2 -1
- data/lib/aquel.rb +1 -0
- data/lib/aquel/attribute.rb +21 -0
- data/lib/aquel/attributes.rb +4 -4
- data/lib/aquel/context.rb +43 -1
- data/lib/aquel/executor.rb +17 -31
- data/lib/aquel/version.rb +1 -1
- data/spec/aquel_spec.rb +13 -11
- data/spec/test.tsv +1 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1236cbde36dfec9820fad7685dbecb610d6d5a83
|
4
|
+
data.tar.gz: d1912cfcec42567a72f9a9eba7388af5b10bdf2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e4227298993b13b88673e96f5684920382884b2b7e02ab1febe60467bc324d0de4a3443e577586b5027d8eebe2f00b13e3e2c2f1f46e29b3f1abc1a78bffa19
|
7
|
+
data.tar.gz: e6b08b20f10bcb1c29386248ed1ff6092a50c1409e826b48cdbd8690fc10276be4d828d52baae5838d4978d61ba4a89147ee9b8537695c73a681c9a857a76cb0
|
data/README.md
CHANGED
data/Rakefile
CHANGED
data/aquel.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["youpy"]
|
10
10
|
spec.email = ["youpy@buycheapviagraonlinenow.com"]
|
11
11
|
spec.summary = %q{a(nything) que(ry) l(anguage)}
|
12
|
-
spec.homepage = ""
|
12
|
+
spec.homepage = "https://github.com/youpy/aquel"
|
13
13
|
spec.license = "MIT"
|
14
14
|
|
15
15
|
spec.files = `git ls-files -z`.split("\x0")
|
@@ -21,4 +21,5 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
23
|
spec.add_development_dependency "nokogiri"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
24
25
|
end
|
data/lib/aquel.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Aquel
|
2
|
+
class Attribute
|
3
|
+
attr_reader :name, :value
|
4
|
+
|
5
|
+
def initialize(options)
|
6
|
+
@name = options[:name]
|
7
|
+
@value = options[:value]
|
8
|
+
end
|
9
|
+
|
10
|
+
def operate(target)
|
11
|
+
case name
|
12
|
+
when '='
|
13
|
+
target == value
|
14
|
+
when '<>'
|
15
|
+
target != value
|
16
|
+
else
|
17
|
+
false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/aquel/attributes.rb
CHANGED
data/lib/aquel/context.rb
CHANGED
@@ -5,10 +5,48 @@ module Aquel
|
|
5
5
|
def initialize(block)
|
6
6
|
@block = block
|
7
7
|
@find_by_block = {}
|
8
|
+
@header = false
|
8
9
|
end
|
9
10
|
|
10
|
-
def execute
|
11
|
+
def execute(attributes)
|
11
12
|
instance_eval(&@block)
|
13
|
+
|
14
|
+
items = []
|
15
|
+
document = document_block.call(attributes.equal_values)
|
16
|
+
|
17
|
+
if items_block
|
18
|
+
items_block.call(document).each do |item|
|
19
|
+
value = split_block.call(item)
|
20
|
+
items << (value.kind_of?(Array) ? value : [value])
|
21
|
+
end
|
22
|
+
elsif find_by_block.size > 0
|
23
|
+
find_by_block.each do |k, v|
|
24
|
+
v.call(attributes.equal_values[k], document).each do |item|
|
25
|
+
value = split_block.call(item)
|
26
|
+
items << (value.kind_of?(Array) ? value : [value])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
else
|
30
|
+
while item = item_block.call(document)
|
31
|
+
items << split_block.call(item)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
if @header
|
36
|
+
header = items.shift.map(&:downcase)
|
37
|
+
else
|
38
|
+
header = (1..(items.first.size)).to_a
|
39
|
+
end
|
40
|
+
|
41
|
+
items.map do |itm|
|
42
|
+
item = {}
|
43
|
+
itm.each_with_index { |v, i| item[header[i]] = v }
|
44
|
+
item
|
45
|
+
end
|
46
|
+
ensure
|
47
|
+
if document.respond_to?(:close)
|
48
|
+
document.close
|
49
|
+
end
|
12
50
|
end
|
13
51
|
|
14
52
|
def document(&block)
|
@@ -30,5 +68,9 @@ module Aquel
|
|
30
68
|
def find_by(name, &block)
|
31
69
|
@find_by_block[name] = block
|
32
70
|
end
|
71
|
+
|
72
|
+
def has_header
|
73
|
+
@header = true
|
74
|
+
end
|
33
75
|
end
|
34
76
|
end
|
data/lib/aquel/executor.rb
CHANGED
@@ -18,45 +18,29 @@ module Aquel
|
|
18
18
|
ast = parser.parse(sql).parsetree.first
|
19
19
|
type = ast['SELECT']['fromClause'][0]['RANGEVAR']['relname']
|
20
20
|
|
21
|
-
context = @contexts[type]
|
22
|
-
context.execute!
|
23
|
-
|
24
21
|
items = []
|
25
22
|
attributes = Attributes.new
|
26
23
|
|
27
24
|
walk(ast['SELECT']['whereClause'], attributes)
|
28
|
-
|
29
|
-
|
30
|
-
if context.items_block
|
31
|
-
context.items_block.call(document).each do |item|
|
32
|
-
value = context.split_block.call(item)
|
33
|
-
items << (value.kind_of?(Array) ? value : [value])
|
34
|
-
end
|
35
|
-
elsif context.find_by_block.size > 0
|
36
|
-
context.find_by_block.each do |k, v|
|
37
|
-
v.call(attributes.equal_values[k], document).each do |item|
|
38
|
-
value = context.split_block.call(item)
|
39
|
-
items << (value.kind_of?(Array) ? value : [value])
|
40
|
-
end
|
41
|
-
end
|
42
|
-
else
|
43
|
-
while item = context.item_block.call(document)
|
44
|
-
items << context.split_block.call(item)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
25
|
+
context = @contexts[type]
|
26
|
+
items = context.execute(attributes)
|
48
27
|
items = filter(items, attributes)
|
49
28
|
items = colum_filter(items, ast['SELECT']['targetList'])
|
50
29
|
end
|
51
30
|
|
52
31
|
def filter(items, attributes)
|
53
32
|
attributes.each do |k, v|
|
54
|
-
|
33
|
+
case k
|
34
|
+
when Fixnum
|
35
|
+
items = items.find_all do |item|
|
36
|
+
v.operate(item[k])
|
37
|
+
end
|
38
|
+
when String
|
55
39
|
items = items.find_all do |item|
|
56
|
-
if
|
57
|
-
item[k
|
58
|
-
|
59
|
-
|
40
|
+
if item[k]
|
41
|
+
v.operate(item[k])
|
42
|
+
else
|
43
|
+
true
|
60
44
|
end
|
61
45
|
end
|
62
46
|
end
|
@@ -67,7 +51,7 @@ module Aquel
|
|
67
51
|
|
68
52
|
def colum_filter(items, target_list)
|
69
53
|
items.map do |item|
|
70
|
-
result =
|
54
|
+
result = {}
|
71
55
|
|
72
56
|
target_list.each do |target|
|
73
57
|
val = expr_value(target['RESTARGET']['val'])
|
@@ -76,7 +60,9 @@ module Aquel
|
|
76
60
|
when {"A_STAR"=>{}}
|
77
61
|
result = item
|
78
62
|
when Fixnum
|
79
|
-
result
|
63
|
+
result[val] = item[val]
|
64
|
+
when String
|
65
|
+
result[val] = item[val]
|
80
66
|
end
|
81
67
|
end
|
82
68
|
|
@@ -88,7 +74,7 @@ module Aquel
|
|
88
74
|
if aexpr = node['AEXPR']
|
89
75
|
k = expr_value(aexpr['lexpr'])
|
90
76
|
v = expr_value(aexpr['rexpr'])
|
91
|
-
attributes[k] =
|
77
|
+
attributes[k] = Attribute.new(:value => v, :name => aexpr['name'][0])
|
92
78
|
elsif aexpr = node['AEXPR AND']
|
93
79
|
walk(aexpr['lexpr'], attributes)
|
94
80
|
walk(aexpr['rexpr'], attributes)
|
data/lib/aquel/version.rb
CHANGED
data/spec/aquel_spec.rb
CHANGED
@@ -10,6 +10,8 @@ describe Aquel do
|
|
10
10
|
|
11
11
|
let(:aquel) {
|
12
12
|
Aquel.define 'tsv' do
|
13
|
+
has_header
|
14
|
+
|
13
15
|
document do |attributes|
|
14
16
|
open(attributes['path'])
|
15
17
|
end
|
@@ -30,32 +32,32 @@ describe Aquel do
|
|
30
32
|
items = aquel.execute("select * from tsv where path = '#{tsv_path}'")
|
31
33
|
|
32
34
|
expect(items.size).to eql(2)
|
33
|
-
expect(items.first).to eql(
|
35
|
+
expect(items.first).to eql({"col1"=>"foo1", "col2"=>"bar1", "col3"=>"baz1"})
|
34
36
|
|
35
|
-
items = aquel.execute("select
|
37
|
+
items = aquel.execute("select COL1,col3 from tsv where path = '#{tsv_path}'")
|
36
38
|
|
37
39
|
expect(items.size).to eql(2)
|
38
|
-
expect(items.first).to eql(
|
40
|
+
expect(items.first).to eql({"col1"=>"foo1", "col3"=>"baz1"})
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
42
44
|
context 'filter query' do
|
43
45
|
it 'finds matching line' do
|
44
46
|
# TODO: support prepared statement
|
45
|
-
items = aquel.execute("select * from tsv where path = '#{tsv_path}' and
|
47
|
+
items = aquel.execute("select * from tsv where path = '#{tsv_path}' and col1 = 'foo2'")
|
46
48
|
|
47
49
|
expect(items.size).to eql(1)
|
48
|
-
expect(items.first).to eql(
|
50
|
+
expect(items.first).to eql({"col1"=>"foo2", "col2"=>"bar2", "col3"=>"baz2"})
|
49
51
|
|
50
|
-
items = aquel.execute("select
|
52
|
+
items = aquel.execute("select col1,col3 from tsv where path = '#{tsv_path}' and col1 = 'foo1'")
|
51
53
|
|
52
54
|
expect(items.size).to eql(1)
|
53
|
-
expect(items.first).to eql(
|
55
|
+
expect(items.first).to eql({"col1"=>"foo1", "col3"=>"baz1"})
|
54
56
|
|
55
|
-
items = aquel.execute("select
|
57
|
+
items = aquel.execute("select col1,COL3 from tsv where path = '#{tsv_path}' and col1 != 'foo1'")
|
56
58
|
|
57
59
|
expect(items.size).to eql(1)
|
58
|
-
expect(items.first).to eql(
|
60
|
+
expect(items.first).to eql({"col1"=>"foo2", "col3"=>"baz2"})
|
59
61
|
end
|
60
62
|
end
|
61
63
|
end
|
@@ -87,7 +89,7 @@ describe Aquel do
|
|
87
89
|
items = aquel.execute("select * from html where path = '#{html_path}'")
|
88
90
|
|
89
91
|
expect(items.size).to eql(2)
|
90
|
-
expect(items.first).to eql(
|
92
|
+
expect(items.first).to eql({1 => 'a'})
|
91
93
|
end
|
92
94
|
end
|
93
95
|
end
|
@@ -114,7 +116,7 @@ describe Aquel do
|
|
114
116
|
items = aquel.execute("select * from html where path = '#{html_path}' and css = 'div.foo'")
|
115
117
|
|
116
118
|
expect(items.size).to eql(2)
|
117
|
-
expect(items.first).to eql(
|
119
|
+
expect(items.first).to eql({1 => 'a'})
|
118
120
|
end
|
119
121
|
end
|
120
122
|
end
|
data/spec/test.tsv
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aquel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- youpy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg_query
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
69
83
|
description:
|
70
84
|
email:
|
71
85
|
- youpy@buycheapviagraonlinenow.com
|
@@ -81,6 +95,7 @@ files:
|
|
81
95
|
- Rakefile
|
82
96
|
- aquel.gemspec
|
83
97
|
- lib/aquel.rb
|
98
|
+
- lib/aquel/attribute.rb
|
84
99
|
- lib/aquel/attributes.rb
|
85
100
|
- lib/aquel/context.rb
|
86
101
|
- lib/aquel/executor.rb
|
@@ -89,7 +104,7 @@ files:
|
|
89
104
|
- spec/spec_helper.rb
|
90
105
|
- spec/test.html
|
91
106
|
- spec/test.tsv
|
92
|
-
homepage:
|
107
|
+
homepage: https://github.com/youpy/aquel
|
93
108
|
licenses:
|
94
109
|
- MIT
|
95
110
|
metadata: {}
|