<div dir="ltr"><font color="#000000" face="Times New Roman" size="3"><b>Louis Erickson:</b></font><br><div><b style="color:rgb(0,0,0);font-family:&#39;Times New Roman&#39;;font-size:medium">&gt;</b><span style="color:rgb(0,0,0)">You mean like DBIx::Class::DynamicSubclass?  The only odd part is the union of sql select, which sounds like a view to me.</span></div>
<div><span style="color:rgb(0,0,0)">I&#39;ll have to think about the possibility of just using a view instead of a resultsource.</span></div><div><span style="color:rgb(0,0,0)"><br></span></div><div><span style="color:rgb(0,0,0)">Yes I&#39;ve used DynamicSubclass in which it is described (in the </span><font color="#000000">Cookbook.pod#Dynamic_Sub-classing_DBIx::Class_proxy_classes) </font><span style="color:rgb(0,0,0)">as:</span></div>
<div><span style="color:rgb(0,0,0)"><br></span></div><div><div style><font color="#000000">|DBIx::Class classes are proxy classes, therefore some different techniques need to be employed for more than basic subclassing. In this example we have a single user table that carries a boolean bit for |admin. We would like to give the admin users objects (DBIx::Class::Row) the same methods as a regular user but also special admin only methods. It doesn&#39;t make sense to create two separate proxy-class |files for this. We would be copying all the user methods into the Admin class. There is a cleaner way to accomplish this.</font></div>
<div style><font color="#000000">|</font></div><div style><font color="#000000">|Overriding the inflate_result method within the User proxy-class gives us the effect we want. This method is called by DBIx::Class::ResultSet when inflating a result from storage. So we grab the object being |returned, inspect the values we are looking for, bless it if it&#39;s an admin object, and then return it.</font></div>
</div><div style><font color="#000000"><br></font></div><div style><font color="#000000">Which based on this, I believe my question boils down to if I use a custom resultsource to select rows from the database, is </font><span style="color:rgb(0,0,0)">DBIx::Class::ResultSet</span><span style="color:rgb(0,0,0)"> still used and does it still call the inflate_result method.</span></div>
<div style><font color="#000000"><br></font></div><div style><font color="#000000">Based on the following from the Cookbook it looks like the answer to the questions is that it is using ResultSet and I presume it should be calling inflate_result, but it will need testing(unless someone already knows this).</font></div>
<div style><br></div><div style><a name="arbitrary_sql_through_a_custom_resultsource" href="http://perl.mines-albi.fr/perl5.8.5/site_perl/5.8.5/DBIx/Class/Manual/Cookbook.html#arbitrary_sql_through_a_custom_resultsource" style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:large;font-style:italic">Arbitrary SQL through a custom ResultSource</a><br>
</div><div style><p style="text-align:justify;color:rgb(102,102,102);font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px">Sometimes you have to run arbitrary SQL because your query is too complex (e.g. it contains Unions, Sub-Selects, Stored Procedures, etc.) or has to be optimized for your database in a special way, but you still want to get the results as a <a href="http://perl.mines-albi.fr/perl5.8.5/DBIx/Class/ResultSet.html" style="color:rgb(0,102,255)">the DBIx::Class::ResultSet manpage</a>. The recommended way to accomplish this is by defining a separate ResultSource for your query. You can then inject complete SQL statements using a scalar reference (this is a feature of <a href="http://perl.mines-albi.fr/perl5.8.5/SQL/Abstract.html" style="color:rgb(0,102,255)">the SQL::Abstract manpage</a>).</p>
<p style="text-align:justify;color:rgb(102,102,102);font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px">Say you want to run a complex custom query on your user data, here&#39;s what you have to add to your User class:</p>
<pre style="margin-top:3px;margin-bottom:3px;border:1px solid rgb(170,170,170);padding:3px;color:rgb(170,0,0);font-family:Courier,monospace;font-size:14px;background-color:rgb(238,238,238)">  package My::Schema::User;
  
  use base qw/DBIx::Class/;
  
  # -&gt;load_components, -&gt;table, -&gt;add_columns, etc.</pre><pre style="margin-top:3px;margin-bottom:3px;border:1px solid rgb(170,170,170);padding:3px;color:rgb(170,0,0);font-family:Courier,monospace;font-size:14px;background-color:rgb(238,238,238)">
  # Make a new ResultSource based on the User class
  my $source = __PACKAGE__-&gt;result_source_instance();
  my $new_source = $source-&gt;new( $source );
  $new_source-&gt;source_name( &#39;UserFriendsComplex&#39; );
  
  # Hand in your query as a scalar reference
  # It will be added as a sub-select after FROM,
  # so pay attention to the surrounding brackets!
  $new_source-&gt;name( \&lt;&lt;SQL );
  ( SELECT u.* FROM user u 
  INNER JOIN user_friends f ON <a href="http://u.id">u.id</a> = f.user_id 
  WHERE f.friend_user_id = ?
  UNION 
  SELECT u.* FROM user u 
  INNER JOIN user_friends f ON <a href="http://u.id">u.id</a> = f.friend_user_id 
  WHERE f.user_id = ? )
  SQL</pre><pre style="margin-top:3px;margin-bottom:3px;border:1px solid rgb(170,170,170);padding:3px;color:rgb(170,0,0);font-family:Courier,monospace;font-size:14px;background-color:rgb(238,238,238)">  # Finally, register your new ResultSource with your Schema
  My::Schema-&gt;register_source( &#39;UserFriendsComplex&#39; =&gt; $new_source );</pre><p style="text-align:justify;color:rgb(102,102,102);font-family:Verdana,Arial,Helvetica,sans-serif;font-size:16px">Next, you can execute your complex query using bind parameters like this:</p>
<pre style="margin-top:3px;margin-bottom:3px;border:1px solid rgb(170,170,170);padding:3px;color:rgb(170,0,0);font-family:Courier,monospace;font-size:14px;background-color:rgb(238,238,238)">  my $friends = [ $schema-&gt;resultset( &#39;UserFriendsComplex&#39; )-&gt;search( {}, 
    {
      bind  =&gt; [ 12345, 12345 ]
    }
  ) ];
  
... and you&#39;ll get back a perfect L&lt;DBIx::Class::ResultSet&gt;.</pre></div></div>