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.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +6 -5
  3. data/Gemfile.lock +30 -27
  4. data/LICENSE.txt +1 -1
  5. data/LICENSES/MIT.txt +1 -1
  6. data/README.md +41 -41
  7. data/Rakefile +2 -2
  8. data/factbase.gemspec +1 -1
  9. data/lib/factbase/accum.rb +2 -2
  10. data/lib/factbase/cached/cached_fact.rb +4 -8
  11. data/lib/factbase/cached/cached_factbase.rb +2 -2
  12. data/lib/factbase/cached/cached_query.rb +2 -2
  13. data/lib/factbase/cached/cached_term.rb +2 -2
  14. data/lib/factbase/churn.rb +2 -2
  15. data/lib/factbase/fact.rb +2 -2
  16. data/lib/factbase/fact_as_yaml.rb +2 -2
  17. data/lib/factbase/flatten.rb +2 -2
  18. data/lib/factbase/impatient.rb +2 -2
  19. data/lib/factbase/indexed/indexed_absent.rb +1 -1
  20. data/lib/factbase/indexed/indexed_and.rb +1 -1
  21. data/lib/factbase/indexed/indexed_eq.rb +1 -1
  22. data/lib/factbase/indexed/indexed_exists.rb +1 -1
  23. data/lib/factbase/indexed/indexed_fact.rb +5 -5
  24. data/lib/factbase/indexed/indexed_factbase.rb +14 -6
  25. data/lib/factbase/indexed/indexed_gt.rb +1 -1
  26. data/lib/factbase/indexed/indexed_lt.rb +1 -1
  27. data/lib/factbase/indexed/indexed_not.rb +1 -1
  28. data/lib/factbase/indexed/indexed_one.rb +1 -1
  29. data/lib/factbase/indexed/indexed_or.rb +1 -1
  30. data/lib/factbase/indexed/indexed_query.rb +6 -4
  31. data/lib/factbase/indexed/indexed_term.rb +2 -2
  32. data/lib/factbase/indexed/indexed_unique.rb +1 -1
  33. data/lib/factbase/inv.rb +2 -2
  34. data/lib/factbase/lazy_taped.rb +1 -1
  35. data/lib/factbase/lazy_taped_array.rb +1 -1
  36. data/lib/factbase/lazy_taped_hash.rb +1 -1
  37. data/lib/factbase/light.rb +2 -2
  38. data/lib/factbase/logged.rb +2 -2
  39. data/lib/factbase/pre.rb +2 -2
  40. data/lib/factbase/query.rb +2 -2
  41. data/lib/factbase/rules.rb +2 -2
  42. data/lib/factbase/sync/sync_factbase.rb +2 -2
  43. data/lib/factbase/sync/sync_query.rb +2 -2
  44. data/lib/factbase/syntax.rb +3 -3
  45. data/lib/factbase/tallied.rb +2 -2
  46. data/lib/factbase/taped.rb +2 -2
  47. data/lib/factbase/tee.rb +2 -2
  48. data/lib/factbase/term.rb +2 -2
  49. data/lib/factbase/terms/absent.rb +1 -1
  50. data/lib/factbase/terms/agg.rb +1 -1
  51. data/lib/factbase/terms/always.rb +1 -1
  52. data/lib/factbase/terms/and.rb +1 -1
  53. data/lib/factbase/terms/arithmetic.rb +1 -1
  54. data/lib/factbase/terms/as.rb +1 -1
  55. data/lib/factbase/terms/assert.rb +1 -1
  56. data/lib/factbase/terms/base.rb +2 -2
  57. data/lib/factbase/terms/best.rb +1 -1
  58. data/lib/factbase/terms/boolean.rb +1 -1
  59. data/lib/factbase/terms/compare.rb +1 -1
  60. data/lib/factbase/terms/concat.rb +2 -2
  61. data/lib/factbase/terms/count.rb +1 -1
  62. data/lib/factbase/terms/defn.rb +4 -4
  63. data/lib/factbase/terms/div.rb +1 -1
  64. data/lib/factbase/terms/either.rb +1 -1
  65. data/lib/factbase/terms/empty.rb +1 -1
  66. data/lib/factbase/terms/env.rb +1 -1
  67. data/lib/factbase/terms/eq.rb +1 -1
  68. data/lib/factbase/terms/exists.rb +1 -1
  69. data/lib/factbase/terms/first.rb +1 -1
  70. data/lib/factbase/terms/gt.rb +1 -1
  71. data/lib/factbase/terms/gte.rb +1 -1
  72. data/lib/factbase/terms/head.rb +1 -1
  73. data/lib/factbase/terms/inverted.rb +1 -1
  74. data/lib/factbase/terms/join.rb +1 -1
  75. data/lib/factbase/terms/lt.rb +1 -1
  76. data/lib/factbase/terms/lte.rb +1 -1
  77. data/lib/factbase/terms/many.rb +1 -1
  78. data/lib/factbase/terms/matches.rb +2 -2
  79. data/lib/factbase/terms/max.rb +1 -1
  80. data/lib/factbase/terms/min.rb +1 -1
  81. data/lib/factbase/terms/minus.rb +1 -1
  82. data/lib/factbase/terms/never.rb +1 -1
  83. data/lib/factbase/terms/nil.rb +1 -1
  84. data/lib/factbase/terms/not.rb +1 -1
  85. data/lib/factbase/terms/nth.rb +1 -1
  86. data/lib/factbase/terms/one.rb +2 -2
  87. data/lib/factbase/terms/or.rb +1 -1
  88. data/lib/factbase/terms/plus.rb +1 -1
  89. data/lib/factbase/terms/prev.rb +1 -1
  90. data/lib/factbase/terms/simplified.rb +2 -2
  91. data/lib/factbase/terms/size.rb +1 -1
  92. data/lib/factbase/terms/sorted.rb +1 -1
  93. data/lib/factbase/terms/sprintf.rb +2 -2
  94. data/lib/factbase/terms/sum.rb +1 -1
  95. data/lib/factbase/terms/times.rb +1 -1
  96. data/lib/factbase/terms/to_float.rb +1 -1
  97. data/lib/factbase/terms/to_integer.rb +1 -1
  98. data/lib/factbase/terms/to_string.rb +1 -1
  99. data/lib/factbase/terms/to_time.rb +1 -1
  100. data/lib/factbase/terms/traced.rb +1 -1
  101. data/lib/factbase/terms/type.rb +1 -1
  102. data/lib/factbase/terms/undef.rb +3 -3
  103. data/lib/factbase/terms/unique.rb +1 -1
  104. data/lib/factbase/terms/when.rb +1 -1
  105. data/lib/factbase/terms/zero.rb +1 -1
  106. data/lib/factbase/to_json.rb +2 -2
  107. data/lib/factbase/to_xml.rb +2 -2
  108. data/lib/factbase/to_yaml.rb +2 -2
  109. data/lib/factbase/version.rb +3 -3
  110. data/lib/factbase.rb +2 -2
  111. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 515345c86598dcc29f0795b9bb64fe31fc770469f596185103bc3ae62b95bec9
4
- data.tar.gz: adcf851edc23a66a4297bf4888ae54987431cc853f3157d751bbb57f5a89ef01
3
+ metadata.gz: bc6cb6bd378d266fcaa401091228e6dc4084474f5f16e89c9fb29dd56d577c77
4
+ data.tar.gz: 8c1e86c86b01371f159d29c0187a263598d7d5b6c2949200b7813dff22fd6fca
5
5
  SHA512:
6
- metadata.gz: 37488e2dd8a395abb1ddfb4700fa794592d3ce910981f4c468c2f6b0ebdfa703400873f5caea6cdee42a62971ae88009956fb6cb38b3bc5d8eebca698bdf4367
7
- data.tar.gz: 7798feb2f2e05fb795e6cfffe3a3311d6e2867fd4b21d1ffb5f1e03aa818bacae442faf47a507a99a402081d5048146be883685adcef62a9ace4ef85ac4ee90e
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-2025 Yegor Bugayenko
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', '~>5.25', require: false
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', '6.17.0', require: false # GPL
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', '~>0.2', require: false, platforms: [:ruby]
23
+ gem 'stackprof', '0.2.27', require: false, platforms: [:ruby] # GPL
23
24
  gem 'threads', '~>0.4', require: false
24
- gem 'yard', '~>0.9', require: false
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.5)
25
- date (3.5.0)
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.2.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.0)
33
- json (2.17.1)
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.6.1)
37
+ loog (0.7.2)
38
+ ellipsized
38
39
  logger (~> 1.0)
39
- minitest (5.27.0)
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.18.10-arm64-darwin)
47
+ nokogiri (1.19.0-arm64-darwin)
46
48
  racc (~> 1.4)
47
- nokogiri (1.18.10-x64-mingw-ucrt)
49
+ nokogiri (1.19.0-x64-mingw-ucrt)
48
50
  racc (~> 1.4)
49
- nokogiri (1.18.10-x86_64-darwin)
51
+ nokogiri (1.19.0-x86_64-darwin)
50
52
  racc (~> 1.4)
51
- nokogiri (1.18.10-x86_64-linux-gnu)
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.0)
58
+ parser (3.3.10.1)
57
59
  ast (~> 2.4.1)
58
60
  racc
59
- prism (1.6.0)
60
- psych (5.2.6)
61
+ prism (1.9.0)
62
+ psych (5.3.1)
61
63
  date
62
64
  stringio
63
- qbash (0.4.8)
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 (6.17.0)
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.81.7)
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.47.1, < 2.0)
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.48.0)
90
+ rubocop-ast (1.49.0)
89
91
  parser (>= 3.3.7.2)
90
- prism (~> 1.4)
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.1.9)
114
- tago (0.4.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.1.0)
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 (~> 5.25)
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 (= 6.17.0)
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 (~> 0.2)
154
+ stackprof (= 0.2.27)
152
155
  threads (~> 0.4)
153
- yard (~> 0.9)
156
+ yard (= 0.9.38)
154
157
 
155
158
  BUNDLED WITH
156
159
  2.6.8
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  (The MIT License)
2
2
 
3
- Copyright (c) 2024-2025 Yegor Bugayenko
3
+ Copyright (c) 2024-2026 Yegor Bugayenko
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the 'Software'), to deal
data/LICENSES/MIT.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  (The MIT License)
2
2
 
3
- Copyright (c) 2024-2025 Yegor Bugayenko
3
+ Copyright (c) 2024-2026 Yegor Bugayenko
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the 'Software'), to deal
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 = true
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.save(file, f1.export)
45
+ File.binwrite(file, f1.export)
46
46
  f2 = Factbase.new
47
- f2.import(File.read(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 411032 bytes (20000 facts) 0.03
217
+ import 410821 bytes (20000 facts) 0.01
218
218
  insert 10 facts 0.04
219
- query 10 times w/txn 2.52
220
- query 10 times w/o txn 0.05
221
- modify 10 attrs w/txn 1.84
222
- delete 10 facts w/txn 2.98
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.03
225
- import 5000 facts with persisted index 0.05
226
- query 5000 facts using persisted index 0.11
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.04
229
- query 5000 facts building index on-the-fly 0.10
230
- (and (eq what 'issue-was-closed') (exists... -> 200 1.21
231
- (and (eq what 'issue-was-closed') (exists... -> 200/txn 1.20
232
- (and (eq what 'issue-was-closed') (exists... -> zero 1.21
233
- (and (eq what 'issue-was-closed') (exists... -> zero/txn 1.23
234
- transaction rollback on factbase with 100000 facts 0.25
235
- (gt time '2024-03-23T03:21:43Z') 0.33
236
- (gt cost 50) 0.21
237
- (eq title 'Object Thinking 5000') 0.05
238
- (and (eq foo 42.998) (or (gt bar 200) (absent z... 0.05
239
- (and (exists foo) (not (exists blue))) 1.68
240
- (eq id (agg (always) (max id))) 2.76
241
- (join "c<=cost,b<=bar" (eq id (agg (always) (ma... 4.02
242
- (and (eq what "foo") (join "w<=what" (and (eq i... 7.68
243
- delete! 0.56
244
- (and (eq issue *) (eq repository *) (eq what '*') (eq where '*')) 2.75
245
- Taped.append() x50000 0.16
246
- Taped.each() x125 1.63
247
- Taped.delete_if() x375 0.84
248
- 50000 facts: read-only txn (no copy needed) 7.60
249
- 50000 facts: rollback txn (no copy needed) 7.47
250
- 50000 facts: insert in txn (copy triggered) 3.64
251
- 50000 facts: modify in txn (copy triggered) 39.42
252
- 100000 facts: read-only txn (no copy needed) 15.23
253
- 100000 facts: rollback txn (no copy needed) 15.17
254
- 100000 facts: insert in txn (copy triggered) 7.45
255
- 100000 facts: modify in txn (copy triggered) 73.97
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 2025-12-11 at 13:29,
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/20134646978
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-2025 Yegor Bugayenko
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)}", log: $stdout, env: { 'PICKS' => 'yes' })
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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
3
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
6
  require 'English'
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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
- # @param [Boolean] fresh True if this is a newly inserted fact (not yet in cache)
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
- # Only clear cache when modifying properties on existing (non-fresh) facts
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
11
+ # Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
12
12
  # License:: MIT
13
13
  module Factbase::CachedTerm
14
14
  # Does it match the fact?
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
20
+ # Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
21
21
  # License:: MIT
22
22
  class Factbase::FactAsYaml
23
23
  # Constructor.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
11
+ # Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
12
12
  # License:: MIT
13
13
  class Factbase::Flatten
14
14
  # Constructor.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
3
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
6
  # Indexed term 'absent'.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
3
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
6
  # Indexed term 'and'.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
3
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
6
  # Indexed term 'eq'.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
3
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
6
  # Indexed term 'exists'.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
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-2025 Yegor Bugayenko
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 [Boolean] fresh True if this is a newly inserted fact (not yet in index)
19
- def initialize(origin, idx, fresh: false)
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