queris 0.8.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 (61) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +34 -0
  4. data/README.md +53 -0
  5. data/Rakefile +1 -0
  6. data/data/redis_scripts/add_low_ttl.lua +10 -0
  7. data/data/redis_scripts/copy_key_if_absent.lua +13 -0
  8. data/data/redis_scripts/copy_ttl.lua +13 -0
  9. data/data/redis_scripts/create_page_if_absent.lua +24 -0
  10. data/data/redis_scripts/debuq.lua +20 -0
  11. data/data/redis_scripts/delete_if_string.lua +8 -0
  12. data/data/redis_scripts/delete_matching_keys.lua +7 -0
  13. data/data/redis_scripts/expire_temp_query_keys.lua +7 -0
  14. data/data/redis_scripts/make_rangehack_if_needed.lua +30 -0
  15. data/data/redis_scripts/master_expire.lua +15 -0
  16. data/data/redis_scripts/match_key_type.lua +9 -0
  17. data/data/redis_scripts/move_key.lua +11 -0
  18. data/data/redis_scripts/multisize.lua +19 -0
  19. data/data/redis_scripts/paged_query_ready.lua +35 -0
  20. data/data/redis_scripts/periodic_zremrangebyscore.lua +9 -0
  21. data/data/redis_scripts/persist_reusable_temp_query_keys.lua +14 -0
  22. data/data/redis_scripts/query_ensure_existence.lua +23 -0
  23. data/data/redis_scripts/query_intersect_optimization.lua +31 -0
  24. data/data/redis_scripts/remove_from_keyspace.lua +27 -0
  25. data/data/redis_scripts/remove_from_sets.lua +13 -0
  26. data/data/redis_scripts/results_from_hash.lua +54 -0
  27. data/data/redis_scripts/results_with_ttl.lua +20 -0
  28. data/data/redis_scripts/subquery_intersect_optimization.lua +25 -0
  29. data/data/redis_scripts/subquery_intersect_optimization_cleanup.lua +5 -0
  30. data/data/redis_scripts/undo_add_low_ttl.lua +8 -0
  31. data/data/redis_scripts/unpaged_query_ready.lua +17 -0
  32. data/data/redis_scripts/unpersist_reusable_temp_query_keys.lua +11 -0
  33. data/data/redis_scripts/update_live_expiring_presence_index.lua +20 -0
  34. data/data/redis_scripts/update_query.lua +126 -0
  35. data/data/redis_scripts/update_rangehacks.lua +94 -0
  36. data/data/redis_scripts/zrangestore.lua +12 -0
  37. data/lib/queris.rb +400 -0
  38. data/lib/queris/errors.rb +8 -0
  39. data/lib/queris/indices.rb +735 -0
  40. data/lib/queris/mixin/active_record.rb +74 -0
  41. data/lib/queris/mixin/object.rb +398 -0
  42. data/lib/queris/mixin/ohm.rb +81 -0
  43. data/lib/queris/mixin/queris_model.rb +59 -0
  44. data/lib/queris/model.rb +455 -0
  45. data/lib/queris/profiler.rb +275 -0
  46. data/lib/queris/query.rb +1215 -0
  47. data/lib/queris/query/operations.rb +398 -0
  48. data/lib/queris/query/page.rb +101 -0
  49. data/lib/queris/query/timer.rb +42 -0
  50. data/lib/queris/query/trace.rb +108 -0
  51. data/lib/queris/query_store.rb +137 -0
  52. data/lib/queris/version.rb +3 -0
  53. data/lib/rails/log_subscriber.rb +22 -0
  54. data/lib/rails/request_timing.rb +29 -0
  55. data/lib/tasks/queris.rake +138 -0
  56. data/queris.gemspec +41 -0
  57. data/test.rb +39 -0
  58. data/test/current.rb +74 -0
  59. data/test/dsl.rb +35 -0
  60. data/test/ohm.rb +37 -0
  61. metadata +161 -0
@@ -0,0 +1,41 @@
1
+
2
+ # -*- encoding: utf-8 -*-
3
+ $:.push('lib')
4
+ require "queris/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "queris"
8
+ s.version = Queris::VERSION
9
+ s.authors = ["Leo P."]
10
+ s.email = ["queris@slact.net"]
11
+ s.homepage = ""
12
+ s.summary = "Redis-backed object indexing and querying module"
13
+ s.description = "We've got indices, foreign indices, ranges, subqueries, realtime queries, "
14
+
15
+ dependencies = [
16
+ # Examples:
17
+ [:runtime, "redis", "~> 3.2.1", :require => ["redis", "redis/connection/hiredis"]],
18
+ [:runtime, "hiredis"],
19
+ [:development, "pry"],
20
+ [:development, "pry-debundle"]
21
+ ]
22
+
23
+ s.files = Dir['**/*']
24
+ s.test_files = Dir['test/**/*'] + Dir['spec/**/*']
25
+ s.executables = Dir['bin/*'].map { |f| File.basename(f) }
26
+ s.require_paths = ["lib"]
27
+
28
+
29
+ ## Make sure you can build the gem on older versions of RubyGems too:
30
+ s.rubygems_version = "2.4.5"
31
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
32
+ s.specification_version = 3 if s.respond_to? :specification_version
33
+
34
+ dependencies.each do |type, name, version|
35
+ if s.respond_to?("add_#{type}_dependency")
36
+ s.send("add_#{type}_dependency", name, version)
37
+ else
38
+ s.add_dependency(name, version)
39
+ end
40
+ end
41
+ end
data/test.rb ADDED
@@ -0,0 +1,39 @@
1
+ class Foo
2
+ attr_accessor :wee
3
+ def initialize
4
+ @cb=[]
5
+ @wee = :foo
6
+ end
7
+
8
+ def add(cb=nil)
9
+ cb = Proc.new if cb.nil? && block_given?
10
+ raise "invalid cb" unless cb.respond_to?(:call) && cb.respond_to(:arity)
11
+ @cb << cb unless cb.nil?
12
+ end
13
+
14
+ def run(foo)
15
+ @cb.each do |cb|
16
+ binding.pry unless cb.respond_to? :call
17
+ cb.call(foo)
18
+ end
19
+ end
20
+
21
+ end
22
+
23
+ class Bar
24
+ attr_accessor :wee
25
+ def initialize
26
+ @wee = :bar
27
+ end
28
+ end
29
+ $f = Foo.new
30
+ $b = Bar.new
31
+
32
+ $f.add do |x| puts "#{x} and then some" end
33
+ beezwax = "buzz"
34
+ $f.add do |x| puts "#{x} and also #{beezwax}" end
35
+ $f.add Bar.new
36
+ $f.add $b.wee
37
+
38
+
39
+ $f.run 111
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
4
+ require "redis/connection/hiredis"
5
+ require "redis"
6
+ require "queris"
7
+ require "pry"
8
+
9
+ Queris.add_redis :master, Redis.new(:host => 'localhost',
10
+ :port => 6379,
11
+ :db => 13,
12
+ # :logger => Logger.new(STDOUT)
13
+ )
14
+ #Queris.add_redis :metaquery, Redis.new(:host => 'willzyx', :port => 6380)
15
+ class Bar < Queris::Model
16
+ attrs :foo_id, :bar
17
+ end
18
+ class Foo < Queris::Model
19
+ attrs :a, :b, :b2, :c
20
+ index_attribute name: :a, live: true
21
+ index_attribute :name => :here, :index => Queris::ExpiringPresenceIndex, :ttl => 120, :live => true
22
+ index_attributes :b, :b2, :index => Queris::DecayingAccumulatorIndex, :half_life => 604800
23
+ index_range_attribute :c
24
+ index_attribute_from model: Bar, name: :bar, :attribute => :bar, :key => :foo_id
25
+ #live_queries
26
+ #profile_queries :lite
27
+ end
28
+
29
+ def test
30
+ Queris.debug= true
31
+ f = Foo.new
32
+ f.a = rand
33
+ f.b = 9
34
+ f.b2 = 10
35
+ f.c = 12
36
+ binding.pry
37
+ f.save
38
+
39
+ q = Foo.query :live => true, :ttl => 60
40
+ q.union :a, 11
41
+ q.union :a, 15
42
+ q.diff :a, 12
43
+ q.union :c, 9
44
+ q.intersect :b, 12
45
+ #q.sort :c
46
+
47
+ subq = Foo.query.union(:b, 2).sort(:c)
48
+ q.union(subq)
49
+ q.sort(subq)
50
+ q.intersect Foo.query.union(:b, 44).diff(:c, 1)
51
+ q.params[:bar]=:baz
52
+ q.params[:cc]=32
53
+
54
+ d = q.marshal_dump
55
+ m = Marshal.dump q
56
+
57
+ l = Marshal.load m
58
+ #pr = Queris::QueryProfilerLite.find(q)
59
+
60
+ r = Foo.query(live: true, ttl: 30).union(:a, 1).union(:b,1).intersect(:c,3).intersect(Foo.query.union(:b2, 30).diff(:a, 10)).diff(:c, 15)
61
+ r2 = Foo.query(live: true, ttl: 120).union(:a, 1).union(:b, 22).intersect(:here).sort("-c")
62
+ hereq=Foo.query(live: true).union(:here).union(:a,1223)
63
+ binding.pry
64
+ r2.query
65
+ o = Foo.new
66
+ o.a= 1
67
+ #qqq=Queris::QueryStore.query(Foo, realtime: true).union(:a).union(:b).union(:b2)
68
+ #qqq.flush; qqq.count
69
+ #mq=Queris::QueryStore.metaquery.union(:index)
70
+ #mq.flush; mq.count
71
+ binding.pry
72
+ r.member? o
73
+ end
74
+ test
@@ -0,0 +1,35 @@
1
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
2
+ require "redis"
3
+ require "queris"
4
+
5
+ class Foo < Queris::Model
6
+ attrs :a, :b, :b2, :c
7
+ redis Redis.new(:host => 'localhost', :port => 6379, :db => 13, :logger => Logger.new(STDOUT))
8
+ index_attribute :a
9
+ index_attributes :b, :b2, :index => Queris::DecayingAccumulatorIndex, :half_life => 604800
10
+ index_range_attribute :c
11
+ #profile_queries :lite
12
+ end
13
+
14
+ def test
15
+ f = Foo.new
16
+ f.a = rand
17
+ f.b = 9
18
+ f.b2 = 10
19
+ f.c = 12
20
+ f.save
21
+ q = nil
22
+ 1000.times do
23
+ q = Foo.query do
24
+ union :a, 11
25
+ union :a, 15
26
+ diff :a, 12
27
+ union :c, 9
28
+ intersect :b, 12
29
+ end
30
+ end
31
+ binding.pry
32
+ #pr = Queris::QueryProfilerLite.find(q)
33
+ end
34
+
35
+ test
@@ -0,0 +1,37 @@
1
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
2
+ require "redis/connection/hiredis"
3
+ require "redis"
4
+ require "queris"
5
+ require "ohm"
6
+ require "ohm/contrib"
7
+
8
+ Queris.add_redis :master, Redis.new(:host => 'localhost',
9
+ :port => 6379,
10
+ :db => 13,
11
+ # :logger => Logger.new(STDOUT)
12
+ )
13
+ Ohm.connect url: "redis://localhost:6379/13"
14
+
15
+ class Foo < Ohm::Model
16
+ attribute :fooo
17
+ end
18
+
19
+ class Bar < Ohm::Model
20
+ attribute :foo_id
21
+ attribute :bar
22
+ list :foolist, Foo
23
+ attribute :score
24
+ include Queris
25
+ index_attributes :foo_id, :bar, :tags, :somelist
26
+ index_range_attribute :score
27
+ end
28
+
29
+ def test
30
+ b = Bar.new
31
+ b.score=55
32
+ b.bar="a"
33
+ b.save
34
+ binding.pry
35
+ end
36
+ test
37
+
metadata ADDED
@@ -0,0 +1,161 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: queris
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.1
5
+ platform: ruby
6
+ authors:
7
+ - Leo P.
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: redis
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 3.2.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 3.2.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: hiredis
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-debundle
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: 'We''ve got indices, foreign indices, ranges, subqueries, realtime queries, '
70
+ email:
71
+ - queris@slact.net
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - Gemfile
77
+ - Gemfile.lock
78
+ - README.md
79
+ - Rakefile
80
+ - data/redis_scripts/add_low_ttl.lua
81
+ - data/redis_scripts/copy_key_if_absent.lua
82
+ - data/redis_scripts/copy_ttl.lua
83
+ - data/redis_scripts/create_page_if_absent.lua
84
+ - data/redis_scripts/debuq.lua
85
+ - data/redis_scripts/delete_if_string.lua
86
+ - data/redis_scripts/delete_matching_keys.lua
87
+ - data/redis_scripts/expire_temp_query_keys.lua
88
+ - data/redis_scripts/make_rangehack_if_needed.lua
89
+ - data/redis_scripts/master_expire.lua
90
+ - data/redis_scripts/match_key_type.lua
91
+ - data/redis_scripts/move_key.lua
92
+ - data/redis_scripts/multisize.lua
93
+ - data/redis_scripts/paged_query_ready.lua
94
+ - data/redis_scripts/periodic_zremrangebyscore.lua
95
+ - data/redis_scripts/persist_reusable_temp_query_keys.lua
96
+ - data/redis_scripts/query_ensure_existence.lua
97
+ - data/redis_scripts/query_intersect_optimization.lua
98
+ - data/redis_scripts/remove_from_keyspace.lua
99
+ - data/redis_scripts/remove_from_sets.lua
100
+ - data/redis_scripts/results_from_hash.lua
101
+ - data/redis_scripts/results_with_ttl.lua
102
+ - data/redis_scripts/subquery_intersect_optimization.lua
103
+ - data/redis_scripts/subquery_intersect_optimization_cleanup.lua
104
+ - data/redis_scripts/undo_add_low_ttl.lua
105
+ - data/redis_scripts/unpaged_query_ready.lua
106
+ - data/redis_scripts/unpersist_reusable_temp_query_keys.lua
107
+ - data/redis_scripts/update_live_expiring_presence_index.lua
108
+ - data/redis_scripts/update_query.lua
109
+ - data/redis_scripts/update_rangehacks.lua
110
+ - data/redis_scripts/zrangestore.lua
111
+ - lib/queris.rb
112
+ - lib/queris/errors.rb
113
+ - lib/queris/indices.rb
114
+ - lib/queris/mixin/active_record.rb
115
+ - lib/queris/mixin/object.rb
116
+ - lib/queris/mixin/ohm.rb
117
+ - lib/queris/mixin/queris_model.rb
118
+ - lib/queris/model.rb
119
+ - lib/queris/profiler.rb
120
+ - lib/queris/query.rb
121
+ - lib/queris/query/operations.rb
122
+ - lib/queris/query/page.rb
123
+ - lib/queris/query/timer.rb
124
+ - lib/queris/query/trace.rb
125
+ - lib/queris/query_store.rb
126
+ - lib/queris/version.rb
127
+ - lib/rails/log_subscriber.rb
128
+ - lib/rails/request_timing.rb
129
+ - lib/tasks/queris.rake
130
+ - queris.gemspec
131
+ - test.rb
132
+ - test/current.rb
133
+ - test/dsl.rb
134
+ - test/ohm.rb
135
+ homepage: ''
136
+ licenses: []
137
+ metadata: {}
138
+ post_install_message:
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubyforge_project:
154
+ rubygems_version: 2.6.8
155
+ signing_key:
156
+ specification_version: 3
157
+ summary: Redis-backed object indexing and querying module
158
+ test_files:
159
+ - test/current.rb
160
+ - test/dsl.rb
161
+ - test/ohm.rb