factbase 0.19.2 → 0.19.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/Gemfile +6 -5
- data/Gemfile.lock +30 -27
- data/LICENSE.txt +1 -1
- data/LICENSES/MIT.txt +1 -1
- data/README.md +41 -41
- data/Rakefile +2 -2
- data/factbase.gemspec +1 -1
- data/lib/factbase/accum.rb +2 -2
- data/lib/factbase/cached/cached_fact.rb +4 -8
- data/lib/factbase/cached/cached_factbase.rb +2 -2
- data/lib/factbase/cached/cached_query.rb +2 -2
- data/lib/factbase/cached/cached_term.rb +2 -2
- data/lib/factbase/churn.rb +2 -2
- data/lib/factbase/fact.rb +2 -2
- data/lib/factbase/fact_as_yaml.rb +2 -2
- data/lib/factbase/flatten.rb +2 -2
- data/lib/factbase/impatient.rb +2 -2
- data/lib/factbase/indexed/indexed_absent.rb +1 -1
- data/lib/factbase/indexed/indexed_and.rb +1 -1
- data/lib/factbase/indexed/indexed_eq.rb +1 -1
- data/lib/factbase/indexed/indexed_exists.rb +1 -1
- data/lib/factbase/indexed/indexed_fact.rb +5 -5
- data/lib/factbase/indexed/indexed_factbase.rb +14 -6
- data/lib/factbase/indexed/indexed_gt.rb +1 -1
- data/lib/factbase/indexed/indexed_lt.rb +1 -1
- data/lib/factbase/indexed/indexed_not.rb +1 -1
- data/lib/factbase/indexed/indexed_one.rb +1 -1
- data/lib/factbase/indexed/indexed_or.rb +1 -1
- data/lib/factbase/indexed/indexed_query.rb +6 -4
- data/lib/factbase/indexed/indexed_term.rb +2 -2
- data/lib/factbase/indexed/indexed_unique.rb +1 -1
- data/lib/factbase/inv.rb +2 -2
- data/lib/factbase/lazy_taped.rb +1 -1
- data/lib/factbase/lazy_taped_array.rb +1 -1
- data/lib/factbase/lazy_taped_hash.rb +1 -1
- data/lib/factbase/light.rb +2 -2
- data/lib/factbase/logged.rb +2 -2
- data/lib/factbase/pre.rb +2 -2
- data/lib/factbase/query.rb +2 -2
- data/lib/factbase/rules.rb +2 -2
- data/lib/factbase/sync/sync_factbase.rb +2 -2
- data/lib/factbase/sync/sync_query.rb +2 -2
- data/lib/factbase/syntax.rb +3 -3
- data/lib/factbase/tallied.rb +2 -2
- data/lib/factbase/taped.rb +2 -2
- data/lib/factbase/tee.rb +2 -2
- data/lib/factbase/term.rb +2 -2
- data/lib/factbase/terms/absent.rb +1 -1
- data/lib/factbase/terms/agg.rb +1 -1
- data/lib/factbase/terms/always.rb +1 -1
- data/lib/factbase/terms/and.rb +1 -1
- data/lib/factbase/terms/arithmetic.rb +1 -1
- data/lib/factbase/terms/as.rb +1 -1
- data/lib/factbase/terms/assert.rb +1 -1
- data/lib/factbase/terms/base.rb +2 -2
- data/lib/factbase/terms/best.rb +1 -1
- data/lib/factbase/terms/boolean.rb +1 -1
- data/lib/factbase/terms/compare.rb +1 -1
- data/lib/factbase/terms/concat.rb +2 -2
- data/lib/factbase/terms/count.rb +1 -1
- data/lib/factbase/terms/defn.rb +4 -4
- data/lib/factbase/terms/div.rb +1 -1
- data/lib/factbase/terms/either.rb +1 -1
- data/lib/factbase/terms/empty.rb +1 -1
- data/lib/factbase/terms/env.rb +1 -1
- data/lib/factbase/terms/eq.rb +1 -1
- data/lib/factbase/terms/exists.rb +1 -1
- data/lib/factbase/terms/first.rb +1 -1
- data/lib/factbase/terms/gt.rb +1 -1
- data/lib/factbase/terms/gte.rb +1 -1
- data/lib/factbase/terms/head.rb +1 -1
- data/lib/factbase/terms/inverted.rb +1 -1
- data/lib/factbase/terms/join.rb +1 -1
- data/lib/factbase/terms/lt.rb +1 -1
- data/lib/factbase/terms/lte.rb +1 -1
- data/lib/factbase/terms/many.rb +1 -1
- data/lib/factbase/terms/matches.rb +2 -2
- data/lib/factbase/terms/max.rb +1 -1
- data/lib/factbase/terms/min.rb +1 -1
- data/lib/factbase/terms/minus.rb +1 -1
- data/lib/factbase/terms/never.rb +1 -1
- data/lib/factbase/terms/nil.rb +1 -1
- data/lib/factbase/terms/not.rb +1 -1
- data/lib/factbase/terms/nth.rb +1 -1
- data/lib/factbase/terms/one.rb +2 -2
- data/lib/factbase/terms/or.rb +1 -1
- data/lib/factbase/terms/plus.rb +1 -1
- data/lib/factbase/terms/prev.rb +1 -1
- data/lib/factbase/terms/simplified.rb +2 -2
- data/lib/factbase/terms/size.rb +1 -1
- data/lib/factbase/terms/sorted.rb +1 -1
- data/lib/factbase/terms/sprintf.rb +2 -2
- data/lib/factbase/terms/sum.rb +1 -1
- data/lib/factbase/terms/times.rb +1 -1
- data/lib/factbase/terms/to_float.rb +1 -1
- data/lib/factbase/terms/to_integer.rb +1 -1
- data/lib/factbase/terms/to_string.rb +1 -1
- data/lib/factbase/terms/to_time.rb +1 -1
- data/lib/factbase/terms/traced.rb +1 -1
- data/lib/factbase/terms/type.rb +1 -1
- data/lib/factbase/terms/undef.rb +3 -3
- data/lib/factbase/terms/unique.rb +1 -1
- data/lib/factbase/terms/when.rb +1 -1
- data/lib/factbase/terms/zero.rb +1 -1
- data/lib/factbase/to_json.rb +2 -2
- data/lib/factbase/to_xml.rb +2 -2
- data/lib/factbase/to_yaml.rb +2 -2
- data/lib/factbase/version.rb +3 -3
- data/lib/factbase.rb +2 -2
- 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: bc6cb6bd378d266fcaa401091228e6dc4084474f5f16e89c9fb29dd56d577c77
|
|
4
|
+
data.tar.gz: 8c1e86c86b01371f159d29c0187a263598d7d5b6c2949200b7813dff22fd6fca
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: afa7d0dd3cace0292ce9de22c102dfed04772f568f9ad725e5d937024918b6c2c103a87221bbee3e3902167f0c3ec886567cb791593e8693e2723e66fa2d62f7
|
|
7
|
+
data.tar.gz: 55891ef31903c5d07a6d153bb23bff4264e3d2c414ed4655e2388702d51d1bcdcb75a490f40b8e62007a32dbe571ee0146ab190b890bb5935ad9393d215e0e54
|
data/Gemfile
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
source 'https://rubygems.org'
|
|
7
7
|
gemspec
|
|
8
8
|
|
|
9
9
|
gem 'benchmark', '~>0.5', require: false
|
|
10
|
-
gem 'minitest', '~>
|
|
10
|
+
gem 'minitest', '~>6.0', require: false
|
|
11
11
|
gem 'minitest-reporters', '~>1.7', require: false
|
|
12
12
|
gem 'os', '~>1.1', require: false
|
|
13
|
+
gem 'psych', '5.3.1', require: false # GPL
|
|
13
14
|
gem 'qbash', '~>0.4', require: false
|
|
14
15
|
gem 'rake', '~>13.2', require: false
|
|
15
|
-
gem 'rdoc', '
|
|
16
|
+
gem 'rdoc', '7.1.0', require: false # GPL
|
|
16
17
|
gem 'rubocop', '~>1.74', require: false
|
|
17
18
|
gem 'rubocop-minitest', '~>0.38', require: false
|
|
18
19
|
gem 'rubocop-performance', '~>1.25', require: false
|
|
19
20
|
gem 'rubocop-rake', '~>0.7', require: false
|
|
20
21
|
gem 'simplecov', '~>0.22', require: false
|
|
21
22
|
gem 'simplecov-cobertura', '~>3.0', require: false
|
|
22
|
-
gem 'stackprof', '
|
|
23
|
+
gem 'stackprof', '0.2.27', require: false, platforms: [:ruby] # GPL
|
|
23
24
|
gem 'threads', '~>0.4', require: false
|
|
24
|
-
gem 'yard', '
|
|
25
|
+
gem 'yard', '0.9.38', require: false # GPL
|
data/Gemfile.lock
CHANGED
|
@@ -21,46 +21,48 @@ GEM
|
|
|
21
21
|
backtrace (0.4.1)
|
|
22
22
|
benchmark (0.5.0)
|
|
23
23
|
builder (3.3.0)
|
|
24
|
-
concurrent-ruby (1.3.
|
|
25
|
-
date (3.5.
|
|
24
|
+
concurrent-ruby (1.3.6)
|
|
25
|
+
date (3.5.1)
|
|
26
26
|
decoor (0.1.0)
|
|
27
27
|
docile (1.4.1)
|
|
28
|
-
elapsed (0.
|
|
28
|
+
elapsed (0.3.1)
|
|
29
29
|
loog (~> 0.6)
|
|
30
30
|
tago (~> 0.1)
|
|
31
31
|
ellipsized (0.3.0)
|
|
32
|
-
erb (6.0.
|
|
33
|
-
json (2.
|
|
32
|
+
erb (6.0.1)
|
|
33
|
+
json (2.18.1)
|
|
34
34
|
language_server-protocol (3.17.0.5)
|
|
35
35
|
lint_roller (1.1.0)
|
|
36
36
|
logger (1.7.0)
|
|
37
|
-
loog (0.
|
|
37
|
+
loog (0.7.2)
|
|
38
|
+
ellipsized
|
|
38
39
|
logger (~> 1.0)
|
|
39
|
-
minitest (
|
|
40
|
+
minitest (6.0.1)
|
|
41
|
+
prism (~> 1.5)
|
|
40
42
|
minitest-reporters (1.7.1)
|
|
41
43
|
ansi
|
|
42
44
|
builder
|
|
43
45
|
minitest (>= 5.0)
|
|
44
46
|
ruby-progressbar
|
|
45
|
-
nokogiri (1.
|
|
47
|
+
nokogiri (1.19.0-arm64-darwin)
|
|
46
48
|
racc (~> 1.4)
|
|
47
|
-
nokogiri (1.
|
|
49
|
+
nokogiri (1.19.0-x64-mingw-ucrt)
|
|
48
50
|
racc (~> 1.4)
|
|
49
|
-
nokogiri (1.
|
|
51
|
+
nokogiri (1.19.0-x86_64-darwin)
|
|
50
52
|
racc (~> 1.4)
|
|
51
|
-
nokogiri (1.
|
|
53
|
+
nokogiri (1.19.0-x86_64-linux-gnu)
|
|
52
54
|
racc (~> 1.4)
|
|
53
55
|
os (1.1.4)
|
|
54
56
|
others (0.1.1)
|
|
55
57
|
parallel (1.27.0)
|
|
56
|
-
parser (3.3.10.
|
|
58
|
+
parser (3.3.10.1)
|
|
57
59
|
ast (~> 2.4.1)
|
|
58
60
|
racc
|
|
59
|
-
prism (1.
|
|
60
|
-
psych (5.
|
|
61
|
+
prism (1.9.0)
|
|
62
|
+
psych (5.3.1)
|
|
61
63
|
date
|
|
62
64
|
stringio
|
|
63
|
-
qbash (0.
|
|
65
|
+
qbash (0.7.2)
|
|
64
66
|
backtrace (> 0)
|
|
65
67
|
elapsed (> 0)
|
|
66
68
|
loog (> 0)
|
|
@@ -68,13 +70,13 @@ GEM
|
|
|
68
70
|
racc (1.8.1)
|
|
69
71
|
rainbow (3.1.1)
|
|
70
72
|
rake (13.3.1)
|
|
71
|
-
rdoc (
|
|
73
|
+
rdoc (7.1.0)
|
|
72
74
|
erb
|
|
73
75
|
psych (>= 4.0.0)
|
|
74
76
|
tsort
|
|
75
77
|
regexp_parser (2.11.3)
|
|
76
78
|
rexml (3.4.4)
|
|
77
|
-
rubocop (1.
|
|
79
|
+
rubocop (1.84.1)
|
|
78
80
|
json (~> 2.3)
|
|
79
81
|
language_server-protocol (~> 3.17.0.2)
|
|
80
82
|
lint_roller (~> 1.1.0)
|
|
@@ -82,12 +84,12 @@ GEM
|
|
|
82
84
|
parser (>= 3.3.0.2)
|
|
83
85
|
rainbow (>= 2.2.2, < 4.0)
|
|
84
86
|
regexp_parser (>= 2.9.3, < 3.0)
|
|
85
|
-
rubocop-ast (>= 1.
|
|
87
|
+
rubocop-ast (>= 1.49.0, < 2.0)
|
|
86
88
|
ruby-progressbar (~> 1.7)
|
|
87
89
|
unicode-display_width (>= 2.4.0, < 4.0)
|
|
88
|
-
rubocop-ast (1.
|
|
90
|
+
rubocop-ast (1.49.0)
|
|
89
91
|
parser (>= 3.3.7.2)
|
|
90
|
-
prism (~> 1.
|
|
92
|
+
prism (~> 1.7)
|
|
91
93
|
rubocop-minitest (0.38.2)
|
|
92
94
|
lint_roller (~> 1.1)
|
|
93
95
|
rubocop (>= 1.75.0, < 2.0)
|
|
@@ -110,15 +112,15 @@ GEM
|
|
|
110
112
|
simplecov-html (0.13.2)
|
|
111
113
|
simplecov_json_formatter (0.1.4)
|
|
112
114
|
stackprof (0.2.27)
|
|
113
|
-
stringio (3.
|
|
114
|
-
tago (0.
|
|
115
|
+
stringio (3.2.0)
|
|
116
|
+
tago (0.7.0)
|
|
115
117
|
threads (0.5.0)
|
|
116
118
|
backtrace (~> 0)
|
|
117
119
|
concurrent-ruby (~> 1.0)
|
|
118
120
|
tsort (0.2.0)
|
|
119
121
|
unicode-display_width (3.2.0)
|
|
120
122
|
unicode-emoji (~> 4.1)
|
|
121
|
-
unicode-emoji (4.
|
|
123
|
+
unicode-emoji (4.2.0)
|
|
122
124
|
yaml (0.4.0)
|
|
123
125
|
yard (0.9.38)
|
|
124
126
|
|
|
@@ -136,21 +138,22 @@ PLATFORMS
|
|
|
136
138
|
DEPENDENCIES
|
|
137
139
|
benchmark (~> 0.5)
|
|
138
140
|
factbase!
|
|
139
|
-
minitest (~>
|
|
141
|
+
minitest (~> 6.0)
|
|
140
142
|
minitest-reporters (~> 1.7)
|
|
141
143
|
os (~> 1.1)
|
|
144
|
+
psych (= 5.3.1)
|
|
142
145
|
qbash (~> 0.4)
|
|
143
146
|
rake (~> 13.2)
|
|
144
|
-
rdoc (=
|
|
147
|
+
rdoc (= 7.1.0)
|
|
145
148
|
rubocop (~> 1.74)
|
|
146
149
|
rubocop-minitest (~> 0.38)
|
|
147
150
|
rubocop-performance (~> 1.25)
|
|
148
151
|
rubocop-rake (~> 0.7)
|
|
149
152
|
simplecov (~> 0.22)
|
|
150
153
|
simplecov-cobertura (~> 3.0)
|
|
151
|
-
stackprof (
|
|
154
|
+
stackprof (= 0.2.27)
|
|
152
155
|
threads (~> 0.4)
|
|
153
|
-
yard (
|
|
156
|
+
yard (= 0.9.38)
|
|
154
157
|
|
|
155
158
|
BUNDLED WITH
|
|
156
159
|
2.6.8
|
data/LICENSE.txt
CHANGED
data/LICENSES/MIT.txt
CHANGED
data/README.md
CHANGED
|
@@ -27,7 +27,7 @@ f = fb.insert
|
|
|
27
27
|
f.kind = 'book'
|
|
28
28
|
f.title = 'Object Thinking'
|
|
29
29
|
fb.query('(eq kind "book")').each do |f|
|
|
30
|
-
f.seen =
|
|
30
|
+
f.seen = Time.now
|
|
31
31
|
end
|
|
32
32
|
fb.insert
|
|
33
33
|
fb.query('(not (exists seen))').each do |f|
|
|
@@ -42,9 +42,9 @@ file = '/tmp/simple.fb'
|
|
|
42
42
|
f1 = Factbase.new
|
|
43
43
|
f = f1.insert
|
|
44
44
|
f.foo = 42
|
|
45
|
-
File.
|
|
45
|
+
File.binwrite(file, f1.export)
|
|
46
46
|
f2 = Factbase.new
|
|
47
|
-
f2.import(File.
|
|
47
|
+
f2.import(File.binread(file))
|
|
48
48
|
assert(f2.query('(eq foo 42)').each.to_a.size == 1)
|
|
49
49
|
```
|
|
50
50
|
|
|
@@ -214,50 +214,50 @@ This is the result of the benchmark:
|
|
|
214
214
|
query all facts from an empty factbase 0.00
|
|
215
215
|
insert 20000 facts 0.67
|
|
216
216
|
export 20000 facts 0.02
|
|
217
|
-
import
|
|
217
|
+
import 410821 bytes (20000 facts) 0.01
|
|
218
218
|
insert 10 facts 0.04
|
|
219
|
-
query 10 times w/txn 2.
|
|
220
|
-
query 10 times w/o txn 0.
|
|
221
|
-
modify 10 attrs w/txn 1.
|
|
222
|
-
delete 10 facts w/txn
|
|
219
|
+
query 10 times w/txn 2.36
|
|
220
|
+
query 10 times w/o txn 0.07
|
|
221
|
+
modify 10 attrs w/txn 1.71
|
|
222
|
+
delete 10 facts w/txn 3.38
|
|
223
223
|
build index on 5000 facts 0.05
|
|
224
|
-
export 5000 facts with index 0.
|
|
225
|
-
import 5000 facts with persisted index 0.
|
|
226
|
-
query 5000 facts using persisted index 0.
|
|
224
|
+
export 5000 facts with index 0.05
|
|
225
|
+
import 5000 facts with persisted index 0.03
|
|
226
|
+
query 5000 facts using persisted index 0.10
|
|
227
227
|
export 5000 facts without index 0.00
|
|
228
|
-
import 5000 facts without index 0.
|
|
229
|
-
query 5000 facts building index on-the-fly 0.
|
|
230
|
-
(and (eq what 'issue-was-closed') (exists... -> 200 1.
|
|
231
|
-
(and (eq what 'issue-was-closed') (exists... -> 200/txn 1.
|
|
232
|
-
(and (eq what 'issue-was-closed') (exists... -> zero 1.
|
|
233
|
-
(and (eq what 'issue-was-closed') (exists... -> zero/txn 1.
|
|
234
|
-
transaction rollback on factbase with 100000 facts 0.
|
|
235
|
-
(gt time '2024-03-23T03:21:43Z') 0.
|
|
236
|
-
(gt cost 50) 0.
|
|
237
|
-
(eq title 'Object Thinking 5000') 0.
|
|
238
|
-
(and (eq foo 42.998) (or (gt bar 200) (absent z... 0.
|
|
239
|
-
(and (exists foo) (not (exists blue))) 1.
|
|
240
|
-
(eq id (agg (always) (max id))) 2.
|
|
241
|
-
(join "c<=cost,b<=bar" (eq id (agg (always) (ma... 4.
|
|
242
|
-
(and (eq what "foo") (join "w<=what" (and (eq i... 7.
|
|
243
|
-
delete! 0.
|
|
244
|
-
(and (eq issue *) (eq repository *) (eq what '*') (eq where '*'))
|
|
245
|
-
Taped.append() x50000 0.
|
|
246
|
-
Taped.each() x125 1.
|
|
247
|
-
Taped.delete_if() x375 0.
|
|
248
|
-
50000 facts: read-only txn (no copy needed)
|
|
249
|
-
50000 facts: rollback txn (no copy needed)
|
|
250
|
-
50000 facts: insert in txn (copy triggered) 3.
|
|
251
|
-
50000 facts: modify in txn (copy triggered)
|
|
252
|
-
100000 facts: read-only txn (no copy needed)
|
|
253
|
-
100000 facts: rollback txn (no copy needed)
|
|
254
|
-
100000 facts: insert in txn (copy triggered)
|
|
255
|
-
100000 facts: modify in txn (copy triggered)
|
|
228
|
+
import 5000 facts without index 0.01
|
|
229
|
+
query 5000 facts building index on-the-fly 0.09
|
|
230
|
+
(and (eq what 'issue-was-closed') (exists... -> 200 1.11
|
|
231
|
+
(and (eq what 'issue-was-closed') (exists... -> 200/txn 1.23
|
|
232
|
+
(and (eq what 'issue-was-closed') (exists... -> zero 1.18
|
|
233
|
+
(and (eq what 'issue-was-closed') (exists... -> zero/txn 1.30
|
|
234
|
+
transaction rollback on factbase with 100000 facts 0.28
|
|
235
|
+
(gt time '2024-03-23T03:21:43Z') 0.37
|
|
236
|
+
(gt cost 50) 0.18
|
|
237
|
+
(eq title 'Object Thinking 5000') 0.03
|
|
238
|
+
(and (eq foo 42.998) (or (gt bar 200) (absent z... 0.03
|
|
239
|
+
(and (exists foo) (not (exists blue))) 1.73
|
|
240
|
+
(eq id (agg (always) (max id))) 2.77
|
|
241
|
+
(join "c<=cost,b<=bar" (eq id (agg (always) (ma... 4.70
|
|
242
|
+
(and (eq what "foo") (join "w<=what" (and (eq i... 7.58
|
|
243
|
+
delete! 0.51
|
|
244
|
+
(and (eq issue *) (eq repository *) (eq what '*') (eq where '*')) 0.43
|
|
245
|
+
Taped.append() x50000 0.02
|
|
246
|
+
Taped.each() x125 1.15
|
|
247
|
+
Taped.delete_if() x375 0.97
|
|
248
|
+
50000 facts: read-only txn (no copy needed) 5.30
|
|
249
|
+
50000 facts: rollback txn (no copy needed) 5.16
|
|
250
|
+
50000 facts: insert in txn (copy triggered) 3.23
|
|
251
|
+
50000 facts: modify in txn (copy triggered) 34.56
|
|
252
|
+
100000 facts: read-only txn (no copy needed) 12.28
|
|
253
|
+
100000 facts: rollback txn (no copy needed) 12.19
|
|
254
|
+
100000 facts: insert in txn (copy triggered) 6.57
|
|
255
|
+
100000 facts: modify in txn (copy triggered) 70.11
|
|
256
256
|
```
|
|
257
257
|
|
|
258
258
|
The results were calculated in [this GHA job][benchmark-gha]
|
|
259
|
-
on
|
|
259
|
+
on 2026-02-04 at 05:19,
|
|
260
260
|
on Linux with 4 CPUs.
|
|
261
261
|
<!-- benchmark_end -->
|
|
262
262
|
|
|
263
|
-
[benchmark-gha]: https://github.com/yegor256/factbase/actions/runs/
|
|
263
|
+
[benchmark-gha]: https://github.com/yegor256/factbase/actions/runs/21659492807
|
data/Rakefile
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
require 'os'
|
|
@@ -35,7 +35,7 @@ task :picks do
|
|
|
35
35
|
next if OS.windows?
|
|
36
36
|
%w[test lib].each do |d|
|
|
37
37
|
Dir["#{d}/**/*.rb"].each do |f|
|
|
38
|
-
qbash("bundle exec ruby #{Shellwords.escape(f)}",
|
|
38
|
+
qbash("bundle exec ruby #{Shellwords.escape(f)}", stdout: $stdout, env: { 'PICKS' => 'yes' })
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
end
|
data/factbase.gemspec
CHANGED
data/lib/factbase/accum.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
require 'others'
|
|
@@ -9,7 +9,7 @@ require_relative '../factbase'
|
|
|
9
9
|
# Accumulator of props, a decorator of +Factbase::Fact+.
|
|
10
10
|
#
|
|
11
11
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
12
|
-
# Copyright:: Copyright (c) 2024-
|
|
12
|
+
# Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
13
13
|
# License:: MIT
|
|
14
14
|
class Factbase::Accum
|
|
15
15
|
# Ctor.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
require 'others'
|
|
@@ -9,17 +9,15 @@ require_relative '../../factbase'
|
|
|
9
9
|
# A single fact in a factbase, which is sensitive to changes.
|
|
10
10
|
#
|
|
11
11
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
12
|
-
# Copyright:: Copyright (c) 2024-
|
|
12
|
+
# Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
13
13
|
# License:: MIT
|
|
14
14
|
class Factbase::CachedFact
|
|
15
15
|
# Ctor.
|
|
16
16
|
# @param [Factbase::Fact] origin The original fact
|
|
17
17
|
# @param [Hash] cache Cache of queries (to clean it on attribute addition)
|
|
18
|
-
|
|
19
|
-
def initialize(origin, cache, fresh: false)
|
|
18
|
+
def initialize(origin, cache, **)
|
|
20
19
|
@origin = origin
|
|
21
20
|
@cache = cache
|
|
22
|
-
@fresh = fresh
|
|
23
21
|
end
|
|
24
22
|
|
|
25
23
|
def to_s
|
|
@@ -28,9 +26,7 @@ class Factbase::CachedFact
|
|
|
28
26
|
|
|
29
27
|
# When a method is missing, this method is called.
|
|
30
28
|
others do |*args|
|
|
31
|
-
|
|
32
|
-
# Fresh facts are not in the cache yet, so modifications don't affect it
|
|
33
|
-
@cache.clear if args[0].to_s.end_with?('=') && !@fresh
|
|
29
|
+
@cache.clear if args[0].to_s.end_with?('=')
|
|
34
30
|
@origin.send(*args)
|
|
35
31
|
end
|
|
36
32
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
require 'decoor'
|
|
@@ -13,7 +13,7 @@ require_relative 'cached_term'
|
|
|
13
13
|
# A factbase with a cache.
|
|
14
14
|
#
|
|
15
15
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
16
|
-
# Copyright:: Copyright (c) 2024-
|
|
16
|
+
# Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
17
17
|
# License:: MIT
|
|
18
18
|
class Factbase::CachedFactbase
|
|
19
19
|
decoor(:origin)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
require_relative '../../factbase'
|
|
@@ -9,7 +9,7 @@ require_relative 'cached_fact'
|
|
|
9
9
|
# Query with a cache, a decorator of another query.
|
|
10
10
|
#
|
|
11
11
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
12
|
-
# Copyright:: Copyright (c) 2024-
|
|
12
|
+
# Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
13
13
|
# License:: MIT
|
|
14
14
|
class Factbase::CachedQuery
|
|
15
15
|
include Enumerable
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
require_relative '../../factbase'
|
|
@@ -8,7 +8,7 @@ require_relative '../../factbase'
|
|
|
8
8
|
# Term with a cache.
|
|
9
9
|
#
|
|
10
10
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
11
|
-
# Copyright:: Copyright (c) 2024-
|
|
11
|
+
# Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
12
12
|
# License:: MIT
|
|
13
13
|
module Factbase::CachedTerm
|
|
14
14
|
# Does it match the fact?
|
data/lib/factbase/churn.rb
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
# A churn.
|
|
7
7
|
#
|
|
8
8
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
9
|
-
# Copyright:: Copyright (c) 2024-
|
|
9
|
+
# Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
10
10
|
# License:: MIT
|
|
11
11
|
class Factbase::Churn
|
|
12
12
|
attr_reader :inserted, :deleted, :added
|
data/lib/factbase/fact.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
require 'json'
|
|
@@ -25,7 +25,7 @@ require_relative '../factbase'
|
|
|
25
25
|
# It is NOT thread-safe!
|
|
26
26
|
#
|
|
27
27
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
28
|
-
# Copyright:: Copyright (c) 2024-
|
|
28
|
+
# Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
29
29
|
# License:: MIT
|
|
30
30
|
class Factbase::Fact
|
|
31
31
|
# Ctor.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
require 'ellipsized'
|
|
@@ -17,7 +17,7 @@ require_relative '../factbase'
|
|
|
17
17
|
# puts Factbase::FactAsYaml.new(f).to_s
|
|
18
18
|
#
|
|
19
19
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
20
|
-
# Copyright:: Copyright (c) 2024-
|
|
20
|
+
# Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
21
21
|
# License:: MIT
|
|
22
22
|
class Factbase::FactAsYaml
|
|
23
23
|
# Constructor.
|
data/lib/factbase/flatten.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
require_relative '../factbase'
|
|
@@ -8,7 +8,7 @@ require_relative '../factbase'
|
|
|
8
8
|
# Make maps suitable for printing.
|
|
9
9
|
#
|
|
10
10
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
11
|
-
# Copyright:: Copyright (c) 2024-
|
|
11
|
+
# Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
12
12
|
# License:: MIT
|
|
13
13
|
class Factbase::Flatten
|
|
14
14
|
# Constructor.
|
data/lib/factbase/impatient.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
require 'decoor'
|
|
@@ -11,7 +11,7 @@ require_relative 'syntax'
|
|
|
11
11
|
# A decorator of a Factbase, that terminates long-running queries.
|
|
12
12
|
#
|
|
13
13
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
14
|
-
# Copyright:: Copyright (c) 2024-
|
|
14
|
+
# Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
15
15
|
# License:: MIT
|
|
16
16
|
class Factbase::Impatient
|
|
17
17
|
# Ctor.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024-
|
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
|
5
5
|
|
|
6
6
|
require 'others'
|
|
@@ -9,14 +9,14 @@ require_relative '../../factbase'
|
|
|
9
9
|
# A single fact in a factbase, which is sensitive to changes.
|
|
10
10
|
#
|
|
11
11
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
12
|
-
# Copyright:: Copyright (c) 2024-
|
|
12
|
+
# Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
|
|
13
13
|
# License:: MIT
|
|
14
14
|
class Factbase::IndexedFact
|
|
15
15
|
# Ctor.
|
|
16
16
|
# @param [Factbase::Fact] origin The original fact
|
|
17
17
|
# @param [Hash] idx The index
|
|
18
|
-
# @param [
|
|
19
|
-
def initialize(origin, idx, fresh
|
|
18
|
+
# @param [Set] fresh The shared set of fresh fact IDs
|
|
19
|
+
def initialize(origin, idx, fresh)
|
|
20
20
|
@origin = origin
|
|
21
21
|
@idx = idx
|
|
22
22
|
@fresh = fresh
|
|
@@ -30,7 +30,7 @@ class Factbase::IndexedFact
|
|
|
30
30
|
others do |*args|
|
|
31
31
|
# Only clear index when modifying properties on existing (non-fresh) facts
|
|
32
32
|
# Fresh facts are not in the index yet, so modifications don't affect it
|
|
33
|
-
@idx.clear if args[0].to_s.end_with?('=') && !@fresh
|
|
33
|
+
@idx.clear if args[0].to_s.end_with?('=') && !@fresh.include?(object_id)
|
|
34
34
|
@origin.send(*args)
|
|
35
35
|
end
|
|
36
36
|
end
|