factbase 0.15.0 → 0.15.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -5
- data/factbase.gemspec +4 -4
- data/lib/factbase/fact.rb +1 -1
- data/lib/factbase/fact_as_yaml.rb +10 -1
- data/lib/factbase/indexed/indexed_term.rb +6 -1
- data/lib/factbase/version.rb +1 -1
- metadata +7 -87
- data/.0pdd.yml +0 -8
- data/.gitattributes +0 -7
- data/.github/publish-benchmark.sh +0 -24
- data/.github/workflows/actionlint.yml +0 -25
- data/.github/workflows/benchmark.yml +0 -36
- data/.github/workflows/codecov.yml +0 -27
- data/.github/workflows/copyrights.yml +0 -19
- data/.github/workflows/markdown-lint.yml +0 -23
- data/.github/workflows/pdd.yml +0 -19
- data/.github/workflows/rake.yml +0 -28
- data/.github/workflows/reuse.yml +0 -19
- data/.github/workflows/typos.yml +0 -19
- data/.github/workflows/xcop.yml +0 -19
- data/.github/workflows/yamllint.yml +0 -19
- data/.gitignore +0 -11
- data/.pdd +0 -7
- data/.rubocop.yml +0 -51
- data/.rultor.yml +0 -27
- data/benchmark/bench_factbase.rb +0 -61
- data/benchmark/bench_large_query.rb +0 -128
- data/benchmark/bench_query.rb +0 -57
- data/benchmark/bench_taped.rb +0 -33
- data/fixtures/stories/agg.yml +0 -17
- data/fixtures/stories/always.yml +0 -16
- data/fixtures/stories/and.yml +0 -19
- data/fixtures/stories/as.yml +0 -16
- data/fixtures/stories/count.yml +0 -18
- data/fixtures/stories/empty.yml +0 -23
- data/fixtures/stories/eq.yml +0 -30
- data/fixtures/stories/gt.yml +0 -18
- data/fixtures/stories/join.yml +0 -22
- data/fixtures/stories/max.yml +0 -14
- data/fixtures/stories/min.yml +0 -14
- data/fixtures/stories/nth.yml +0 -14
- data/fixtures/stories/one.yml +0 -14
- data/fixtures/stories/or.yml +0 -18
- data/fixtures/stories/sprintf.yml +0 -12
- data/fixtures/stories/sum.yml +0 -14
- data/fixtures/stories/unique.yml +0 -30
- data/renovate.json +0 -6
- data/test/factbase/cached/test_cached_factbase.rb +0 -44
- data/test/factbase/cached/test_cached_query.rb +0 -100
- data/test/factbase/indexed/test_indexed_fact.rb +0 -23
- data/test/factbase/indexed/test_indexed_factbase.rb +0 -96
- data/test/factbase/indexed/test_indexed_query.rb +0 -208
- data/test/factbase/indexed/test_indexed_term.rb +0 -140
- data/test/factbase/sync/test_sync_factbase.rb +0 -22
- data/test/factbase/sync/test_sync_query.rb +0 -30
- data/test/factbase/terms/test_aggregates.rb +0 -63
- data/test/factbase/terms/test_aliases.rb +0 -58
- data/test/factbase/terms/test_casting.rb +0 -33
- data/test/factbase/terms/test_debug.rb +0 -111
- data/test/factbase/terms/test_defn.rb +0 -48
- data/test/factbase/terms/test_logical.rb +0 -57
- data/test/factbase/terms/test_math.rb +0 -122
- data/test/factbase/terms/test_meta.rb +0 -70
- data/test/factbase/terms/test_ordering.rb +0 -44
- data/test/factbase/terms/test_strings.rb +0 -36
- data/test/factbase/terms/test_system.rb +0 -31
- data/test/factbase/test_accum.rb +0 -74
- data/test/factbase/test_churn.rb +0 -41
- data/test/factbase/test_fact.rb +0 -108
- data/test/factbase/test_fact_as_yaml.rb +0 -77
- data/test/factbase/test_flatten.rb +0 -28
- data/test/factbase/test_impatient.rb +0 -176
- data/test/factbase/test_inv.rb +0 -44
- data/test/factbase/test_logged.rb +0 -155
- data/test/factbase/test_pre.rb +0 -35
- data/test/factbase/test_query.rb +0 -445
- data/test/factbase/test_rules.rb +0 -128
- data/test/factbase/test_syntax.rb +0 -166
- data/test/factbase/test_tallied.rb +0 -81
- data/test/factbase/test_taped.rb +0 -72
- data/test/factbase/test_tee.rb +0 -85
- data/test/factbase/test_term.rb +0 -87
- data/test/factbase/test_to_json.rb +0 -35
- data/test/factbase/test_to_xml.rb +0 -89
- data/test/factbase/test_to_yaml.rb +0 -39
- data/test/test__helper.rb +0 -41
- data/test/test_factbase.rb +0 -509
data/.rultor.yml
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
docker:
|
6
|
-
image: yegor256/ruby
|
7
|
-
assets:
|
8
|
-
rubygems.yml: yegor256/home#assets/rubygems.yml
|
9
|
-
install: |
|
10
|
-
pdd -f /dev/null
|
11
|
-
bundle install --no-color
|
12
|
-
release:
|
13
|
-
pre: false
|
14
|
-
script: |-
|
15
|
-
set -x
|
16
|
-
[[ "${tag}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || exit -1
|
17
|
-
bundle exec rake
|
18
|
-
rm -rf *.gem
|
19
|
-
sed -i "s/0\.0\.0/${tag}/g" lib/factbase/version.rb
|
20
|
-
git add lib/factbase/version.rb
|
21
|
-
git commit -m "version set to ${tag}"
|
22
|
-
gem build factbase.gemspec
|
23
|
-
chmod 0600 ../rubygems.yml
|
24
|
-
gem push *.gem --config-file ../rubygems.yml
|
25
|
-
merge:
|
26
|
-
script: |-
|
27
|
-
bundle exec rake
|
data/benchmark/bench_factbase.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
4
|
-
# SPDX-License-Identifier: MIT
|
5
|
-
|
6
|
-
require_relative '../lib/factbase'
|
7
|
-
|
8
|
-
def bench_factbase(bmk, fb)
|
9
|
-
total = 20_000
|
10
|
-
bmk.report("insert #{total} facts") do
|
11
|
-
total.times do
|
12
|
-
fact = fb.insert
|
13
|
-
fact.foo = rand(0.0..100.0).round(3)
|
14
|
-
fact.bar = rand(100..300)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
bin = nil
|
19
|
-
bmk.report("export #{total} facts") do
|
20
|
-
bin = fb.export
|
21
|
-
end
|
22
|
-
bmk.report("import #{bin.size} bytes (#{total} facts)") do
|
23
|
-
fb2 = Factbase.new
|
24
|
-
fb2.import(bin)
|
25
|
-
end
|
26
|
-
|
27
|
-
actions = 10
|
28
|
-
bmk.report("insert #{actions} facts") do
|
29
|
-
fb.txn do |fbt|
|
30
|
-
actions.times do
|
31
|
-
fbt.insert.z = rand(0..100)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
bmk.report("query #{actions} times w/txn") do
|
36
|
-
fb.txn do |fbt|
|
37
|
-
actions.times do |i|
|
38
|
-
fbt.query("(gt foo #{i})").each.to_a.each
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
bmk.report("query #{actions} times w/o txn") do
|
43
|
-
actions.times do |i|
|
44
|
-
fb.query("(gt foo #{i})").each.to_a.each
|
45
|
-
end
|
46
|
-
end
|
47
|
-
bmk.report("modify #{actions} attrs w/txn") do
|
48
|
-
fb.txn do |fbt|
|
49
|
-
actions.times do |i|
|
50
|
-
fbt.query("(gt foo #{i})").each.to_a.first.bar = 55
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
bmk.report("delete #{actions} facts w/txn") do
|
55
|
-
fb.txn do |fbt|
|
56
|
-
actions.times do |i|
|
57
|
-
fbt.query("(gt foo #{100 - i})").delete!
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,128 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
4
|
-
# SPDX-License-Identifier: MIT
|
5
|
-
|
6
|
-
require_relative '../lib/factbase'
|
7
|
-
require_relative '../lib/factbase/logged'
|
8
|
-
|
9
|
-
def bench_large_query(bmk, fb)
|
10
|
-
total = 200
|
11
|
-
repo = 'foo'
|
12
|
-
total.times do |i|
|
13
|
-
f = fb.insert
|
14
|
-
f.id = i
|
15
|
-
f.where = 'github'
|
16
|
-
f.what = 'issue-was-closed'
|
17
|
-
f.who = 444
|
18
|
-
f.when = Time.now - (i * rand(1_000..100_000))
|
19
|
-
f.issue = i
|
20
|
-
f.repository = repo
|
21
|
-
end
|
22
|
-
total.times do |i|
|
23
|
-
f = fb.insert
|
24
|
-
f.id = i + total
|
25
|
-
f.where = 'github'
|
26
|
-
f.what = 'label-was-attached'
|
27
|
-
f.when = Time.now - (i * rand(1_000..100_000))
|
28
|
-
f.issue = i
|
29
|
-
f.repository = repo
|
30
|
-
f.label = 'bug'
|
31
|
-
end
|
32
|
-
total.times do |i|
|
33
|
-
f = fb.insert
|
34
|
-
f.id = i + (total * 2)
|
35
|
-
f.where = 'github'
|
36
|
-
f.what = 'issue-was-opened'
|
37
|
-
f.who = 555
|
38
|
-
f.when = Time.now - (i * rand(1_000..100_000))
|
39
|
-
f.issue = i
|
40
|
-
f.repository = repo
|
41
|
-
end
|
42
|
-
total.times do |i|
|
43
|
-
f = fb.insert
|
44
|
-
f.id = i + (total * 3)
|
45
|
-
f.where = 'github'
|
46
|
-
f.what = 'issue-was-assigned'
|
47
|
-
f.who = 666
|
48
|
-
f.when = Time.now - (i * rand(1_000..100_000))
|
49
|
-
f.issue = i
|
50
|
-
f.repository = repo
|
51
|
-
end
|
52
|
-
|
53
|
-
q = "(and
|
54
|
-
(eq what 'issue-was-closed')
|
55
|
-
(exists where)
|
56
|
-
(exists who)
|
57
|
-
(exists when)
|
58
|
-
(exists issue)
|
59
|
-
(exists repository)
|
60
|
-
(join 'label' (and
|
61
|
-
(eq what 'label-was-attached')
|
62
|
-
(eq issue $issue)
|
63
|
-
(eq where $where)
|
64
|
-
(eq repository $repository)
|
65
|
-
(or (eq label 'bug') (eq label 'enhancement') (eq label 'question'))))
|
66
|
-
(exists label)
|
67
|
-
(join 'opened_when<=when,opener<=who' (and
|
68
|
-
(eq what 'issue-was-opened')
|
69
|
-
(eq where $where)
|
70
|
-
(eq issue $issue)
|
71
|
-
(eq repository $repository)))
|
72
|
-
(exists opener)
|
73
|
-
(join 'assigned_when<=when,assigner<=who' (and
|
74
|
-
(eq what 'issue-was-assigned')
|
75
|
-
(eq where $where)
|
76
|
-
(eq issue $issue)
|
77
|
-
(eq repository $repository)))
|
78
|
-
(exists assigner)
|
79
|
-
(as seconds (to_integer (minus when assigned_when)))
|
80
|
-
(as closer who)
|
81
|
-
(as who assigner)
|
82
|
-
(empty (and
|
83
|
-
(eq what 'bug-was-resolved')
|
84
|
-
(eq where $where)
|
85
|
-
(eq issue $issue)
|
86
|
-
(eq repository $repository))))".gsub(/\s+/, ' ')
|
87
|
-
|
88
|
-
cycles = 1
|
89
|
-
bmk.report("#{q[0..40]}... -> #{total}") do
|
90
|
-
cycles.times do
|
91
|
-
t = fb.query(q).each.to_a.size
|
92
|
-
raise "Found #{t} facts, expected to find #{total}" unless t == total
|
93
|
-
end
|
94
|
-
end
|
95
|
-
bmk.report("#{q[0..40]}... -> #{total}/txn") do
|
96
|
-
cycles.times do
|
97
|
-
fb.txn do |fbt|
|
98
|
-
t = fbt.query(q).each.to_a.size
|
99
|
-
raise "Found #{t} facts, expected to find #{total}" unless t == total
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
total.times do |i|
|
105
|
-
f = fb.insert
|
106
|
-
f.id = i
|
107
|
-
f.where = 'github'
|
108
|
-
f.what = 'bug-was-resolved'
|
109
|
-
f.who = 444
|
110
|
-
f.when = Time.now - (i * rand(1_000..100_000))
|
111
|
-
f.issue = i
|
112
|
-
f.repository = repo
|
113
|
-
end
|
114
|
-
bmk.report("#{q[0..40]}... -> zero") do
|
115
|
-
cycles.times do
|
116
|
-
t = fb.query(q).each.to_a.size
|
117
|
-
raise "Found #{t} facts, expected to find nothing" unless t.zero?
|
118
|
-
end
|
119
|
-
end
|
120
|
-
bmk.report("#{q[0..40]}... -> zero/txn") do
|
121
|
-
cycles.times do
|
122
|
-
fb.txn do |fbt|
|
123
|
-
t = fbt.query(q).each.to_a.size
|
124
|
-
raise "Found #{t} facts, expected to find nothing" unless t.zero?
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
data/benchmark/bench_query.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
4
|
-
# SPDX-License-Identifier: MIT
|
5
|
-
|
6
|
-
require 'ellipsized'
|
7
|
-
require 'timeout'
|
8
|
-
require_relative '../lib/factbase'
|
9
|
-
|
10
|
-
def bench_query(bmk, fb)
|
11
|
-
total = 20_000
|
12
|
-
total.times do |i|
|
13
|
-
f = fb.insert
|
14
|
-
f.what = 'foo'
|
15
|
-
f.where = 'github'
|
16
|
-
f.id = i
|
17
|
-
f.title = "Object Thinking #{i}"
|
18
|
-
f.time = Time.now.iso8601
|
19
|
-
f.cost = rand(1..100)
|
20
|
-
f.foo = rand(0.0..100.0).round(3)
|
21
|
-
f.bar = rand(100..300)
|
22
|
-
f.blue = 1 if rand > 0.5
|
23
|
-
f.seenBy = "User#{i}" if i.even?
|
24
|
-
f.zzz = "Extra#{i}" if (i % 10).zero?
|
25
|
-
end
|
26
|
-
|
27
|
-
runs = 3
|
28
|
-
[
|
29
|
-
'(gt time \'2024-03-23T03:21:43Z\')',
|
30
|
-
'(gt cost 50)',
|
31
|
-
'(eq title \'Object Thinking 5000\')',
|
32
|
-
'(and (eq foo 42.998) (or (gt bar 200) (absent zzz)))',
|
33
|
-
'(and (exists foo) (not (exists blue)))',
|
34
|
-
'(eq id (agg (always) (max id)))',
|
35
|
-
'(join "c<=cost,b<=bar" (eq id (agg (always) (max id))))',
|
36
|
-
'(and
|
37
|
-
(eq what "foo")
|
38
|
-
(join "w<=what"
|
39
|
-
(and
|
40
|
-
(eq id $id)
|
41
|
-
(eq what "foo")
|
42
|
-
(eq where "github")))
|
43
|
-
(assert "has it" (one id)))'
|
44
|
-
].each do |q|
|
45
|
-
bmk.report(q.tr("\n", ' ').gsub(/\s+/, ' ').ellipsized(50, :right)) do
|
46
|
-
Timeout.timeout(runs * 3) do
|
47
|
-
runs.times do
|
48
|
-
fb.query(q).each.to_a
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
bmk.report('delete!') do
|
55
|
-
fb.query('(gt foo 50)').delete!
|
56
|
-
end
|
57
|
-
end
|
data/benchmark/bench_taped.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
4
|
-
# SPDX-License-Identifier: MIT
|
5
|
-
|
6
|
-
require_relative '../lib/factbase'
|
7
|
-
require_relative '../lib/factbase/taped'
|
8
|
-
|
9
|
-
def bench_taped(bmk, _fb)
|
10
|
-
maps = []
|
11
|
-
taped = Factbase::Taped.new(maps)
|
12
|
-
|
13
|
-
cycles = 50_000
|
14
|
-
bmk.report("Taped.append() x#{cycles}") do
|
15
|
-
cycles.times do
|
16
|
-
taped << { foo: rand(0..100) }
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
cycles /= 400
|
21
|
-
bmk.report("Taped.each() x#{cycles}") do
|
22
|
-
cycles.times do
|
23
|
-
taped.each.to_a
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
cycles *= 3
|
28
|
-
bmk.report("Taped.delete_if() x#{cycles}") do
|
29
|
-
cycles.times do
|
30
|
-
taped.delete_if { |m| m[:foo] < 50 }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/fixtures/stories/agg.yml
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
facts:
|
5
|
-
- name: Jeff
|
6
|
-
dob: 1979
|
7
|
-
- name: Walter
|
8
|
-
dob: 1976
|
9
|
-
- name: Maude
|
10
|
-
dob: 1983
|
11
|
-
queries:
|
12
|
-
- query: (agg (lt dob 1980) (max dob))
|
13
|
-
one: 1979
|
14
|
-
- query: (agg (always) (min dob))
|
15
|
-
one: 1976
|
16
|
-
- query: (agg (and (eq name "Jeff") (lt dob 2025)) (min dob))
|
17
|
-
one: 1979
|
data/fixtures/stories/always.yml
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Jeff Lebowski
|
7
|
-
age: 41
|
8
|
-
- name: Walter Sobchak
|
9
|
-
age: 45
|
10
|
-
- name: Maude Lebowski
|
11
|
-
age: 31
|
12
|
-
queries:
|
13
|
-
- query: (always)
|
14
|
-
size: 3
|
15
|
-
- query: (not (always))
|
16
|
-
size: 0
|
data/fixtures/stories/and.yml
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Jeff
|
7
|
-
age: 41
|
8
|
-
movie: Big Lebowski
|
9
|
-
- name: Walter
|
10
|
-
age: 43
|
11
|
-
friend: Donny
|
12
|
-
movie: Big Lebowski
|
13
|
-
queries:
|
14
|
-
- query: (and (eq movie "Big Lebowski") (exists age) (not (exists friend)))
|
15
|
-
size: 1
|
16
|
-
- query: (and (exists age) (not (exists foo)))
|
17
|
-
size: 2
|
18
|
-
- query: (and (exists age) (exists foo))
|
19
|
-
size: 0
|
data/fixtures/stories/as.yml
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Jeff
|
7
|
-
dob: 1979
|
8
|
-
- name: Walter
|
9
|
-
dob: 1976
|
10
|
-
- name: Maude
|
11
|
-
dob: 1983
|
12
|
-
queries:
|
13
|
-
- query: (as age (minus 2025 dob))
|
14
|
-
size: 3
|
15
|
-
- query: (as gender "m/f")
|
16
|
-
size: 3
|
data/fixtures/stories/count.yml
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Jeff
|
7
|
-
age: 41
|
8
|
-
- name: Walter
|
9
|
-
age: 45
|
10
|
-
- name: Maude
|
11
|
-
age: 31
|
12
|
-
queries:
|
13
|
-
- query: (count)
|
14
|
-
one: 3
|
15
|
-
- query: (agg (eq name "Jeff") (count))
|
16
|
-
one: 1
|
17
|
-
- query: (agg (gt age 40) (count))
|
18
|
-
one: 2
|
data/fixtures/stories/empty.yml
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- man: Jeff
|
7
|
-
wife: Sarah
|
8
|
-
- man: Walter
|
9
|
-
wife: Lucy
|
10
|
-
- man: Donny
|
11
|
-
wife: Nicole
|
12
|
-
- man: Peter
|
13
|
-
wife: Dorah
|
14
|
-
- woman: Lucy
|
15
|
-
- woman: Nicole
|
16
|
-
- woman: Dorah
|
17
|
-
queries:
|
18
|
-
- query: (and (exists man) (not (empty (and (exists woman) (eq woman $wife)))))
|
19
|
-
size: 3
|
20
|
-
- query: (and (exists man) (empty (and (exists woman) (eq woman $wife))))
|
21
|
-
size: 1
|
22
|
-
- query: (empty (eq woman $woman))
|
23
|
-
size: 4
|
data/fixtures/stories/eq.yml
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- foo: 42
|
7
|
-
bar: 33
|
8
|
-
- name: Jeff Lebowski
|
9
|
-
age: 41
|
10
|
-
- name: Maude
|
11
|
-
friends: [Jeff, Donny]
|
12
|
-
queries:
|
13
|
-
- query: (eq foo 42)
|
14
|
-
size: 1
|
15
|
-
- query: (not (eq foo 42))
|
16
|
-
size: 2
|
17
|
-
- query: (eq foo "42")
|
18
|
-
size: 0
|
19
|
-
- query: (not (eq foo "42"))
|
20
|
-
size: 3
|
21
|
-
- query: (eq foo 10)
|
22
|
-
size: 0
|
23
|
-
- query: (eq friends "Jeff")
|
24
|
-
size: 1
|
25
|
-
- query: (eq friends "Donny")
|
26
|
-
size: 1
|
27
|
-
- query: (eq name "Jeff Lebowski")
|
28
|
-
size: 1
|
29
|
-
- query: (eq bar "Hello")
|
30
|
-
size: 0
|
data/fixtures/stories/gt.yml
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Jeff Lebowski
|
7
|
-
age: 41
|
8
|
-
- name: Walter Sobchak
|
9
|
-
age: 45
|
10
|
-
- name: Maude Lebowski
|
11
|
-
age: 31
|
12
|
-
queries:
|
13
|
-
- query: (gt age 40)
|
14
|
-
size: 2
|
15
|
-
- query: (not (gt age 40))
|
16
|
-
size: 1
|
17
|
-
- query: (and (gt age 30) (matches name "^M.*$"))
|
18
|
-
size: 1
|
data/fixtures/stories/join.yml
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Jeff
|
7
|
-
- name: Walter
|
8
|
-
- name: Maude
|
9
|
-
- person: Jeff
|
10
|
-
age: 41
|
11
|
-
- person: Walter
|
12
|
-
age: 45
|
13
|
-
queries:
|
14
|
-
- query: |
|
15
|
-
(and
|
16
|
-
(join 'age<=age' (eq person $name))
|
17
|
-
(exists age))
|
18
|
-
size: 4
|
19
|
-
- query: (and (join 'age' (eq person $name)) (exists age))
|
20
|
-
size: 4
|
21
|
-
- query: (and (join 'x<=age' (eq age (agg (exists person) (max age)))) (eq x 45))
|
22
|
-
size: 5
|
data/fixtures/stories/max.yml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Jeff
|
7
|
-
age: 41
|
8
|
-
- name: Walter
|
9
|
-
age: 45
|
10
|
-
- name: Maude
|
11
|
-
age: 31
|
12
|
-
queries:
|
13
|
-
- query: (max age)
|
14
|
-
one: 45
|
data/fixtures/stories/min.yml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Jeff Lebowski
|
7
|
-
age: 41
|
8
|
-
- name: Walter Sobchak
|
9
|
-
age: 45
|
10
|
-
- name: Maude Lebowski
|
11
|
-
age: 31
|
12
|
-
queries:
|
13
|
-
- query: (min age)
|
14
|
-
one: 31
|
data/fixtures/stories/nth.yml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Jeff
|
7
|
-
cities: [LA, SF]
|
8
|
-
- name: Walter
|
9
|
-
cities: [LA, SF, NYC]
|
10
|
-
queries:
|
11
|
-
- query: (eq "NYC" (agg (always) (nth 0 cities)))
|
12
|
-
size: 0
|
13
|
-
- query: (eq "NYC" (agg (always) (nth 1 cities)))
|
14
|
-
size: 2
|
data/fixtures/stories/one.yml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Jeff
|
7
|
-
friends: [Walter, Donny, Maude]
|
8
|
-
- name: Walter
|
9
|
-
friends: Donny
|
10
|
-
- name: Donny
|
11
|
-
friends: Walter
|
12
|
-
queries:
|
13
|
-
- query: (one friends)
|
14
|
-
size: 2
|
data/fixtures/stories/or.yml
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: BMW
|
7
|
-
price: 5600
|
8
|
-
- name: Ford
|
9
|
-
price: 3200
|
10
|
-
owner: Jeff
|
11
|
-
- name: Toyota
|
12
|
-
price: 9800
|
13
|
-
owners: [Jeff, Walter]
|
14
|
-
queries:
|
15
|
-
- query: (or (eq price 5600) (gt price 6000))
|
16
|
-
size: 2
|
17
|
-
- query: (or (eq owner "Jeff") (eq owners "Walter"))
|
18
|
-
size: 2
|
@@ -1,12 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Jeff
|
7
|
-
age: 41
|
8
|
-
queries:
|
9
|
-
- query: (sprintf "Hello, %s!" "world")
|
10
|
-
one: "Hello, world!"
|
11
|
-
- query: (sprintf "Hello, %s!" (agg (eq age 41) (first name)))
|
12
|
-
one: "Hello, Jeff!"
|
data/fixtures/stories/sum.yml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- title: Object Thinking
|
7
|
-
price: 29
|
8
|
-
- name: Clean Code
|
9
|
-
price: 27
|
10
|
-
- name: Refactorings
|
11
|
-
price: 41
|
12
|
-
queries:
|
13
|
-
- query: (sum price)
|
14
|
-
one: 97
|
data/fixtures/stories/unique.yml
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
---
|
4
|
-
# yamllint disable rule:line-length
|
5
|
-
facts:
|
6
|
-
- name: Volvo
|
7
|
-
- name: Ford
|
8
|
-
- name: Toyota
|
9
|
-
price: 5900
|
10
|
-
- name: Toyota
|
11
|
-
price: 4300
|
12
|
-
- name: BMW
|
13
|
-
price: 4400
|
14
|
-
- name: Mercedes
|
15
|
-
color: red
|
16
|
-
year: 2020
|
17
|
-
- name: Mercedes
|
18
|
-
color: blue
|
19
|
-
year: 2020
|
20
|
-
- name: Mercedes
|
21
|
-
color: red
|
22
|
-
year: 2021
|
23
|
-
- name: Mercedes
|
24
|
-
color: red
|
25
|
-
year: 2020
|
26
|
-
queries:
|
27
|
-
- query: (and (exists price) (unique name))
|
28
|
-
size: 2
|
29
|
-
- query: (and (eq name "Mercedes") (unique color year))
|
30
|
-
size: 3
|
data/renovate.json
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
|
4
|
-
# SPDX-License-Identifier: MIT
|
5
|
-
|
6
|
-
require_relative '../../test__helper'
|
7
|
-
require_relative '../../../lib/factbase'
|
8
|
-
require_relative '../../../lib/factbase/cached/cached_factbase'
|
9
|
-
|
10
|
-
# Query test.
|
11
|
-
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
12
|
-
# Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
|
13
|
-
# License:: MIT
|
14
|
-
class TestCachedFactbase < Factbase::Test
|
15
|
-
def test_inserts_and_queries
|
16
|
-
fb = Factbase::CachedFactbase.new(Factbase.new)
|
17
|
-
f = fb.insert
|
18
|
-
f.foo_bar = 1
|
19
|
-
f.bar = 'test'
|
20
|
-
assert_equal(1, fb.query('(and (eq foo_bar 1) (eq bar "test"))').each.to_a.size)
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_queries_after_update_in_txn
|
24
|
-
origin = Factbase.new
|
25
|
-
fb = Factbase::CachedFactbase.new(origin)
|
26
|
-
fb.insert.foo = 42
|
27
|
-
fb.txn do |fbt|
|
28
|
-
fbt.query('(exists foo)').each do |f|
|
29
|
-
f.bar = 33
|
30
|
-
end
|
31
|
-
end
|
32
|
-
refute_empty(origin.query('(exists bar)').each.to_a)
|
33
|
-
refute_empty(fb.query('(exists bar)').each.to_a)
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_prints_fact_correctly
|
37
|
-
fb = Factbase::CachedFactbase.new(Factbase.new)
|
38
|
-
f1 = fb.insert
|
39
|
-
f1.foo = 42
|
40
|
-
assert_equal('[ foo: [42] ]', f1.to_s)
|
41
|
-
f2 = fb.query('(always)').each.to_a.first
|
42
|
-
assert_equal('[ foo: [42] ] + {}', f2.to_s)
|
43
|
-
end
|
44
|
-
end
|