744xr8OvLiBlG5lEhXYrfQ changeset

Changeset363533633036 (b)
ParentNone (a)
ab
0+require 'rubygems'
0+require 'relaxdb'
0+
0+# Specify the db to be used. Create it in CouchDB yourself locally.
0+
0+RelaxDB::Database.set_std_db :host => "localhost", :port => 5984, :db => "photos"
0+
0+#
0+# Define the classes
0+#
0+
0+class Photo < RelaxDB::Document
0+ 
0+  property :name
0+  property :tags
0+
0+end
0+
0+class Tag < RelaxDB::Document
0+ 
0+  property :name
0+  property :photos
0+ 
0+end
0+
0+#
0+# Create the views
0+#
0+
0+tags_view = <<MAP_FUNC
0+  function(doc) {
0+    if(doc.class == "Tag" && doc.photos) {
0+      var i;
0+      for(i = 0; i < doc.photos.length; i++) {
0+        emit(doc.photos[i], doc);
0+      }
0+    }
0+  }
0+MAP_FUNC
0+
0+photos_view = <<MAP_FUNC
0+  function(doc) {
0+    if(doc.class == "Photo" && doc.tags) {
0+      var i;
0+      for(i = 0; i < doc.tags.length; i++) {
0+        emit(doc.tags[i], doc);
0+      }
0+    }
0+  }
0+MAP_FUNC
0+
0+DesignDocument.get(Photo).add_view_to_data("all_tags", tags_view).save
0+DesignDocument.get(Tag).add_view_to_data("all_photos", photos_view).save
0+
0+#
0+# Insert some data
0+#
0+
0+Photo.destroy_all!
0+Tag.destroy_all!
0+
0+mg = Photo.new(:_id => "mg", :name => "Migration").save
0+des = Photo.new(:_id => "des", :name => "Dar es Salaam").save
0+
0+wd = Tag.new(:_id => "wd", :name => "wildebeest").save
0+tz = Tag.new(:_id => "tz", :name => "tanzania").save
0+
0+# Being forced to use ids and set the relationship on both sides is clunky and error
0+# prone, but it's no more than a current limitation of the library
0+
0+mg.tags = [wd._id, tz._id]
0+des.tags = [tz._id]
0+
0+wd.photos = [mg._id]
0+tz.photos = [mg._id, des._id]
0+
0+RelaxDB.bulk_save(mg, des, wd, tz)
0+
0+#
0+# Examine the data, confirm in the CouchDB log that n+1 requests aren't being made
0+#
0+
0+mg = Photo.all_by(:name) { |q| q.key = "Migration"}[0]
0+mg_tags = Photo.view("all_tags?key=\"#{mg._id}\"")
0+puts mg_tags.inject("Tags for #{mg.name}") { |m, t| m << " '#{t.name}'" }
0+
0+tz = Tag.all_by(:name) { |q| q.key = "tanzania" }[0]
0+tz_photos = Tag.view("all_photos?key=\"#{tz._id}\"")
0+puts tz_photos.inject("Photos for #{tz.name}") { |m, p| m << " '#{p.name}'" }
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
--- Revision None
+++ Revision 363533633036
@@ -0,0 +1,89 @@
+require 'rubygems'
+require 'relaxdb'
+
+# Specify the db to be used. Create it in CouchDB yourself locally.
+
+RelaxDB::Database.set_std_db :host => "localhost", :port => 5984, :db => "photos"
+
+#
+# Define the classes
+#
+
+class Photo < RelaxDB::Document
+
+ property :name
+ property :tags
+
+end
+
+class Tag < RelaxDB::Document
+
+ property :name
+ property :photos
+
+end
+
+#
+# Create the views
+#
+
+tags_view = <<MAP_FUNC
+ function(doc) {
+ if(doc.class == "Tag" && doc.photos) {
+ var i;
+ for(i = 0; i < doc.photos.length; i++) {
+ emit(doc.photos[i], doc);
+ }
+ }
+ }
+MAP_FUNC
+
+photos_view = <<MAP_FUNC
+ function(doc) {
+ if(doc.class == "Photo" && doc.tags) {
+ var i;
+ for(i = 0; i < doc.tags.length; i++) {
+ emit(doc.tags[i], doc);
+ }
+ }
+ }
+MAP_FUNC
+
+DesignDocument.get(Photo).add_view_to_data("all_tags", tags_view).save
+DesignDocument.get(Tag).add_view_to_data("all_photos", photos_view).save
+
+#
+# Insert some data
+#
+
+Photo.destroy_all!
+Tag.destroy_all!
+
+mg = Photo.new(:_id => "mg", :name => "Migration").save
+des = Photo.new(:_id => "des", :name => "Dar es Salaam").save
+
+wd = Tag.new(:_id => "wd", :name => "wildebeest").save
+tz = Tag.new(:_id => "tz", :name => "tanzania").save
+
+# Being forced to use ids and set the relationship on both sides is clunky and error
+# prone, but it's no more than a current limitation of the library
+
+mg.tags = [wd._id, tz._id]
+des.tags = [tz._id]
+
+wd.photos = [mg._id]
+tz.photos = [mg._id, des._id]
+
+RelaxDB.bulk_save(mg, des, wd, tz)
+
+#
+# Examine the data, confirm in the CouchDB log that n+1 requests aren't being made
+#
+
+mg = Photo.all_by(:name) { |q| q.key = "Migration"}[0]
+mg_tags = Photo.view("all_tags?key=\"#{mg._id}\"")
+puts mg_tags.inject("Tags for #{mg.name}") { |m, t| m << " '#{t.name}'" }
+
+tz = Tag.all_by(:name) { |q| q.key = "tanzania" }[0]
+tz_photos = Tag.view("all_photos?key=\"#{tz._id}\"")
+puts tz_photos.inject("Photos for #{tz.name}") { |m, p| m << " '#{p.name}'" }