Adding the tags to the rails collect query can reduce performance
because there are 2 more tables to join with.
So we make sure to include tags in the query only when it is
necessary.

Signed-off-by: Brice Figureau <[email protected]>
---
 lib/puppet/parser/collector.rb |    9 ++++++++-
 spec/unit/parser/collector.rb  |   12 +++++++++++-
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/lib/puppet/parser/collector.rb b/lib/puppet/parser/collector.rb
index 5f11a6c..a7f81b4 100644
--- a/lib/puppet/parser/collector.rb
+++ b/lib/puppet/parser/collector.rb
@@ -102,13 +102,20 @@ class Puppet::Parser::Collector
         raise Puppet::DevError, "Cannot collect resources for a nil host" 
unless @scope.host
         host = Puppet::Rails::Host.find_by_name(@scope.host)
 
-        query = {:include => {:param_values => :param_name, :puppet_tags => 
:resource_tags}}
+        query = {:include => {:param_values => :param_name}}
 
         search = "(exported=? AND restype=?)"
         values = [true, @type]
 
         search += " AND (%s)" % @equery if @equery
 
+        # this is a small performance optimisation
+        # the tag mechanism involves 3 more joins, which are
+        # needed only if we query on tags.
+        if search =~ /puppet_tags/
+            query[:include][:puppet_tags] = :resource_tags
+        end
+
         # We're going to collect objects from rails, but we don't want any
         # objects from this host.
         search = ("host_id != ? AND %s" % search) and values.unshift(host.id) 
if host
diff --git a/spec/unit/parser/collector.rb b/spec/unit/parser/collector.rb
index c2d5a99..926033c 100755
--- a/spec/unit/parser/collector.rb
+++ b/spec/unit/parser/collector.rb
@@ -505,7 +505,17 @@ describe Puppet::Parser::Collector, "when building its 
ActiveRecord query for co
         @collector.evaluate.should == [...@resource]
     end
 
-    it "should return parameter names, parameter values and tags when querying 
ActiveRecord" do
+    it "should return parameter names, parameter values when querying 
ActiveRecord" do
+        Puppet::Rails::Resource.stubs(:find).with { |*arguments|
+            options = arguments[3]
+            options[:include] == {:param_values => :param_name}
+        }.returns([...@resource])
+
+        @collector.evaluate.should == [...@resource]
+    end
+
+    it "should return tags when querying ActiveRecord with a tag exported 
query" do
+        @collector.equery = "puppet_tags.name = test"
         Puppet::Rails::Resource.stubs(:find).with { |*arguments|
             options = arguments[3]
             options[:include] == {:param_values => :param_name, :puppet_tags 
=> :resource_tags}
-- 
1.6.0.2


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to