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.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +5 -5
  3. data/factbase.gemspec +4 -4
  4. data/lib/factbase/fact.rb +1 -1
  5. data/lib/factbase/fact_as_yaml.rb +10 -1
  6. data/lib/factbase/indexed/indexed_term.rb +6 -1
  7. data/lib/factbase/version.rb +1 -1
  8. metadata +7 -87
  9. data/.0pdd.yml +0 -8
  10. data/.gitattributes +0 -7
  11. data/.github/publish-benchmark.sh +0 -24
  12. data/.github/workflows/actionlint.yml +0 -25
  13. data/.github/workflows/benchmark.yml +0 -36
  14. data/.github/workflows/codecov.yml +0 -27
  15. data/.github/workflows/copyrights.yml +0 -19
  16. data/.github/workflows/markdown-lint.yml +0 -23
  17. data/.github/workflows/pdd.yml +0 -19
  18. data/.github/workflows/rake.yml +0 -28
  19. data/.github/workflows/reuse.yml +0 -19
  20. data/.github/workflows/typos.yml +0 -19
  21. data/.github/workflows/xcop.yml +0 -19
  22. data/.github/workflows/yamllint.yml +0 -19
  23. data/.gitignore +0 -11
  24. data/.pdd +0 -7
  25. data/.rubocop.yml +0 -51
  26. data/.rultor.yml +0 -27
  27. data/benchmark/bench_factbase.rb +0 -61
  28. data/benchmark/bench_large_query.rb +0 -128
  29. data/benchmark/bench_query.rb +0 -57
  30. data/benchmark/bench_taped.rb +0 -33
  31. data/fixtures/stories/agg.yml +0 -17
  32. data/fixtures/stories/always.yml +0 -16
  33. data/fixtures/stories/and.yml +0 -19
  34. data/fixtures/stories/as.yml +0 -16
  35. data/fixtures/stories/count.yml +0 -18
  36. data/fixtures/stories/empty.yml +0 -23
  37. data/fixtures/stories/eq.yml +0 -30
  38. data/fixtures/stories/gt.yml +0 -18
  39. data/fixtures/stories/join.yml +0 -22
  40. data/fixtures/stories/max.yml +0 -14
  41. data/fixtures/stories/min.yml +0 -14
  42. data/fixtures/stories/nth.yml +0 -14
  43. data/fixtures/stories/one.yml +0 -14
  44. data/fixtures/stories/or.yml +0 -18
  45. data/fixtures/stories/sprintf.yml +0 -12
  46. data/fixtures/stories/sum.yml +0 -14
  47. data/fixtures/stories/unique.yml +0 -30
  48. data/renovate.json +0 -6
  49. data/test/factbase/cached/test_cached_factbase.rb +0 -44
  50. data/test/factbase/cached/test_cached_query.rb +0 -100
  51. data/test/factbase/indexed/test_indexed_fact.rb +0 -23
  52. data/test/factbase/indexed/test_indexed_factbase.rb +0 -96
  53. data/test/factbase/indexed/test_indexed_query.rb +0 -208
  54. data/test/factbase/indexed/test_indexed_term.rb +0 -140
  55. data/test/factbase/sync/test_sync_factbase.rb +0 -22
  56. data/test/factbase/sync/test_sync_query.rb +0 -30
  57. data/test/factbase/terms/test_aggregates.rb +0 -63
  58. data/test/factbase/terms/test_aliases.rb +0 -58
  59. data/test/factbase/terms/test_casting.rb +0 -33
  60. data/test/factbase/terms/test_debug.rb +0 -111
  61. data/test/factbase/terms/test_defn.rb +0 -48
  62. data/test/factbase/terms/test_logical.rb +0 -57
  63. data/test/factbase/terms/test_math.rb +0 -122
  64. data/test/factbase/terms/test_meta.rb +0 -70
  65. data/test/factbase/terms/test_ordering.rb +0 -44
  66. data/test/factbase/terms/test_strings.rb +0 -36
  67. data/test/factbase/terms/test_system.rb +0 -31
  68. data/test/factbase/test_accum.rb +0 -74
  69. data/test/factbase/test_churn.rb +0 -41
  70. data/test/factbase/test_fact.rb +0 -108
  71. data/test/factbase/test_fact_as_yaml.rb +0 -77
  72. data/test/factbase/test_flatten.rb +0 -28
  73. data/test/factbase/test_impatient.rb +0 -176
  74. data/test/factbase/test_inv.rb +0 -44
  75. data/test/factbase/test_logged.rb +0 -155
  76. data/test/factbase/test_pre.rb +0 -35
  77. data/test/factbase/test_query.rb +0 -445
  78. data/test/factbase/test_rules.rb +0 -128
  79. data/test/factbase/test_syntax.rb +0 -166
  80. data/test/factbase/test_tallied.rb +0 -81
  81. data/test/factbase/test_taped.rb +0 -72
  82. data/test/factbase/test_tee.rb +0 -85
  83. data/test/factbase/test_term.rb +0 -87
  84. data/test/factbase/test_to_json.rb +0 -35
  85. data/test/factbase/test_to_xml.rb +0 -89
  86. data/test/factbase/test_to_yaml.rb +0 -39
  87. data/test/test__helper.rb +0 -41
  88. 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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!"
@@ -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
@@ -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,6 +0,0 @@
1
- {
2
- "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
- "extends": [
4
- "config:base"
5
- ]
6
- }
@@ -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