morel 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+
3
+ group :development, :test do
4
+ gem "shoulda", ">= 0"
5
+ gem "bundler", "~> 1.0.0"
6
+ gem "jeweler", "~> 1.6.4"
7
+ gem "rcov", ">= 0"
8
+ gem "rspec", ">= 0"
9
+ end
10
+ gem 'mongo'
11
+ gem 'bson'
12
+ gem 'bson_ext'
13
+ gem 'linguify'
@@ -0,0 +1,54 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ bson (1.4.1)
5
+ bson_ext (1.4.1)
6
+ diff-lcs (1.1.3)
7
+ file-tail (1.0.7)
8
+ tins (~> 0.3)
9
+ git (1.2.5)
10
+ jeweler (1.6.4)
11
+ bundler (~> 1.0)
12
+ git (>= 1.2.5)
13
+ rake
14
+ linguify (0.3.0)
15
+ sourcify
16
+ mongo (1.4.1)
17
+ bson (= 1.4.1)
18
+ rake (0.9.2.2)
19
+ rcov (0.9.11)
20
+ rspec (2.7.0)
21
+ rspec-core (~> 2.7.0)
22
+ rspec-expectations (~> 2.7.0)
23
+ rspec-mocks (~> 2.7.0)
24
+ rspec-core (2.7.1)
25
+ rspec-expectations (2.7.0)
26
+ diff-lcs (~> 1.1.2)
27
+ rspec-mocks (2.7.0)
28
+ ruby2ruby (1.3.1)
29
+ ruby_parser (~> 2.0)
30
+ sexp_processor (~> 3.0)
31
+ ruby_parser (2.3.1)
32
+ sexp_processor (~> 3.0)
33
+ sexp_processor (3.0.7)
34
+ shoulda (2.11.3)
35
+ sourcify (0.5.0)
36
+ file-tail (>= 1.0.5)
37
+ ruby2ruby (>= 1.2.5)
38
+ ruby_parser (>= 2.0.5)
39
+ sexp_processor (>= 3.0.5)
40
+ tins (0.3.1)
41
+
42
+ PLATFORMS
43
+ ruby
44
+
45
+ DEPENDENCIES
46
+ bson
47
+ bson_ext
48
+ bundler (~> 1.0.0)
49
+ jeweler (~> 1.6.4)
50
+ linguify
51
+ mongo
52
+ rcov
53
+ rspec
54
+ shoulda
@@ -0,0 +1,30 @@
1
+ # Morel
2
+
3
+ Morel is a mongodb JavaScript AST manager for Ruby.
4
+
5
+ Currently work in progress and not usefull to anyone.
6
+
7
+ ## Example
8
+
9
+ [1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,5,6,7].each do |v|
10
+ @users.insert :vol => v
11
+ end
12
+
13
+ res = @users.sorted_window(5){ |record| record['vol'] }.each_top do |rec|
14
+ rec
15
+ end
16
+
17
+ res.map{ |m| m['value'] }
18
+ # => [6,6,7]
19
+
20
+ ## License
21
+
22
+ (The MIT License)
23
+
24
+ Copyright (c) 2011 Patrick Hanevold
25
+
26
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ‘Software’), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
27
+
28
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
29
+
30
+ THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ gem.name = "morel"
17
+ gem.homepage = "http://github.com/patrickhno/morel"
18
+ gem.license = "MIT"
19
+ gem.summary = %Q{Morel, the mongodb JavaScript AST manager for Ruby.}
20
+ gem.description = %Q{Morel is a mongodb JavaScript AST manager for Ruby.}
21
+ gem.email = "patrick.hanevold@gmail.com"
22
+ gem.authors = ["Patrick Hanevold"]
23
+ # dependencies defined in Gemfile
24
+ end
25
+ Jeweler::RubygemsDotOrgTasks.new
26
+
27
+ require 'rcov/rcovtask'
28
+ Rcov::RcovTask.new do |test|
29
+ test.libs << 'test'
30
+ test.pattern = 'test/**/test_*.rb'
31
+ test.verbose = true
32
+ test.rcov_opts << '--exclude "gems/*"'
33
+ end
34
+
35
+ task :default => :spec
36
+
37
+ require 'rake/rdoctask'
38
+ Rake::RDocTask.new do |rdoc|
39
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
40
+
41
+ rdoc.rdoc_dir = 'rdoc'
42
+ rdoc.title = "morel #{version}"
43
+ rdoc.rdoc_files.include('README*')
44
+ rdoc.rdoc_files.include('lib/**/*.rb')
45
+ end
46
+
47
+ Dir['tasks/*.rake'].sort.each { |f| load f }
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,6 @@
1
+ # encoding: utf-8
2
+
3
+ require 'mongo'
4
+ require 'linguify'
5
+ require 'morel/collection'
6
+ require 'morel/sorted_window'
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+
3
+ module Morel
4
+ class Collection
5
+
6
+ attr_accessor :name, :collection
7
+
8
+ def initialize name
9
+ @name = name
10
+ @collection = db.create_collection(name)
11
+ end
12
+
13
+ def db
14
+ @@db
15
+ end
16
+ def self.db= db
17
+ @@db = db
18
+ end
19
+
20
+ def delete
21
+ db.drop_collection(name)
22
+ end
23
+
24
+ def first
25
+ find_one
26
+ end
27
+
28
+ OPERATIONS = [
29
+ :insert,
30
+ :find_one,
31
+ :map_reduce
32
+ ]
33
+
34
+ OPERATIONS.each do |name|
35
+ class_eval <<-EOS, __FILE__, __LINE__
36
+ def #{name}(*args)
37
+ collection.#{name}(*args)
38
+ end
39
+ EOS
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,151 @@
1
+ # encoding: utf-8
2
+
3
+ module Morel
4
+
5
+ class Collection
6
+ def sorted_window size, &block
7
+ SortedWindow.new(:collection => self, :size => size, :block => block)
8
+ end
9
+ end
10
+
11
+ class SortedWindow
12
+
13
+ # this code will be translated to javascript
14
+ @@code = lambda do |collection|
15
+ lambda{ |k,v|
16
+ unless window
17
+ # list node for our linked list of key value pairs
18
+ def Node k,v
19
+ @next = nil
20
+ @prev = nil
21
+ @k = k
22
+ @v = v
23
+ end
24
+
25
+ window = {
26
+ last: nil,
27
+ list: [], # all the nodes sorted
28
+
29
+ # search for a given key value pair
30
+ find: lambda{ |k,v|
31
+ # first search for the key
32
+ beg = 0
33
+ lst = @list[:length]-1
34
+ mid = (beg+lst)>>1
35
+ while true
36
+ if k<@list[mid][:k]
37
+ lst=mid
38
+ else
39
+ beg=mid
40
+ end
41
+ mid = (beg+lst)>>1
42
+ break if mid==beg
43
+ end
44
+
45
+ # may not be exact match (multiple of same key value), searh in both directions for a exact match
46
+ start = mid
47
+ dir = 1
48
+ while v != @list[mid][:v]
49
+ mid += dir
50
+ if mid == @list[:length]
51
+ # end reached, flip direction and start over
52
+ mid = start
53
+ dir =- 1
54
+ end
55
+ end
56
+
57
+ # found
58
+ return mid
59
+ },
60
+
61
+ # add a new key value pair to the window (its linked list)
62
+ add: lambda{ |k,v|
63
+ if @list[:length]
64
+ beg = 0
65
+ lst = @list[:length]-1
66
+ mid = (beg+lst)>>1
67
+
68
+ # just add it to the end of our linked list
69
+ n = Node.new(k,v)
70
+ @last.next = n
71
+ n.prev = @last
72
+ @last = n
73
+
74
+
75
+ # and insert it at the correct place in our sorted list
76
+ if k>=@list[lst][:k]
77
+ if @list[:length] == :max && k>@list[lst][:k]
78
+ emit(n[:v][:_id],n[:v][:vol])
79
+ end
80
+ @list.push(n)
81
+ else
82
+ while true
83
+ if k<@list[mid][:k]
84
+ lst=mid
85
+ else
86
+ beg=mid
87
+ end
88
+ mid = (beg+lst)>>1
89
+ break if mid==beg
90
+ end
91
+
92
+ if k<@list[mid][:k]
93
+ # if @list[:length] >= :max && mid==0
94
+ # # we got a new winner, so anounce it
95
+ # #print(tojson(this.list[mid].v));
96
+ # emit(@list[mid][:k],@list[mid][:v])
97
+ #emit(@list[mid][:v][:_id],@list[mid][:v][:vol])
98
+ # end
99
+ @list.splice(mid,0,n)
100
+ elsif k<@list[lst][:k]
101
+ @list.splice(lst,0,n)
102
+ else
103
+ #print("!!!");
104
+ #print(k);
105
+ #print(this.list[mid].k);
106
+ #print(this.list[end].k);
107
+ while true
108
+ end
109
+ end
110
+ end
111
+
112
+ # dont let the window grow larger then its size
113
+ if @list[:length] > :max
114
+ # remove first
115
+ @list.splice(this.find(@first[:k],@first[:v]),1)
116
+ @first[:next].prev = nil
117
+ @first = @first[:next]
118
+ end
119
+ else
120
+ # the list is empty, just push it
121
+ @last = Node.new(k,v)
122
+ @first = @last
123
+ @list.push(@last)
124
+ end
125
+ }
126
+ }
127
+ end
128
+ window.add(v[:vol],v)
129
+ }
130
+ end
131
+
132
+ def initialize params
133
+ @collection = params[:collection]
134
+ @size = params[:size]
135
+ @block = params[:block]
136
+ end
137
+
138
+ def each_top
139
+ unless @map
140
+ @map = Ruby2Js.new.process(@@code.to_code(@collection)).gsub(/window\(\)/,'window').gsub(/Node\(k, v\){/,'function Node(k, v){').gsub(/:max/,'max')
141
+ @collection.db.add_stored_function('hello',@map)
142
+ @map = "hello(this._id,this);"
143
+ end
144
+ reduce = "function(k,vals){ return 1; }"
145
+ testing = @collection.collection.map_reduce(@map, reduce, :out => 'testing', :scope => { :window => nil, :max => @size }) #, :out => "testing", :query => { :user => user })
146
+ testing.find.map{ |m| yield m; m }
147
+ end
148
+
149
+ end
150
+
151
+ end
@@ -0,0 +1,74 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{morel}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = [%q{Patrick Hanevold}]
12
+ s.date = %q{2011-10-22}
13
+ s.description = %q{Morel is a mongodb JavaScript AST manager for Ruby.}
14
+ s.email = %q{patrick.hanevold@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "README.md"
17
+ ]
18
+ s.files = [
19
+ "Gemfile",
20
+ "Gemfile.lock",
21
+ "README.md",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "lib/morel.rb",
25
+ "lib/morel/collection.rb",
26
+ "lib/morel/sorted_window.rb",
27
+ "morel.gemspec",
28
+ "spec/morel/morel_spec.rb",
29
+ "spec/spec_helper.rb",
30
+ "tasks/spec.rake"
31
+ ]
32
+ s.homepage = %q{http://github.com/patrickhno/morel}
33
+ s.licenses = [%q{MIT}]
34
+ s.require_paths = [%q{lib}]
35
+ s.rubygems_version = %q{1.8.8}
36
+ s.summary = %q{Morel, the mongodb JavaScript AST manager for Ruby.}
37
+
38
+ if s.respond_to? :specification_version then
39
+ s.specification_version = 3
40
+
41
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
42
+ s.add_runtime_dependency(%q<mongo>, [">= 0"])
43
+ s.add_runtime_dependency(%q<bson>, [">= 0"])
44
+ s.add_runtime_dependency(%q<bson_ext>, [">= 0"])
45
+ s.add_runtime_dependency(%q<linguify>, [">= 0"])
46
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
47
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
48
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
49
+ s.add_development_dependency(%q<rcov>, [">= 0"])
50
+ s.add_development_dependency(%q<rspec>, [">= 0"])
51
+ else
52
+ s.add_dependency(%q<mongo>, [">= 0"])
53
+ s.add_dependency(%q<bson>, [">= 0"])
54
+ s.add_dependency(%q<bson_ext>, [">= 0"])
55
+ s.add_dependency(%q<linguify>, [">= 0"])
56
+ s.add_dependency(%q<shoulda>, [">= 0"])
57
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
58
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
59
+ s.add_dependency(%q<rcov>, [">= 0"])
60
+ s.add_dependency(%q<rspec>, [">= 0"])
61
+ end
62
+ else
63
+ s.add_dependency(%q<mongo>, [">= 0"])
64
+ s.add_dependency(%q<bson>, [">= 0"])
65
+ s.add_dependency(%q<bson_ext>, [">= 0"])
66
+ s.add_dependency(%q<linguify>, [">= 0"])
67
+ s.add_dependency(%q<shoulda>, [">= 0"])
68
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
69
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
70
+ s.add_dependency(%q<rcov>, [">= 0"])
71
+ s.add_dependency(%q<rspec>, [">= 0"])
72
+ end
73
+ end
74
+
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Morel::Collection do
6
+
7
+ before do
8
+ @users = Morel::Collection.new(:users)
9
+ @users.delete
10
+ end
11
+
12
+ it 'should insert into the collection' do
13
+ @users.insert :name => 'Patrick'
14
+ @users.first['name'].should == 'Patrick'
15
+ end
16
+
17
+ it 'should sort query window' do
18
+ [1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,5,6,7].each do |v|
19
+ @users.insert :vol => v
20
+ end
21
+ res = @users.sorted_window(5){ |record| record['vol'] }.each_top do |rec|
22
+ rec
23
+ end
24
+ res.map{ |m| m['value'] }.should == [6,6,7]
25
+ end
26
+
27
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ require 'mongo'
4
+ require 'morel'
5
+
6
+ RSpec.configure do |config|
7
+ config.before do
8
+ db = ::Mongo::Connection.new('localhost', 27017).db('test')
9
+ Morel::Collection.db = db
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rake'
4
+ require 'rspec/core/rake_task'
5
+
6
+ desc "Run specs"
7
+ RSpec::Core::RakeTask.new do |t|
8
+ end
9
+
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: morel
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Patrick Hanevold
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-10-22 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: mongo
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: bson
28
+ requirement: &id002 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: bson_ext
39
+ requirement: &id003 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: "0"
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
+ name: linguify
50
+ requirement: &id004 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
60
+ name: shoulda
61
+ requirement: &id005 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: bundler
72
+ requirement: &id006 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.0.0
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
82
+ name: jeweler
83
+ requirement: &id007 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: 1.6.4
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
93
+ name: rcov
94
+ requirement: &id008 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: "0"
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: *id008
103
+ - !ruby/object:Gem::Dependency
104
+ name: rspec
105
+ requirement: &id009 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: "0"
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *id009
114
+ description: Morel is a mongodb JavaScript AST manager for Ruby.
115
+ email: patrick.hanevold@gmail.com
116
+ executables: []
117
+
118
+ extensions: []
119
+
120
+ extra_rdoc_files:
121
+ - README.md
122
+ files:
123
+ - Gemfile
124
+ - Gemfile.lock
125
+ - README.md
126
+ - Rakefile
127
+ - VERSION
128
+ - lib/morel.rb
129
+ - lib/morel/collection.rb
130
+ - lib/morel/sorted_window.rb
131
+ - morel.gemspec
132
+ - spec/morel/morel_spec.rb
133
+ - spec/spec_helper.rb
134
+ - tasks/spec.rake
135
+ homepage: http://github.com/patrickhno/morel
136
+ licenses:
137
+ - MIT
138
+ post_install_message:
139
+ rdoc_options: []
140
+
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ hash: 4501380731556875629
149
+ segments:
150
+ - 0
151
+ version: "0"
152
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: "0"
158
+ requirements: []
159
+
160
+ rubyforge_project:
161
+ rubygems_version: 1.8.8
162
+ signing_key:
163
+ specification_version: 3
164
+ summary: Morel, the mongodb JavaScript AST manager for Ruby.
165
+ test_files: []
166
+