lunar 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +17 -0
  5. data/Rakefile +53 -0
  6. data/VERSION +1 -0
  7. data/examples/ohm.rb +23 -0
  8. data/lib/lunar.rb +12 -0
  9. data/lib/lunar/doc.rb +13 -0
  10. data/lib/lunar/index.rb +70 -0
  11. data/lib/lunar/scoring.rb +11 -0
  12. data/test/helper.rb +13 -0
  13. data/test/test_lunar.rb +4 -0
  14. data/test/test_lunar_document.rb +20 -0
  15. data/test/test_lunar_index.rb +174 -0
  16. data/test/test_lunar_scoring.rb +26 -0
  17. data/vendor/nest/nest.rb +7 -0
  18. data/vendor/redis/.gitignore +9 -0
  19. data/vendor/redis/LICENSE +20 -0
  20. data/vendor/redis/README.markdown +120 -0
  21. data/vendor/redis/Rakefile +75 -0
  22. data/vendor/redis/benchmarking/logging.rb +62 -0
  23. data/vendor/redis/benchmarking/pipeline.rb +44 -0
  24. data/vendor/redis/benchmarking/speed.rb +21 -0
  25. data/vendor/redis/benchmarking/suite.rb +24 -0
  26. data/vendor/redis/benchmarking/worker.rb +71 -0
  27. data/vendor/redis/bin/distredis +33 -0
  28. data/vendor/redis/examples/basic.rb +15 -0
  29. data/vendor/redis/examples/dist_redis.rb +43 -0
  30. data/vendor/redis/examples/incr-decr.rb +17 -0
  31. data/vendor/redis/examples/list.rb +26 -0
  32. data/vendor/redis/examples/pubsub.rb +25 -0
  33. data/vendor/redis/examples/sets.rb +36 -0
  34. data/vendor/redis/lib/edis.rb +3 -0
  35. data/vendor/redis/lib/redis.rb +496 -0
  36. data/vendor/redis/lib/redis/client.rb +265 -0
  37. data/vendor/redis/lib/redis/dist_redis.rb +118 -0
  38. data/vendor/redis/lib/redis/distributed.rb +460 -0
  39. data/vendor/redis/lib/redis/hash_ring.rb +131 -0
  40. data/vendor/redis/lib/redis/pipeline.rb +13 -0
  41. data/vendor/redis/lib/redis/raketasks.rb +1 -0
  42. data/vendor/redis/lib/redis/subscribe.rb +79 -0
  43. data/vendor/redis/profile.rb +22 -0
  44. data/vendor/redis/tasks/redis.tasks.rb +140 -0
  45. data/vendor/redis/test/db/.gitignore +1 -0
  46. data/vendor/redis/test/distributed_test.rb +1131 -0
  47. data/vendor/redis/test/redis_test.rb +1134 -0
  48. data/vendor/redis/test/test.conf +8 -0
  49. data/vendor/redis/test/test_helper.rb +113 -0
  50. metadata +127 -0
@@ -0,0 +1,33 @@
1
+ require 'fileutils'
2
+
3
+ class RedisCluster
4
+
5
+ def initialize(opts={})
6
+ opts = {:port => 6379, :host => 'localhost', :basedir => "#{Dir.pwd}/rdsrv" }.merge(opts)
7
+ FileUtils.mkdir_p opts[:basedir]
8
+ opts[:size].times do |i|
9
+ port = opts[:port] + i
10
+ FileUtils.mkdir_p "#{opts[:basedir]}/#{port}"
11
+ File.open("#{opts[:basedir]}/#{port}.conf", 'w'){|f| f.write(make_config(port, "#{opts[:basedir]}/#{port}", "#{opts[:basedir]}/#{port}.log"))}
12
+ system(%Q{#{File.join(File.expand_path(File.dirname(__FILE__)), "../redis/redis-server #{opts[:basedir]}/#{port}.conf &" )}})
13
+ end
14
+ end
15
+
16
+ def make_config(port=6379, data=port, logfile='stdout', loglevel='debug')
17
+ config = %Q{
18
+ timeout 300
19
+ save 900 1
20
+ save 300 10
21
+ save 60 10000
22
+ dir #{data}
23
+ loglevel #{loglevel}
24
+ logfile #{logfile}
25
+ databases 16
26
+ port #{port}
27
+ }
28
+ end
29
+
30
+ end
31
+
32
+
33
+ RedisCluster.new :size => 4
@@ -0,0 +1,15 @@
1
+ require 'redis'
2
+
3
+ r = Redis.new
4
+
5
+ r.del('foo')
6
+
7
+ puts
8
+
9
+ p'set foo to "bar"'
10
+ r['foo'] = 'bar'
11
+
12
+ puts
13
+
14
+ p 'value of foo'
15
+ p r['foo']
@@ -0,0 +1,43 @@
1
+ require "redis"
2
+ require "redis/distributed"
3
+
4
+ r = Redis::Distributed.new %w[redis://localhost:6379 redis://localhost:6380 redis://localhost:6381 redis://localhost:6382]
5
+
6
+ r.flushdb
7
+
8
+ r['urmom'] = 'urmom'
9
+ r['urdad'] = 'urdad'
10
+ r['urmom1'] = 'urmom1'
11
+ r['urdad1'] = 'urdad1'
12
+ r['urmom2'] = 'urmom2'
13
+ r['urdad2'] = 'urdad2'
14
+ r['urmom3'] = 'urmom3'
15
+ r['urdad3'] = 'urdad3'
16
+ p r['urmom']
17
+ p r['urdad']
18
+ p r['urmom1']
19
+ p r['urdad1']
20
+ p r['urmom2']
21
+ p r['urdad2']
22
+ p r['urmom3']
23
+ p r['urdad3']
24
+
25
+ r.rpush 'listor', 'foo1'
26
+ r.rpush 'listor', 'foo2'
27
+ r.rpush 'listor', 'foo3'
28
+ r.rpush 'listor', 'foo4'
29
+ r.rpush 'listor', 'foo5'
30
+
31
+ p r.rpop('listor')
32
+ p r.rpop('listor')
33
+ p r.rpop('listor')
34
+ p r.rpop('listor')
35
+ p r.rpop('listor')
36
+
37
+ puts "key distribution:"
38
+
39
+ r.ring.nodes.each do |node|
40
+ p [node.client, node.keys("*")]
41
+ end
42
+ r.flushdb
43
+ p r.keys('*')
@@ -0,0 +1,17 @@
1
+ require 'redis'
2
+
3
+ r = Redis.new
4
+
5
+ puts
6
+ p 'incr'
7
+ r.del 'counter'
8
+
9
+ p r.incr('counter')
10
+ p r.incr('counter')
11
+ p r.incr('counter')
12
+
13
+ puts
14
+ p 'decr'
15
+ p r.decr('counter')
16
+ p r.decr('counter')
17
+ p r.decr('counter')
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ require 'redis'
3
+
4
+ r = Redis.new
5
+
6
+ r.del 'logs'
7
+
8
+ puts
9
+
10
+ p "pushing log messages into a LIST"
11
+ r.rpush 'logs', 'some log message'
12
+ r.rpush 'logs', 'another log message'
13
+ r.rpush 'logs', 'yet another log message'
14
+ r.rpush 'logs', 'also another log message'
15
+
16
+ puts
17
+ p 'contents of logs LIST'
18
+
19
+ p r.lrange('logs', 0, -1)
20
+
21
+ puts
22
+ p 'Trim logs LIST to last 2 elements(easy circular buffer)'
23
+
24
+ r.ltrim('logs', -2, -1)
25
+
26
+ p r.lrange('logs', 0, -1)
@@ -0,0 +1,25 @@
1
+ require 'rubygems'
2
+ require 'redis'
3
+
4
+ puts "To play with this example use redis-cli from another terminal, like this:"
5
+ puts " ./redis-cli publish one hello"
6
+ puts "Finally force the example to exit sending the 'exit' message with"
7
+ puts " ./redis-cli publish two exit"
8
+ puts ""
9
+
10
+ @redis = Redis.new(:timeout => 0)
11
+
12
+ @redis.subscribe('one','two') do |on|
13
+ on.subscribe {|klass, num_subs| puts "Subscribed to #{klass} (#{num_subs} subscriptions)" }
14
+ on.message do |klass, msg|
15
+ puts "#{klass} received: #{msg}"
16
+ if msg == 'exit'
17
+ @redis.unsubscribe
18
+ end
19
+ end
20
+ on.unsubscribe {|klass, num_subs| puts "Unsubscribed to #{klass} (#{num_subs} subscriptions)" }
21
+ end
22
+
23
+
24
+
25
+
@@ -0,0 +1,36 @@
1
+ require 'rubygems'
2
+ require 'redis'
3
+
4
+ r = Redis.new
5
+
6
+ r.del 'foo-tags'
7
+ r.del 'bar-tags'
8
+
9
+ puts
10
+ p "create a set of tags on foo-tags"
11
+
12
+ r.sadd 'foo-tags', 'one'
13
+ r.sadd 'foo-tags', 'two'
14
+ r.sadd 'foo-tags', 'three'
15
+
16
+ puts
17
+ p "create a set of tags on bar-tags"
18
+
19
+ r.sadd 'bar-tags', 'three'
20
+ r.sadd 'bar-tags', 'four'
21
+ r.sadd 'bar-tags', 'five'
22
+
23
+ puts
24
+ p 'foo-tags'
25
+
26
+ p r.smembers('foo-tags')
27
+
28
+ puts
29
+ p 'bar-tags'
30
+
31
+ p r.smembers('bar-tags')
32
+
33
+ puts
34
+ p 'intersection of foo-tags and bar-tags'
35
+
36
+ p r.sinter('foo-tags', 'bar-tags')
@@ -0,0 +1,3 @@
1
+ # This file allows for the running of redis-rb with a nice
2
+ # command line look-and-feel: irb -rubygems -redis foo.rb
3
+ require 'redis'
@@ -0,0 +1,496 @@
1
+ require 'socket'
2
+
3
+ class Redis
4
+ VERSION = "2.0.0.rc2"
5
+
6
+ class ProtocolError < RuntimeError
7
+ def initialize(reply_type)
8
+ super("Protocol error, got '#{reply_type}' as initial reply byte")
9
+ end
10
+ end
11
+
12
+ def self.deprecate(message, trace = caller[0])
13
+ $stderr.puts "\n#{message} (in #{trace})"
14
+ end
15
+
16
+ attr :client
17
+
18
+ def self.connect(options = {})
19
+ require "uri"
20
+
21
+ url = URI(options.delete(:url) || ENV["REDIS_URL"] || "redis://127.0.0.1:6379/0")
22
+
23
+ options[:host] = url.host
24
+ options[:port] = url.port
25
+ options[:password] = url.password
26
+ options[:db] = url.path[1..-1].to_i
27
+
28
+ new(options)
29
+ end
30
+
31
+ def initialize(options = {})
32
+ @client = Client.new(options)
33
+ end
34
+
35
+ def select(db)
36
+ @client.db = db
37
+ @client.call(:select, db)
38
+ end
39
+
40
+ def info
41
+ Hash[*@client.call(:info).split(/:|\r\n/)]
42
+ end
43
+
44
+ def flushdb
45
+ @client.call(:flushdb)
46
+ end
47
+
48
+ def save
49
+ @client.call(:save)
50
+ end
51
+
52
+ def bgsave
53
+ @client.call(:bgsave)
54
+ end
55
+
56
+ def get(key)
57
+ @client.call(:get, key)
58
+ end
59
+
60
+ def getset(key, value)
61
+ @client.call(:getset, key, value)
62
+ end
63
+
64
+ def mget(*keys)
65
+ @client.call(:mget, *keys)
66
+ end
67
+
68
+ def hgetall(key)
69
+ Hash[*@client.call(:hgetall, key)]
70
+ end
71
+
72
+ def hget(key, field)
73
+ @client.call(:hget, key, field)
74
+ end
75
+
76
+ def hdel(key, field)
77
+ @client.call(:hdel, key, field)
78
+ end
79
+
80
+ def hkeys(key)
81
+ @client.call(:hkeys, key)
82
+ end
83
+
84
+ def keys(pattern = "*")
85
+ @client.call(:keys, pattern)
86
+ end
87
+
88
+ def randomkey
89
+ @client.call(:randomkey)
90
+ end
91
+
92
+ def echo(value)
93
+ @client.call(:echo, value)
94
+ end
95
+
96
+ def ping
97
+ @client.call(:ping)
98
+ end
99
+
100
+ def lastsave
101
+ @client.call(:lastsave)
102
+ end
103
+
104
+ def dbsize
105
+ @client.call(:dbsize)
106
+ end
107
+
108
+ def exists(key)
109
+ _bool @client.call(:exists, key)
110
+ end
111
+
112
+ def llen(key)
113
+ @client.call(:llen, key)
114
+ end
115
+
116
+ def lrange(key, start, stop)
117
+ @client.call(:lrange, key, start, stop)
118
+ end
119
+
120
+ def ltrim(key, start, stop)
121
+ @client.call(:ltrim, key, start, stop)
122
+ end
123
+
124
+ def lindex(key, index)
125
+ @client.call(:lindex, key, index)
126
+ end
127
+
128
+ def lset(key, index, value)
129
+ @client.call(:lset, key, index, value)
130
+ end
131
+
132
+ def lrem(key, count, value)
133
+ @client.call(:lrem, key, count, value)
134
+ end
135
+
136
+ def rpush(key, value)
137
+ @client.call(:rpush, key, value)
138
+ end
139
+
140
+ def lpush(key, value)
141
+ @client.call(:lpush, key, value)
142
+ end
143
+
144
+ def rpop(key)
145
+ @client.call(:rpop, key)
146
+ end
147
+
148
+ def blpop(key, timeout)
149
+ @client.call_without_timeout(:blpop, key, timeout)
150
+ end
151
+
152
+ def brpop(key, timeout)
153
+ @client.call_without_timeout(:brpop, key, timeout)
154
+ end
155
+
156
+ def rpoplpush(source, destination)
157
+ @client.call(:rpoplpush, source, destination)
158
+ end
159
+
160
+ def lpop(key)
161
+ @client.call(:lpop, key)
162
+ end
163
+
164
+ def smembers(key)
165
+ @client.call(:smembers, key)
166
+ end
167
+
168
+ def sismember(key, member)
169
+ _bool @client.call(:sismember, key, member)
170
+ end
171
+
172
+ def sadd(key, value)
173
+ _bool @client.call(:sadd, key, value)
174
+ end
175
+
176
+ def srem(key, value)
177
+ _bool @client.call(:srem, key, value)
178
+ end
179
+
180
+ def smove(source, destination, member)
181
+ _bool @client.call(:smove, source, destination, member)
182
+ end
183
+
184
+ def spop(key)
185
+ @client.call(:spop, key)
186
+ end
187
+
188
+ def scard(key)
189
+ @client.call(:scard, key)
190
+ end
191
+
192
+ def sinter(*keys)
193
+ @client.call(:sinter, *keys)
194
+ end
195
+
196
+ def sinterstore(destination, *keys)
197
+ @client.call(:sinterstore, destination, *keys)
198
+ end
199
+
200
+ def sunion(*keys)
201
+ @client.call(:sunion, *keys)
202
+ end
203
+
204
+ def sunionstore(destination, *keys)
205
+ @client.call(:sunionstore, destination, *keys)
206
+ end
207
+
208
+ def sdiff(*keys)
209
+ @client.call(:sdiff, *keys)
210
+ end
211
+
212
+ def sdiffstore(destination, *keys)
213
+ @client.call(:sdiffstore, destination, *keys)
214
+ end
215
+
216
+ def srandmember(key)
217
+ @client.call(:srandmember, key)
218
+ end
219
+
220
+ def zadd(key, score, member)
221
+ _bool @client.call(:zadd, key, score, member)
222
+ end
223
+
224
+ def zincrby(key, increment, member)
225
+ @client.call(:zincrby, key, increment, member)
226
+ end
227
+
228
+ def zcard(key)
229
+ @client.call(:zcard, key)
230
+ end
231
+
232
+ def zrange(key, start, stop, with_scores = false)
233
+ if with_scores
234
+ @client.call(:zrange, key, start, stop, "WITHSCORES")
235
+ else
236
+ @client.call(:zrange, key, start, stop)
237
+ end
238
+ end
239
+
240
+ def zrangebyscore(key, min, max)
241
+ @client.call(:zrangebyscore, key, min, max)
242
+ end
243
+
244
+ def zrevrange(key, start, stop, with_scores = false)
245
+ if with_scores
246
+ @client.call(:zrevrange, key, start, stop, "WITHSCORES")
247
+ else
248
+ @client.call(:zrevrange, key, start, stop)
249
+ end
250
+ end
251
+
252
+ def zscore(key, member)
253
+ @client.call(:zscore, key, member)
254
+ end
255
+
256
+ def zrem(key, member)
257
+ _bool @client.call(:zrem, key, member)
258
+ end
259
+
260
+ def move(key, db)
261
+ _bool @client.call(:move, key, db)
262
+ end
263
+
264
+ def setnx(key, value)
265
+ _bool @client.call(:setnx, key, value)
266
+ end
267
+
268
+ def del(*keys)
269
+ _bool @client.call(:del, *keys)
270
+ end
271
+
272
+ def rename(old_name, new_name)
273
+ @client.call(:rename, old_name, new_name)
274
+ end
275
+
276
+ def renamenx(old_name, new_name)
277
+ _bool @client.call(:renamenx, old_name, new_name)
278
+ end
279
+
280
+ def expire(key, seconds)
281
+ _bool @client.call(:expire, key, seconds)
282
+ end
283
+
284
+ def ttl(key)
285
+ @client.call(:ttl, key)
286
+ end
287
+
288
+ def expireat(key, unix_time)
289
+ _bool @client.call(:expireat, key, unix_time)
290
+ end
291
+
292
+ def hset(key, field, value)
293
+ _bool @client.call(:hset, key, field, value)
294
+ end
295
+
296
+ def hmset(key, *attrs)
297
+ @client.call(:hmset, key, *attrs)
298
+ end
299
+
300
+ def hlen(key)
301
+ @client.call(:hlen, key)
302
+ end
303
+
304
+ def hvals(key)
305
+ @client.call(:hvals, key)
306
+ end
307
+
308
+ def discard
309
+ @client.call(:discard)
310
+ end
311
+
312
+ def hexists(key, field)
313
+ _bool @client.call(:hexists, key, field)
314
+ end
315
+
316
+ def monitor
317
+ raise NotImplementedError
318
+ end
319
+
320
+ def [](key)
321
+ get(key)
322
+ end
323
+
324
+ def []=(key,value)
325
+ set(key, value)
326
+ end
327
+
328
+ def set(key, value)
329
+ @client.call(:set, key, value)
330
+ end
331
+
332
+ def setex(key, ttl, value)
333
+ @client.call(:setex, key, ttl, value)
334
+ end
335
+
336
+ def mset(*args)
337
+ @client.call(:mset, *args)
338
+ end
339
+
340
+ def mapped_mset(hash)
341
+ mset(*hash.to_a.flatten)
342
+ end
343
+
344
+ def msetnx(*args)
345
+ @client.call(:msetnx, *args)
346
+ end
347
+
348
+ def mapped_msetnx(hash)
349
+ msetnx(*hash.to_a.flatten)
350
+ end
351
+
352
+ def mapped_mget(*keys)
353
+ result = {}
354
+ mget(*keys).each do |value|
355
+ key = keys.shift
356
+ result.merge!(key => value) unless value.nil?
357
+ end
358
+ result
359
+ end
360
+
361
+ def sort(key, options = {})
362
+ cmd = []
363
+ cmd << "SORT"
364
+ cmd << key
365
+ cmd += ["BY", options[:by]] if options[:by]
366
+
367
+ Array(options[:get]).each do |k|
368
+ cmd += ["GET", k]
369
+ end if options[:get]
370
+
371
+ cmd += options[:order].split(" ") if options[:order]
372
+ cmd += ["LIMIT", *options[:limit]] if options[:limit]
373
+ cmd += ["STORE", options[:store]] if options[:store]
374
+
375
+ @client.call(*cmd)
376
+ end
377
+
378
+ def incr(key)
379
+ @client.call(:incr, key)
380
+ end
381
+
382
+ def incrby(key, increment)
383
+ @client.call(:incrby, key, increment)
384
+ end
385
+
386
+ def decr(key)
387
+ @client.call(:decr, key)
388
+ end
389
+
390
+ def decrby(key, decrement)
391
+ @client.call(:decrby, key, decrement)
392
+ end
393
+
394
+ def type(key)
395
+ @client.call(:type, key)
396
+ end
397
+
398
+ def quit
399
+ @client.call(:quit)
400
+ rescue Errno::ECONNRESET
401
+ end
402
+
403
+ def pipelined
404
+ original, @client = @client, Pipeline.new
405
+ yield
406
+ original.call_pipelined(@client.commands) unless @client.commands.empty?
407
+ ensure
408
+ @client = original
409
+ end
410
+
411
+ def exec
412
+ @client.call(:exec)
413
+ end
414
+
415
+ def multi(&block)
416
+ result = @client.call :multi
417
+
418
+ return result unless block_given?
419
+
420
+ begin
421
+ yield(self)
422
+ exec
423
+ rescue Exception => e
424
+ discard
425
+ raise e
426
+ end
427
+ end
428
+
429
+ def publish(channel, message)
430
+ @client.call(:publish, channel, message)
431
+ end
432
+
433
+ def subscribed?
434
+ @client.kind_of? SubscribedClient
435
+ end
436
+
437
+ def unsubscribe(*channels)
438
+ raise RuntimeError, "Can't unsubscribe if not subscribed." unless subscribed?
439
+ @client.unsubscribe(*channels)
440
+ end
441
+
442
+ def punsubscribe(*channels)
443
+ raise RuntimeError, "Can't unsubscribe if not subscribed." unless subscribed?
444
+ @client.punsubscribe(*channels)
445
+ end
446
+
447
+ def subscribe(*channels, &block)
448
+ subscription(:subscribe, channels, block)
449
+ end
450
+
451
+ def psubscribe(*channels, &block)
452
+ subscription(:psubscribe, channels, block)
453
+ end
454
+
455
+ def id
456
+ @client.id
457
+ end
458
+
459
+ def method_missing(command, *args)
460
+ @client.call(command, *args)
461
+ end
462
+
463
+ private
464
+
465
+ def _bool(value)
466
+ value == 1
467
+ end
468
+
469
+ def subscription(method, channels, block)
470
+ return @client.call(method, *channels) if subscribed?
471
+
472
+ begin
473
+ original, @client = @client, SubscribedClient.new(@client)
474
+ @client.send(method, *channels, &block)
475
+ ensure
476
+ @client = original
477
+ end
478
+ end
479
+
480
+ end
481
+
482
+ begin
483
+ if RUBY_VERSION >= '1.9'
484
+ require 'timeout'
485
+ Redis::Timer = Timeout
486
+ else
487
+ require 'system_timer'
488
+ Redis::Timer = SystemTimer
489
+ end
490
+ rescue LoadError
491
+ Redis::Timer = nil
492
+ end
493
+
494
+ require 'redis/client'
495
+ require 'redis/pipeline'
496
+ require 'redis/subscribe'