]> git.openstreetmap.org Git - rails.git/blobdiff - app/models/node.rb
merged node and old node models for normalised node tags
[rails.git] / app / models / node.rb
index 08a675b430960d81dc0276584fa75eea0c18de99..5a8e03ef170ca49880524c3541f6598f47d29137 100644 (file)
@@ -10,6 +10,7 @@ class Node < GeoRecord
 
   has_many :old_nodes, :foreign_key => :id
   has_many :way_nodes
+  has_many :node_tags, :foreign_key => :id
   belongs_to :user
  
   def validate_position
@@ -22,6 +23,33 @@ class Node < GeoRecord
     return true
   end
 
+  #
+  # Search for nodes matching tags within bounding_box
+  #
+  # Also adheres to limitations such as within max_number_of_nodes
+  #
+  def self.search(bounding_box, tags = {})
+    min_lon, min_lat, max_lon, max_lat = *bounding_box
+    # @fixme a bit of a hack to search for only visible nodes
+    # couldn't think of another to add to tags condition
+    #conditions_hash = tags.merge({ 'visible' => 1 })
+  
+    # using named placeholders http://www.robbyonrails.com/articles/2005/10/21/using-named-placeholders-in-ruby
+    #keys = []
+    #values = {}
+
+    #conditions_hash.each do |key,value|
+    #  keys <<  "#{key} = :#{key}"
+    #  values[key.to_sym] = value
+    #end 
+    #conditions = keys.join(' AND ')
+    find_by_area(min_lat, min_lon, max_lat, max_lon,
+                    :conditions => 'visible = 1',
+                    :limit => APP_CONFIG['max_number_of_nodes']+1)  
+  end
+
+  # Read in xml as text and return it's Node object representation
   def self.from_xml(xml, create=false)
     begin
       p = XML::Parser.new
@@ -55,10 +83,9 @@ class Node < GeoRecord
         tags = []
 
         pt.find('tag').each do |tag|
-          tags << [tag['k'],tag['v']]
+          node.add_tag_key_val(tag['k'],tag['v'])
         end
 
-        node.tags = Tags.join(tags)
       end
     rescue
       node = nil
@@ -68,12 +95,36 @@ class Node < GeoRecord
   end
 
   def save_with_history!
-    Node.transaction do
-      self.timestamp = Time.now
+    t = Time.now
+
+    Node.transaction do 
+      # apply timestamp to the new node
+      self.timestamp = t
       self.save!
-      old_node = OldNode.from_node(self)
-      old_node.save!
     end
+
+    # Create a NodeTag
+    NodeTag.transaction do 
+      tags = self.tags
+
+      NodeTag.delete_all(['id = ?', self.id])
+
+      sequence_id = 1
+      tags.each do |k,v|
+        tag = NodeTag.new
+        tag.k = k 
+        tag.v = v 
+        tag.id = self.id
+        tag.sequence_id = sequence_id
+        tag.save!
+        sequence_id += 1
+      end 
+    end 
+    # Create an OldNode
+    old_node = OldNode.from_node(self)
+    old_node.timestamp = t
+    old_node.save_with_dependencies!
+
   end
 
   def to_xml
@@ -100,7 +151,7 @@ class Node < GeoRecord
 
     el1['user'] = user_display_name_cache[self.user_id] unless user_display_name_cache[self.user_id].nil?
 
-    Tags.split(self.tags) do |k,v|
+    self.tags.each do |k,v|
       el2 = XML::Node.new('tag')
       el2['k'] = k.to_s
       el2['v'] = v.to_s
@@ -120,4 +171,25 @@ class Node < GeoRecord
     hash
   end
 
+  def tags
+    unless @tags
+      @tags = {}
+      self.node_tags.each do |tag|
+        @tags[tag.k] = tag.v
+      end
+    end
+    @tags
+  end
+
+  def tags=(t)
+    @tags = t 
+  end 
+
+  def add_tag_key_val(k,v)
+    @tags = Hash.new unless @tags
+    @tags[k] = v
+  end
+
+
+
 end