medea 0.2.22 → 0.2.23

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.22
1
+ 0.2.23
@@ -1,12 +1,16 @@
1
1
  module Medea
2
2
  class JasonDeferredQuery
3
3
  require 'rest_client'
4
+ require 'uri'
4
5
 
5
6
  attr_accessor :time_limit, :result_format, :type, :time_limit, :state, :contents, :filters
6
7
 
7
8
  def initialize a_class, format=:search
8
9
  self.type = a_class
9
- self.filters = {:FILTER => {:HTTP_X_CLASS => a_class.name.to_s}, :VERSION0 => nil}
10
+ self.filters = { :VERSION0 => nil }
11
+ if self.type
12
+ self.filters[:FILTER] = {:HTTP_X_CLASS => a_class.name.to_s}
13
+ end
10
14
  self.result_format = format
11
15
  self.time_limit = 0
12
16
  self.state = :prefetch
@@ -70,10 +74,10 @@ module Medea
70
74
  val.each do |field ,value|
71
75
  if value.is_a? Array
72
76
  value.each do |i|
73
- filter_array << "#{name.to_s}=#{field}:#{i}"
77
+ filter_array << "#{name.to_s}=#{URI.escape(field)}:#{URI.escape(i)}"
74
78
  end
75
79
  else
76
- filter_array << "#{name.to_s}=#{field.to_s}:#{value.to_s}"
80
+ filter_array << "#{name.to_s}=#{URI.escape(field.to_s)}:#{URI.escape(value.to_s)}"
77
81
  end
78
82
  end
79
83
  end
@@ -100,7 +104,7 @@ module Medea
100
104
  end
101
105
  #end array interface
102
106
 
103
- def execute_query content=false
107
+ def execute_query
104
108
  #hit the URL
105
109
  #fill self.contents with :ghost versions of JasonObjects
106
110
  begin
@@ -114,17 +118,21 @@ module Medea
114
118
  /\/([^\/]*)\/([^\/]*)$/.match result[k]["POST_TO"]
115
119
  #$1 is the class name, $2 is the key
116
120
  item = type.new($2, :lazy)
117
- if result[k].has_key? "CONTENT" && content
121
+ if result[k].has_key? "CONTENT" && result[k]["CONTENT"] != ""
118
122
  item.instance_variable_set(:@__jason_data, result[k]["CONTENT"])
119
123
  item.instance_variable_set(:@__jason_state, :stale)
120
124
  end
125
+ if result[k].has_key? "HTTP_X_PARENT" && result[k]["HTTP_X_PARENT"] != ""
126
+ item.jason_parent_key = result[k]["HTTP_X_PARENT"]
127
+ end
121
128
  self.contents << item
122
129
  end
123
130
  end
131
+
132
+ self.state = :postfetch
133
+ result
124
134
  rescue
125
135
  self.contents = []
126
- ensure
127
- self.state = :postfetch
128
136
  end
129
137
  end
130
138
  end
@@ -54,6 +54,31 @@ module Medea
54
54
  end
55
55
  #end query interface
56
56
 
57
+ #the resolve method takes a key and returns the JasonObject that has that key
58
+ #This is useful when you have the key, but not the class
59
+ def JasonObject.resolve(key, mode=:lazy)
60
+ q = JasonDeferredQuery.new nil
61
+ q.filters[:FILTER] ||= {}
62
+ q.filters[:FILTER][:HTTP_X_KEY] = key
63
+ resp = JSON.parse(RestClient.get(q.to_url))
64
+ if resp.has_key? "1"
65
+ #this is the object, figure out its class
66
+ resp["1"]["POST_TO"] =~ /([^\/]+)\/#{key}/
67
+ begin
68
+ result = Kernel.const_get($1).get_by_key key, :lazy
69
+ if result["1"].has_key? "CONTENT"
70
+ result.instance_variable_set(:@__jason_data, result["1"]["CONTENT"])
71
+ result.instance_variable_set(:@__jason_state, :stale)
72
+ end
73
+ if mode == :eager
74
+ result.send(:load)
75
+ end
76
+ rescue
77
+ nil
78
+ end
79
+ end
80
+ end
81
+
57
82
  #"flexihash" access interface
58
83
  def []=(key, value)
59
84
  @__jason_data ||= {}
@@ -116,6 +141,26 @@ module Medea
116
141
 
117
142
  def jason_parent
118
143
  @__jason_parent ||= nil
144
+ if @__jason_parent == nil && @__jason_parent_key
145
+ #key is set but parent not? load the parent
146
+ @__jason_parent = JasonObject.resolve @__jason_parent_key
147
+ end
148
+ @__jason_parent
149
+ end
150
+
151
+ def jason_parent= parent
152
+ @__jason_parent = parent
153
+ @__jason_parent_key = parent.jason_key
154
+ end
155
+
156
+ def jason_parent_key
157
+ @__jason_parent_key ||= nil
158
+ end
159
+
160
+ def jason_parent_key= value
161
+ @__jason_parent_key = value
162
+ #reset the parent here?
163
+ @__jason_parent = nil
119
164
  end
120
165
 
121
166
  def jason_parent_list
@@ -126,10 +171,6 @@ module Medea
126
171
  @__jason_parent_list = value
127
172
  end
128
173
 
129
- def jason_parent= parent
130
- @__jason_parent = parent
131
- end
132
-
133
174
  #object persistence methods
134
175
 
135
176
  #POSTs the current values of this object back to JasonDB
@@ -197,15 +238,21 @@ module Medea
197
238
  def load
198
239
  #because this object might be owned by another, we need to search by key.
199
240
  #not passing a format to the query is a shortcut to getting just the object.
200
- #url = "#{JasonDB::db_auth_url}@0.content?"
201
- #params = [
202
- # "VERSION0",
203
- # #"FILTER=HTTP_X_CLASS:#{self.class.name}",
204
- # "FILTER=HTTP_X_KEY:#{self.jason_key}"
205
- #]
206
-
207
- #url << params.join("&")
208
- url = "#{JasonDB::db_auth_url}#{self.class.name}/#{self.jason_key}"
241
+ url = "#{JasonDB::db_auth_url}@0.content?"
242
+ params = [
243
+ "VERSION0",
244
+ "FILTER=HTTP_X_KEY:#{self.jason_key}"
245
+ ]
246
+
247
+ if not self.class.owned
248
+ #if the class is owned, we don't want to filter by class name (X-CLASS will be the list name)
249
+ #if it isn't owned, it is safe to filter by X-CLASS
250
+ #if this item is "had" rather than owned, we MUST filter by class, otherwise we get the references.
251
+ params << "FILTER=HTTP_X_CLASS:#{self.class.name}"
252
+ end
253
+
254
+ url << params.join("&")
255
+ #url = "#{JasonDB::db_auth_url}#{self.class.name}/#{self.jason_key}"
209
256
 
210
257
  #puts " = Retrieving #{self.class.name} at #{url}"
211
258
  response = RestClient.get url
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 22
9
- version: 0.2.22
8
+ - 23
9
+ version: 0.2.23
10
10
  platform: ruby
11
11
  authors:
12
12
  - Michael Jensen