factbase 0.0.27 → 0.0.28
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/factbase/term.rb +35 -32
- data/lib/factbase.rb +1 -1
- data/test/factbase/test_query.rb +2 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ffdf62af221a65ab9efa6097b01dab23edba0399bc8551757d450ff828f14367
|
4
|
+
data.tar.gz: 175dd8ead3a933305d46c8c4bb657a46efc507db3ad1045bb7495614dedfc1c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ccade318b2db8568b72fcd29dd8d8cc301a791911a749bba8154485e8e95d1a00c2466477ff7e798f8a5146e87e03c69af8493fd05ae38c9463a8ffc9e29da62
|
7
|
+
data.tar.gz: 30730a5e848923b73c98f188142f30f56fd8eec95d8839561a6be01956922f60d9fe46a9dcf361b2f6b4bffca993fd20471bd51f1e2840659ba7bc252c9853b2
|
data/lib/factbase/term.rb
CHANGED
@@ -97,18 +97,12 @@ class Factbase::Term
|
|
97
97
|
|
98
98
|
def exists(fact)
|
99
99
|
assert_args(1)
|
100
|
-
|
101
|
-
raise "A symbol expected: #{o}" unless o.is_a?(Symbol)
|
102
|
-
k = o.to_s
|
103
|
-
!fact[k].nil?
|
100
|
+
!by_symbol(0, fact).nil?
|
104
101
|
end
|
105
102
|
|
106
103
|
def absent(fact)
|
107
104
|
assert_args(1)
|
108
|
-
|
109
|
-
raise "A symbol expected: #{o}" unless o.is_a?(Symbol)
|
110
|
-
k = o.to_s
|
111
|
-
fact[k].nil?
|
105
|
+
by_symbol(0, fact).nil?
|
112
106
|
end
|
113
107
|
|
114
108
|
def eq(fact)
|
@@ -125,38 +119,31 @@ class Factbase::Term
|
|
125
119
|
|
126
120
|
def size(fact)
|
127
121
|
assert_args(1)
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
return 1 unless fact[k].is_a?(Array)
|
133
|
-
fact[k].size
|
122
|
+
v = by_symbol(0, fact)
|
123
|
+
return 0 if v.nil?
|
124
|
+
return 1 unless v.is_a?(Array)
|
125
|
+
v.size
|
134
126
|
end
|
135
127
|
|
136
128
|
def type(fact)
|
137
129
|
assert_args(1)
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
return 'nil' if fact[k].nil?
|
142
|
-
fact[k].class.to_s
|
130
|
+
v = by_symbol(0, fact)
|
131
|
+
return 'nil' if v.nil?
|
132
|
+
v.class.to_s
|
143
133
|
end
|
144
134
|
|
145
135
|
def arithmetic(op, fact)
|
146
136
|
assert_args(2)
|
147
|
-
|
148
|
-
if
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
v.any? do |vv|
|
158
|
-
vv = vv.floor if vv.is_a?(Time) && op == :==
|
159
|
-
vv.send(op, @operands[1])
|
137
|
+
lefts = the_value(0, fact)
|
138
|
+
return false if lefts.nil?
|
139
|
+
rights = the_value(1, fact)
|
140
|
+
return false if rights.nil?
|
141
|
+
lefts.any? do |l|
|
142
|
+
l = l.floor if l.is_a?(Time) && op == :==
|
143
|
+
rights.any? do |r|
|
144
|
+
r = r.floor if r.is_a?(Time) && op == :==
|
145
|
+
l.send(op, r)
|
146
|
+
end
|
160
147
|
end
|
161
148
|
end
|
162
149
|
|
@@ -165,4 +152,20 @@ class Factbase::Term
|
|
165
152
|
raise "Too many (#{c}) operands for '#{@op}' (#{num} expected)" if c > num
|
166
153
|
raise "Too few (#{c}) operands for '#{@op}' (#{num} expected)" if c < num
|
167
154
|
end
|
155
|
+
|
156
|
+
def by_symbol(pos, fact)
|
157
|
+
o = @operands[pos]
|
158
|
+
raise "A symbol expected at ##{pos}, but provided: #{o}" unless o.is_a?(Symbol)
|
159
|
+
k = o.to_s
|
160
|
+
fact[k]
|
161
|
+
end
|
162
|
+
|
163
|
+
def the_value(pos, fact)
|
164
|
+
v = @operands[pos]
|
165
|
+
v = v.eval(fact) if v.is_a?(Factbase::Term)
|
166
|
+
v = fact[v.to_s] if v.is_a?(Symbol)
|
167
|
+
return v if v.nil?
|
168
|
+
v = [v] unless v.is_a?(Array)
|
169
|
+
v
|
170
|
+
end
|
168
171
|
end
|
data/lib/factbase.rb
CHANGED
data/test/factbase/test_query.rb
CHANGED
@@ -54,9 +54,11 @@ class TestQuery < Minitest::Test
|
|
54
54
|
"(and (lt pi 100) \n\n (gt num 1000))" => 0,
|
55
55
|
'(exists pi)' => 1,
|
56
56
|
'(not (exists hello))' => 3,
|
57
|
+
'(eq "Integer" (type num))' => 2,
|
57
58
|
'(gt (size num) 2)' => 1,
|
58
59
|
'(lt (size num) 2)' => 2,
|
59
60
|
'(eq (size hello) 0)' => 3,
|
61
|
+
'(eq num pi)' => 0,
|
60
62
|
'(absent time)' => 2,
|
61
63
|
'(and (absent time) (exists pi))' => 1,
|
62
64
|
"(and (exists time) (not (\t\texists pi)))" => 1,
|