Class: Medea::JasonDeferredQuery
- Inherits:
-
Object
- Object
- Medea::JasonDeferredQuery
- Defined in:
- lib/medea/jasondeferredquery.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#contents ⇒ Object
Returns the value of attribute contents.
-
#filters ⇒ Object
Returns the value of attribute filters.
-
#result_format ⇒ Object
Returns the value of attribute result_format.
-
#state ⇒ Object
Returns the value of attribute state.
-
#time_limit ⇒ Object
Returns the value of attribute time_limit.
-
#type ⇒ Object
Returns the value of attribute type.
Instance Method Summary collapse
-
#[](index) ⇒ Object
array access interface.
-
#add_data_filter(property, value) ⇒ Object
end query interface.
- #count ⇒ Object
- #each(&block) ⇒ Object
-
#execute_query ⇒ Object
end array interface.
- #include?(item) ⇒ Boolean
-
#initialize(a_class, format = :search) ⇒ JasonDeferredQuery
constructor
A new instance of JasonDeferredQuery.
-
#method_missing(name, *args, &block) ⇒ Object
here we will capture: members_of(object) (where object is an instance of a class that this class can be a member of) members_of_<classname>(key) find_by_<property>(value) Will return a JasonDeferredQuery for this class with the appropriate data filter set.
- #to_url ⇒ Object
Constructor Details
#initialize(a_class, format = :search) ⇒ JasonDeferredQuery
Returns a new instance of JasonDeferredQuery.
8 9 10 11 12 13 14 15 16 17 18 |
# File 'lib/medea/jasondeferredquery.rb', line 8 def initialize a_class, format=:search self.type = a_class self.filters = { :VERSION0 => nil } if self.type self.filters[:FILTER] = {:HTTP_X_CLASS => a_class.name.to_s} end self.result_format = format self.time_limit = 0 self.state = :prefetch self.contents = [] end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object
here we will capture: members_of(object) (where object is an instance of a class that this class can be a member of) members_of_<classname>(key) find_by_<property>(value) Will return a JasonDeferredQuery for this class with the appropriate data filter set
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 |
# File 'lib/medea/jasondeferredquery.rb', line 27 def method_missing(name, *args, &block) #if we are postfetch, we throw away all our cached results if self.state == :postfetch self.state = :prefetch self.contents = [] end field = name.to_s if field =~ /^members_of$/ #use the type and key of the first arg (being a JasonObject) #args[0] must be a JasonObject (or child) raise ArgumentError, "When looking for members, you must pass a JasonObject" unless args[0].is_a? JasonObject self.filters[:DATA_FILTER] ||= {} self.filters[:DATA_FILTER]["__member_of"] ||= [] self.filters[:DATA_FILTER]["__member_of"] << args[0].jason_key elsif field =~ /^find_by_(.*)$/ #use the property name from the name variable, and the value from the first arg add_data_filter $1, args[0].to_s else #no method! super return end #return self, so that we can chain up query refinements self end |
Instance Attribute Details
#contents ⇒ Object
Returns the value of attribute contents.
6 7 8 |
# File 'lib/medea/jasondeferredquery.rb', line 6 def contents @contents end |
#filters ⇒ Object
Returns the value of attribute filters.
6 7 8 |
# File 'lib/medea/jasondeferredquery.rb', line 6 def filters @filters end |
#result_format ⇒ Object
Returns the value of attribute result_format.
6 7 8 |
# File 'lib/medea/jasondeferredquery.rb', line 6 def result_format @result_format end |
#state ⇒ Object
Returns the value of attribute state.
6 7 8 |
# File 'lib/medea/jasondeferredquery.rb', line 6 def state @state end |
#time_limit ⇒ Object
Returns the value of attribute time_limit.
6 7 8 |
# File 'lib/medea/jasondeferredquery.rb', line 6 def time_limit @time_limit end |
#type ⇒ Object
Returns the value of attribute type.
6 7 8 |
# File 'lib/medea/jasondeferredquery.rb', line 6 def type @type end |
Instance Method Details
#[](index) ⇒ Object
array access interface
91 92 93 94 |
# File 'lib/medea/jasondeferredquery.rb', line 91 def [](index) execute_query unless self.state == :postfetch self.contents[index] end |
#add_data_filter(property, value) ⇒ Object
end query interface
57 58 59 60 |
# File 'lib/medea/jasondeferredquery.rb', line 57 def add_data_filter property, value self.filters[:DATA_FILTER] ||= {} self.filters[:DATA_FILTER][property] = value end |
#count ⇒ Object
101 102 103 104 |
# File 'lib/medea/jasondeferredquery.rb', line 101 def count execute_query unless self.state == :postfetch self.contents.count end |
#each(&block) ⇒ Object
96 97 98 99 |
# File 'lib/medea/jasondeferredquery.rb', line 96 def each(&block) execute_query unless self.state == :postfetch self.contents.each &block end |
#execute_query ⇒ Object
end array interface
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/medea/jasondeferredquery.rb', line 115 def execute_query #hit the URL #fill self.contents with :ghost versions of JasonObjects begin #puts " = Executing #{type.name} deferred query! (#{to_url})" result = JSON.parse(RestClient.get to_url) self.contents = [] #results are in a hash, their keys are just numbers result.keys.each do |k| if k =~ /^[0-9]+$/ #this is a result! get the key /\/([^\/]*)\/([^\/]*)$/.match result[k]["POST_TO"] #$1 is the class name, $2 is the key item = type.new($2, :lazy) if result[k].has_key?("CONTENT") && result[k]["CONTENT"] != "" item.instance_variable_set(:@__jason_data, result[k]["CONTENT"]) item.instance_variable_set(:@__jason_state, :stale) end if result[k].has_key?("HTTP_X_PARENT") && result[k]["HTTP_X_PARENT"] != "" item.jason_parent_key = result[k]["HTTP_X_PARENT"] end self.contents << item end end self.state = :postfetch result rescue self.contents = [] end end |
#include?(item) ⇒ Boolean
106 107 108 109 110 111 112 |
# File 'lib/medea/jasondeferredquery.rb', line 106 def include?(item) execute_query unless self.state == :postfetch self.contents.each do |i| return true if i.jason_key == item.jason_key end false end |
#to_url ⇒ Object
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 |
# File 'lib/medea/jasondeferredquery.rb', line 62 def to_url url = "#{JasonDB::db_auth_url}@#{self.time_limit}.#{self.result_format}?" filter_array = [] self.filters.each do |name, val| if not val filter_array << name.to_s next else #FILTER's value is a hash (to avoid dupes) #DATA_FILTER's value is a hash if val.is_a? Hash #for each k/v in the hash, we want to add an entry to filter_array val.each do |field ,value| if value.is_a? Array value.each do |i| filter_array << "#{name.to_s}=#{URI.escape(field)}:#{URI.escape(i)}" end else filter_array << "#{name.to_s}=#{URI.escape(field.to_s)}:#{URI.escape(value.to_s)}" end end end end end url + filter_array.join("&") end |