consolidate some slides, add some stuff, yay.
[dbsrgits/dbix-class-introduction-presentation.git] / slideshow.html
index 76917e9..da96a63 100644 (file)
 
    <div class="slide">
       <h1>What's up guys?</h1>
-      <div class="notes">
-         <ul>
-            <li>How many people have used any ORM?<ul>
-               <li>In Perl?<ul>
-                  <li>DBIC?</li>
-                  <li>Class::DBI?</li>
-                  <li>Rose::DB?</li>
-                  <li>Fey?</li>
-                  <li>Others?</li>
-               </ul></li>
-               <li>AR?</li>
-               <li>DataMapper?</li>
-               <li>(N)Hibernate?</li>
+      <ul class="incremental">
+         <li>How many people have used any ORM?</li><ul class="incremental">
+            <li>In Perl?<ul class="incremental">
+               <li>DBIC?</li>
+               <li>Class::DBI?</li>
+               <li>Rose::DB?</li>
+               <li>Fey?</li>
+               <li>Others?</li>
             </ul></li>
-         </ul>
-      </div>
+            <li>AR?</li>
+            <li>(N)Hibernate?</li>
+         </ul></li>
+      </ul>
    </div>
 
    <div class="slide">
       <p>The purpose of this talk is to show you as many features of
       DBIx::Class in 40 minutes so that when you need to do something with
       it later you will know what's possible</p>
+      <ul class="incremental">
+         <li>Note: links in slides are so you can find docs for what I'm talking about later</li>
+      </ul>
    </div>
 
    <div class="slide">
    <div class="slide">
       <h1>Responsive Community</h1>
       <ul class="incremental">
-         <li>needed MSSQL Order by support, they helped me add support</li>
+         <li>needed MSSQL order-by support, they helped me add support</li>
          <li>generally very welcoming of people willing to help</li>
       </ul>
    </div>
@@ -179,12 +179,14 @@ $sth-&gt;execute(
 
    <div class="slide">
       <h1>DBIC: Create</h1>
-<pre>my $book = $book_rs-&gt;create({
+<pre>my $book = $book_rs-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#create">create</a>({
    title     =&gt; 'A book title',
    author_id =&gt; $author_id,
 });</pre>
       <ul class="incremental">
          <li>No need to pair placeholders and values</li>
+         <li>Automatically gets autoincremented id for you</li>
+         <li>Transparently uses INSERT ... RETURNING for databases that support it</li>
       </ul>
    </div>
 
@@ -195,12 +197,9 @@ $sth-&gt;execute(
    authors.name as author_name
    FROM books, authors
    WHERE books.author = authors.id
-');</pre>
-   </div>
+');
 
-   <div class="slide">
-      <h1>SQL: Read</h1>
-<pre>while( my $book = $sth-&gt;fetchrow_hashref() ) {
+while( my $book = $sth-&gt;fetchrow_hashref() ) {
   print 'Author of '
      . $book-&gt;{title}
      . ' is '
@@ -211,29 +210,27 @@ $sth-&gt;execute(
 
    <div class="slide">
       <h1>DBIC: Read</h1>
-<pre>my $book = $book_rs-&gt;find($book_id);
+<pre>my $book = $book_rs-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#find">find</a>($book_id);
 
-my $book = $book_rs-&gt;search({
+my $book = $book_rs-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#search">search</a>({
    title =&gt; 'A book title',
-}, { rows =&gt; 1 })-&gt;single;
+}, { rows =&gt; 1 })-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#next">next</a>;
 
 my @books = $book_rs-&gt;search({
    author =&gt; $author_id,
-})-&gt;all;</pre>
-      <ul class="incremental">
-         <li>TMTOWTDI</li>
-      </ul>
-   </div>
+})-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#all">all</a>;
 
-   <div class="slide">
-      <h1>DBIC: Read</h1>
-<pre>while( my $book = $books_rs-&gt;next ) {
+while( my $book = $books_rs-&gt;next ) {
  print 'Author of '
     . $book-&gt;title
     . ' is '
     . $book-&gt;author-&gt;name
     . "\n";
-}</pre>
+}
+</pre>
+      <ul class="incremental">
+         <li>TMTOWTDI</li>
+      </ul>
    </div>
 
    <div class="slide">
@@ -251,9 +248,12 @@ $update-&gt;execute(
 
    <div class="slide">
       <h1>DBIC: Update</h1>
-<pre>$book-&gt;update({
+<pre>$book-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Row#update">update</a>({
   title =&gt; 'New title',
 });</pre>
+      <ul class="incremental">
+         <li>Won't update unless value changes</li>
+      </ul>
    </div>
 
    <div class="slide">
@@ -268,7 +268,7 @@ $delete-&gt;execute(<strong>$book_id</strong>);</pre>
 
    <div class="slide">
       <h1>DBIC: Delete</h1>
-<pre>$book-&gt;delete;</pre>
+<pre>$book-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Row#delete">delete</a>;</pre>
    </div>
 
    <div class="slide">
@@ -288,8 +288,8 @@ $delete-&gt;execute(<strong>$book_id</strong>);</pre>
    <div class="slide">
       <h1>Convenience Methods</h1>
       <ul class="incremental">
-         <li>find_or_create</li>
-         <li>create_or_update</li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#find_or_create">find_or_create</a></li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#update_or_create">update_or_create</a></li>
       </ul>
    </div>
 
@@ -319,8 +319,10 @@ $delete-&gt;execute(<strong>$book_id</strong>);</pre>
    <div class="slide">
       <h1>-&gt;deploy</h1>
       <p>Perl -&gt; DB</p>
-<pre>my $schema = Foo::Schema-&gt;connect($dsn, $user, $pass);
-$schema-&gt;deploy
+<pre>my $schema = Foo::Schema-&gt;connect(
+   $dsn, $user, $pass
+);
+$schema-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema#deploy">deploy</a>
 </pre>
 <p>See also: <a href="http://search.cpan.org/perldoc?DBIx::Class::DeploymentHandler">DBIx::Class::DeploymentHandler</a></p>
    </div>
@@ -330,8 +332,8 @@ $schema-&gt;deploy
       <p>DB -&gt; Perl</p>
 <pre>package Foo::Schema;
 use strict; use warnings;
-use base 'DBIx::Class::Schema::Loader';
-__PACKAGE__-&gt;loader_options({
+use base '<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema::Loader">DBIx::Class::Schema::Loader</a>';
+__PACKAGE__-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema::Loader::Base#CONSTRUCTOR_OPTIONS">loader_options</a>({
    naming =&gt; 'v7',
    debug  =&gt; $ENV{DBIC_TRACE},
 });
@@ -339,16 +341,18 @@ __PACKAGE__-&gt;loader_options({
 
 # elsewhere...
 
-my $schema = Foo::Schema-&gt;connect($dsn, $user, $pass);
+my $schema = Foo::Schema-&gt;connect(
+   $dsn, $user, $pass
+);
 </pre>
    </div>
 
    <div class="slide">
       <h1>Populate</h1>
       <p>Made for inserting lots of rows very quicky into database</p>
-<pre>$schema-&gt;populate([ Users =&gt;
+<pre>$schema-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema#populate">populate</a>([ Users =&gt;
    [qw( username password )],
-   [qw( frew &gt;=4char$  )],
+   [qw( frew     &gt;=4char$ )],
    [qw(      ...          )],
    [qw(      ...          )],
 );
@@ -361,14 +365,15 @@ my $schema = Foo::Schema-&gt;connect($dsn, $user, $pass);
    <div class="slide">
       <h1>Multicreate</h1>
       <p>Create an object and all of it's related objects all at once</p>
-<pre>$schema-&gt;resultset('Author')-&gt;create({
+<pre>$schema-&gt;resultset('Author')-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#create">create</a>({
    name =&gt; 'Stephen King',
    books =&gt; [{ title =&gt; 'The Dark Tower' }],
    address =&gt; {
       street =&gt; '123 Turtle Back Lane',
       state  =&gt; { abbreviation =&gt; 'ME' },
-      city   =&gt; { name =&gt; 'Lowell' },
+      city   =&gt; { name =&gt; 'Lowell'     },
    },
+});
 </pre>
       <div class="notes">
          <ul>
@@ -388,18 +393,18 @@ my $schema = Foo::Schema-&gt;connect($dsn, $user, $pass);
    <div class="slide">
       <h1>Extensible: DBIC::Helpers</h1>
       <ul class="incremental">
-         <li>DBIx::Class::Helper::ResultSet::IgnoreWantarray</li>
-         <li>DBIx::Class::Helper::ResultSet::Random</li>
-         <li>DBIx::Class::Helper::ResultSet::SetOperations</li>
-         <li>DBIx::Class::Helper::Row::JoinTable</li>
-         <li>DBIx::Class::Helper::Row::NumifyGet</li>
-         <li>DBIx::Class::Helper::Row::SubClass</li>
-         <li>DBIx::Class::Helper::Row::ToJSON</li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Helper::ResultSet::IgnoreWantarray">DBIC::Helper::ResultSet::IgnoreWantarray</a></li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Helper::ResultSet::Random">DBIC::Helper::ResultSet::Random</a></li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Helper::ResultSet::SetOperations">DBIC::Helper::ResultSet::SetOperations</a></li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Helper::ResultSet::JoinTable">DBIC::Helper::Row::JoinTable</a></li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Helper::ResultSet::NumifyGet">DBIC::Helper::Row::NumifyGet</a></li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Helper::ResultSet::SubClass">DBIC::Helper::Row::SubClass</a></li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Helper::ResultSet::ToJSON">DBIC::Helper::Row::ToJSON</a></li>
       </ul>
    </div>
 
    <div class="slide">
-      <h1>Extensible: DBIC::TimeStamp</h1>
+      <h1>Extensible: <a href="http://search.cpan.org/perldoc?DBIx::Class::TimeStamp">DBIC::TimeStamp</a></h1>
       <ul class="incremental">
          <li>Cross DB</li>
          <li>set_on_create</li>
@@ -408,8 +413,9 @@ my $schema = Foo::Schema-&gt;connect($dsn, $user, $pass);
    </div>
 
    <div class="slide">
-      <h1>Extensible: DBIx::Class::Schema::KiokuDB</h1>
+      <h1>Extensible: Kioku</h1>
       <ul class="incremental">
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::Schema::KiokuDB">DBIx::Class::Schema::KiokuDB</a></li>
          <li>Kioku is the new hotness</li>
          <li>Mix RDBMS with Object DB</li>
          <li>beta ( == sexy )</li>
@@ -417,10 +423,10 @@ my $schema = Foo::Schema-&gt;connect($dsn, $user, $pass);
    </div>
 
    <div class="slide">
-      <h1>SQL::Abstract</h1>
-      <pre>my $resultset = $book_rs-&gt;search({
-         name =&gt; { -like =&gt; "%$nick%" },
-      });</pre>
+      <h1><a href="http://search.cpan.org/perldoc?SQL::Abstract">SQL::Abstract</a></h1>
+<pre>my $resultset = $book_rs-&gt;search({
+   name =&gt; { -like =&gt; "%$nick%" },
+});</pre>
       <ul class="incremental">
          <li>(kinda) introspectible</li>
          <li>Prettier than SQL</li>
@@ -431,7 +437,9 @@ my $schema = Foo::Schema-&gt;connect($dsn, $user, $pass);
       <h1>Result vs ResultSet</h1>
          <ul class="incremental">
             <li>Result == Row</li>
-            <li>ResultSet == Query</li>
+            <li>ResultSet == Query Plan<ul class="incremental">
+               <li>Internal Join Optimizer for all DB's (!!!)</li>
+            </ul></li>
             <li>(less important but...)</li>
             <li>ResultSource == Table</li>
             <li>Storage == Database</li>
@@ -439,27 +447,34 @@ my $schema = Foo::Schema-&gt;connect($dsn, $user, $pass);
    </div>
 
    <div class="slide">
-      <h1>ResultSet methods</h1>
+      <h1><a href="http://search.cpan.org/perldoc?DBIx::Class::Manual::Cookbook#Predefined_searches">ResultSet methods</a></h1>
 <pre>package MyApp::Schema::ResultSet::Book;
 use base 'DBIx::Class::ResultSet';
 sub good {
    my $self = shift;
    $self-&gt;search({
-      rating =&gt; { '&gt;=' =&gt; 4 },
+      $self-&gt;current_source_alias .
+         '.rating' =&gt; { '&gt;=' =&gt; 4 },
    })
 };
 sub cheap {
    my $self = shift;
    $self-&gt;search({
-      price =&gt; { '&lt;=' =&gt; 5}
+      $self-&gt;current_source_alias .
+         '.price' =&gt; { '&lt;=' =&gt; 5}
    })
 };
 # ...
 1;
       </pre>
+   </div>
+
+   <div class="slide">
+      <h1>ResultSet method notes</h1>
       <ul class="incremental">
          <li>All searches should be ResultSet methods</li>
          <li>Name has obvious meaning</li>
+         <li><a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#current_source_alias">current_source_alias</a> helps things to work no matter what</li>
       </ul>
    </div>
 
@@ -478,404 +493,196 @@ sub cheap {
    </div>
 
    <div class="slide">
-      <h1>DEBUGGING</h1>
-      <pre>DBIC_TRACE=1 ./your_script.pl</pre>
+      <h1>search_related</h1>
+<pre>my $score = $schema-&gt;resultset('User')
+   -&gt;search({'me.userid' =&gt; 'frew'})
+   -&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#related_resultset">related_resultset</a>('access')
+   -&gt;related_resultset('mgmt')
+   -&gt;related_resultset('orders')
+   -&gt;telephone
+   -&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#search_related">search_related</a>( shops =&gt; {
+      'shops.datecompleted' =&gt; {
+         -between =&gt; ['2009-10-01','2009-10-08']
+      }
+   })-&gt;completed
+   -&gt;related_resultset('rpt_score')
+   -&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#get_column">get_column</a>('raw_scores')
+   -&gt;first;
+</pre>
    </div>
 
    <div class="slide">
-      <h1>SQL - debugging</h1>
-<pre>INSERT INTO authors (name)
-   VALUES (?): 'Douglas Adams'
-
-INSERT INTO books (author, title)
-   VALUES (?, ?): '5', '42'</pre>
-   </div>
+      <h1>bonus rel methods</h1>
+<pre>my $book = $author-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Relationship::Base#create_related">create_related</a>(
+   <strong>books</strong> =&gt; {
+      title =&gt; 'Another Discworld book',
+   }
+);
 
-   <div class="slide">
-      <h1>overloading</h1>
-<pre>Foo::Schema::Result::Book
-Foo::Schema::ResultSet::Book
-Foo::Schema::Result::Author
-Foo::Schema::ResultSet::Book</pre>
+my $book2 = $pratchett-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Relationship::Base#add_to_$rel">add_to_<strong>books</strong></a>({
+   title =&gt; 'MOAR Discworld book',
+});</pre>
+      <ul class="incremental">
+         <li>Automaticaly fills in foreign key for you</li>
+      </ul>
    </div>
 
    <div class="slide">
-      <h1>Result::</h1>
-<pre>package Foo::Schema::Result::Book;
-use base 'DBIx::Class::Core';
-use strict;
-use warnings;
-
-# Result code here
-
-sub isbn {
-   my $self = shift;
-
-   # search amazon or something
-   my $api = Amazon::API-&gt;book({
-      title =&gt; $self-&gt;title
-   });
-
-   return $api-&gt;isbn;
-}
+      <h1>Excellent Transaction Support</h1>
+<pre>$schema-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema#txn_do">txn_do</a>(sub {
+   ...
+});
 
-1;</pre>
-   </div>
+my $guard = $schema-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema#txn_scope_guard">txn_scope_guard</a>;
+# ...
+$guard-&gt;commit;
 
-   <div class="slide">
-      <h1>Result::</h1>
-<pre>print $book-&gt;isbn;</pre>
+$schema-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema#txn_begin">txn_begin</a>; # &lt;-- low level
+# ...
+$schema-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema#txn_commit">txn_commit</a>;
+</pre>
    </div>
 
    <div class="slide">
-      <h1>Result:: (inflating)</h1>
+      <h1>InflateColumn</h1>
 <pre>package Foo::Schema::Result::Book;
 use base 'DBIx::Class::Core';
-use strict;
-use warnings;
-
-# Result code here
-
-__PACKAGE__-&gt;load_components('InflateColumn');
 use DateTime::Format::MySQL;
-
-__PACKAGE__-&gt;<strong>inflate_column</strong>(
+# Result code here
+__PACKAGE__-&gt;load_components('<a href="http://search.cpan.org/perldoc?DBIx::Class::InflateColumn">InflateColumn</a>');
+__PACKAGE__-&gt;<strong><a href="http://search.cpan.org/perldoc?DBIx::Class::InflateColumn#inflate_column">inflate_column</a></strong>(
    <strong>date_published</strong> =&gt; {
-      inflate =&gt; sub { DateTime::Format::MySQL-&gt;parse_date(shift) },
-      deflate =&gt; sub { shift-&gt;ymd},
+      inflate =&gt; sub {
+         DateTime::Format::MySQL-&gt;parse_date(
+            shift
+         )
+      },
+      deflate =&gt; sub { shift-&gt;ymd },
    },
 );
-# Automatic see: DBIx::Class::InflateColumn::DateTime</pre>
+# Automatic see: DBIC::InflateColumn::DateTime</pre>
    </div>
 
    <div class="slide">
-      <h1>Result:: (deflating)</h1>
+      <h1>InflateColumn: deflation</h1>
 <pre>$book-&gt;date_published(DateTime-&gt;now);
 $book-&gt;update;</pre>
    </div>
 
    <div class="slide">
-      <h1>Result:: (inflating)</h1>
-<pre>my $date_published = $book-&gt;date_published;
-print $date_published-&gt;month_abbr;</pre>
+      <h1>InflateColumn: inflation</h1>
+<pre>say $book-&gt;date_published-&gt;month_abbr;</pre>
 
 <strong><em>Nov</em></strong>
    </div>
 
    <div class="slide">
-      <h1>ResultSets::</h1>
-<pre>package Foo::Schema::ResultSet::Books;
-use base 'DBIx::Class::ResultSet';
-sub the_ultimate_books {
-   my $self = shift;
-   return $self-&gt;search({ title =&gt; { -like =&gt; '%42%' } });
-}
-sub by_author {
-   my ( $self, $author ) = @_;
-   return $self-&gt;search({ author =&gt; $author-&gt;id })
-}
-
-1;</pre>
-   </div>
-
-   <div class="slide">
-      <h1>ResultSets::</h1>
-<pre>use Foo::Schema;
-my $schema = Foo::Schema-&gt;connect(...);
-my $book_rs     = Foo::Schema-&gt;resultset('Book');
-my $book_search = $book_rs-&gt;the_ultimate_books;
-my @books       = $book_search-&gt;all;</pre>
-   </div>
-
-   <div class="slide">
-      <h1>ResultSets: Chaining</h1>
-<pre>
-my $book_rs   = $schema-&gt;resultset('Book');
-my $author_rs = $schema-&gt;resultset('Author');
-my $author    = $author_rs-&gt;search({ name =&gt; 'Douglas Adams' })-&gt;single;
-$book_rs      = $book_rs-&gt;the_ultimate_books-&gt;by_author($author);
-my @books     = $book_rs-&gt;all;</pre>
-   </div>
-
-   <div class="slide">
-      <h1>ResultSets: Chaining</h1>
-<pre>$book_rs = $schema-&gt;resultset('Book')
-  -&gt;the_ultimate_books
-  -&gt;by_author($author);</pre>
-or
-
-<pre>my $book_rs = $schema-&gt;resultset('Book')
-  -&gt;the_ultimate_books;
-$book_rs = $book_rs-&gt;by_author($author);</pre>
-<pre># Debug (SQL):
-
-# SELECT me.id, me.title, me.date_published, me.author
-#   FROM books me
-#   WHERE ( ( ( author = ? ) AND ( title LIKE ? ) ) ): '5', '%42%'
-#   WHERE ( ( ( author = ? ) AND ( title LIKE ? ) ) ): '5', '%42%'</pre>
-   </div>
-
-   <div class="slide">
-      <h1>ResultSets: Chaining</h1>
-<pre>my $rs = $book_rs
-  -&gt;category('childrens')
-  -&gt;by_author($author)
-  -&gt;published_after('1812')
-  -&gt;first_page_contains('once upon')
-  -&gt;rating_greater_than(4);
-
-my @books = $rs-&gt;all;</pre>
-   </div>
-
-   <div class="slide">
-      <h1>overloading before new record</h1>
-      <pre>package Foo::Schema::Result::Author;
+      <h1>FilterColumn</h1>
+<pre>package Foo::Schema::Result::Book;
 use base 'DBIx::Class::Core';
+# Result code here
+__PACKAGE__-&gt;load_components('<a href="http://search.cpan.org/perldoc?DBIx::Class::FilterColumn">FilterColumn</a>');
 
-sub new {
-   my ( $class, $attrs ) = @_;
-   # Mess with $attrs
-   my $new = $class-&gt;next::method($attrs);
-   return $new
-}
-
-1;</pre>
-
-   <div class="slide">
-      <h1>Relationships</h1>
-   </div>
-
-   <div class="slide">
-      <h1>Multiple Authors</h1>
-      <p>We want to allow a book to be by more than one author</p>
-   </div>
-
-   <div class="slide">
-      <h1>a few relationships</h1>
-      <img src="img/afewrels.png" />
-   </div>
-
-   <div class="slide">
-      <h1>Join Table</h1>
-<pre>CREATE TABLE author_and_books(
-  book_id    int(8),
-  author_id  int(8),
-  foreign key (book_id)     references books(id),
-  foreign key (author_id)   references authors(id)
-) engine = InnoDB DEFAULT CHARSET=utf8;
-
-ALTER TABLE `books` DROP `author_id`;</pre>
-   </div>
-
-   <div class="slide">
-      <h1>has_many</h1>
-      <img src="img/hasmany1.png" />
-   </div>
-
-   <div class="slide">
-      <h1>has_many</h1>
-<pre>package Foo::Schema::<strong>Result::Book</strong>;
-
-__PACKAGE__-&gt;has_many( author_and_books =&gt;
-   'Foo::Schema::Result::Author_Book', 'book_id'
-);
-   </div>
-
-   <div class="slide">
-      <h1>belongs_to</h1>
-      <img src="img/belongsto1.png" />
-   </div>
-
-   <div class="slide">
-      <h1>belongs_to</h1>
-<pre>package Foo::Schema::<strong>Result::Author_Book</strong>;
-
-__PACKAGE__-&gt;belongs_to(
-   book =&gt;
-   'Foo::Schema::Result::Book', 'book_id'
+__PACKAGE__-&gt;<strong><a href="http://search.cpan.org/perldoc?DBIx::Class::FilterColumn#filter_column">filter_column</a></strong>(
+   <strong>length</strong> =&gt; {
+      to_storage   =&gt; 'to_metric',
+      from_storage =&gt; 'to_imperial',
+   },
 );
-</pre>
-   </div>
-
-   <div class="slide">
-      <h1>same for Authors</h1>
-      <img src="img/authors.png" />
-   </div>
 
-   <div class="slide">
-      <h1>many_to_many</h1>
-      <img src="img/m2m.png" />
+sub to_metric   { $_[1] * .305 }
+sub to_imperial { $_[1] * 3.28 }
    </div>
 
    <div class="slide">
-      <h1>many_to_many</h1>
-      <pre>package Foo::Schema::<strong>Result::Book</strong>;
-use base 'DBIx::Class::Core';
-
-__PACKAGE__-&gt;many_to_many(
-   authors =&gt; 'author_and_books', 'author'
-);
-
-1;
+      <h1><a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSetColumn">ResultSetColumn</a></h1>
+<pre>my $rsc = $schema-&gt;resultset('Book')
+   -&gt;get_column('price');
+$rsc-&gt;first;
+$rsc-&gt;all;
+$rsc-&gt;min;
+$rsc-&gt;max;
+$rsc-&gt;sum;
 </pre>
    </div>
 
    <div class="slide">
-      <h1>many_to_many</h1>
-      <pre>package Foo::Schema::<strong>Result::Book</strong>;
-use base 'DBIx::Class::Core';
-
-__PACKAGE__-&gt;many_to_many(
-   authors <strong># Accessor name</strong>
-   =&gt; "author_and_books", <strong># has_many</strong>
-   'author' <strong># foreign relationship name</strong>
-);
-
-1;</pre>
+      <h1>Aggregates</h1>
+<pre>my @res = $rs-&gt;search({}, {
+   <a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#select">select</a>   =&gt; [
+      'price',
+      'genre',
+      { max =&gt; price },
+      { avg =&gt; price },
+   ],
+   <a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#as">as</a>       =&gt; [
+      qw(price genre max_price avg_price)
+   ],
+   <a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#group_by">group_by</a> =&gt; [qw(price genre)],
+});
+for (@res) {
+   say $_-&gt;price . ' ' . $_-&gt;genre;
+   say $_-&gt;get_column('max_price');
+   say $_-&gt;get_column('min_price');
+}</pre>
    </div>
 
    <div class="slide">
-      <h1>many_to_many</h1>
-      <pre>package Foo::Schema::Result::Author;
-use base 'DBIx::Class::Core';
-
-__PACKAGE__-&gt;many_to_many(
-   "books" <strong># Accessor Name</strong>
-   =&gt; "author_and_books", <strong># has_many accessor_name</strong>
-   'book' <strong># foreign relationship name</strong>
-);
-
-1;
-</pre>
+      <h1>Aggregates Notes</h1>
+      <ul class="incremental">
+         <li>Careful, get_column can basicaly mean THREE things</li>
+         <li>private for get what you should use an accessor for</li>
+         <li>public for what there is no accessor for</li>
+         <li>public for get resultset column (prev slide)</li>
+      </ul>
    </div>
 
    <div class="slide">
-      <h1>Using many_to_many</h1>
-      <pre>#!perl
-use Foo::Schema;
-my $schema    = Foo::Schema-&gt;connect(...);
-my $author_rs = $schema-&gt;resultset('Authors');
-my $author    = $author_rs-&gt;search({
-   name =&gt; 'Douglas Adams',
-})-&gt;single;
-$author-&gt;add_to_books({
-   title =&gt; 'A new book',
+      <h1>HRI</h1>
+<pre>$rs-&gt;search({}, {
+  <a href="http://search.cpan.org/perldoc?DBIx::Class::ResultSet#result_class">result_class</a> =&gt;
+    '<a href="http://search.cpan.org/perldoc?DBIx::Class::ResultClass::HashRefInflator">DBIx::Class::ResultClass::HashRefInflator</a>',
 });</pre>
-   </div>
-
-   <div class="slide">
-      <h1>using many_to_many</h1>
-      <pre>my $author = $author_rs-&gt;search({
-   name =&gt; 'Douglas Adams',
-})-&gt;single;
-<strong>$author-&gt;add_to_books({
-   title =&gt; 'A new book',
-});</strong>
-
-# SELECT me.id, me.name FROM authors me
-#     WHERE ( name = ? ): 'Douglas Adams';
-# INSERT INTO books (title) VALUES (?): 'A new book';
-# INSERT INTO author_and_books (author, book)
-#     VALUES (?, ?): '5', '2';</pre>
-   </div>
-
-   <div class="slide">
-      <h1>using many_to_many</h1>
-      <pre>$author-&gt;add_to_books($book);
-
-$book-&gt;add_to_authors($author_1);
-$book-&gt;add_to_authors($author_2);</pre>
-   </div>
-
-   <div class="slide">
-      <h1>errors</h1>
-      <p>Read them closely!</p>
-   </div>
-
-   <div class="slide">
-      <h1>error messages</h1>
-<pre>DBIx::Class::Schema::Loader::connection(): Failed to load external
-class definition for 'Foo::Schema::Result::Authors': Can't locate object
-method "many_to_many" via package "Foo::Schema::Result::Author" at
-lib/Foo/Schema/Result/Authors.pm line 9.Compilation failed in require at
-/Library/Perl/5.8.8/DBIx/Class/Schema/Loader/Base.pm line 292.</pre>
-   </div>
-
-   <div class="slide">
-      <h1>error messages</h1>
-<pre>DBIx::Class::Schema::Loader::connection(): Failed to load external
-class definition for 'Foo::Schema::Result::Authors': Can't locate object
-method "many_to_many" via package "Foo::Schema::<strong>Result::Author</strong>" at
-lib/Foo/Schema/<strong>Result/Authors.pm</strong> line 9.Compilation failed in require at
-/Library/Perl/5.8.8/DBIx/Class/Schema/Loader/Base.pm line 292.</pre>
-   </div>
-
-   <div class="slide">
-      <h1>errors</h1>
-      <ul>
-         <li>Turn on debugging</li>
-         <li>Read error messages (sometimes useful!)</li>
-         <li>Check field names</li>
-         <li>Check package names</li>
-         <li>Check which database you are connected to (dev/test/live?) - repeat above</li>
+      <ul class="incremental">
+         <li>Easy on memory</li>
+         <li>Mega fast</li>
+         <li>Great for quick debugging</li>
+         <li>Great for performance tuning (we went from 2m to &lt; 3s)</li>
       </ul>
    </div>
 
    <div class="slide">
-      <h1>LOTS more Features</h1>
-      <ul>
-         <li>FilterColumn</li>
-         <li>Transactions</li>
-         <li>HashRefInflator</li>
-         <li>Subqueries</li>
-         <li>ResultSetColumn</li>
-         <li>Aggregate Queries</li>
-      </ul>
-   </div>
+      <h1><a href="http://search.cpan.org/perldoc?DBIx::Class::Manual::Cookbook#Subqueries">Subquery</a> Support</h1>
+<pre>my $inside_query = $schema-&gt;resultset('Artist')
+   -&gt;search({
+    name =&gt; [ 'Billy Joel', 'Brittany Spears' ],
+})-&gt;get_column('id')-&gt;as_query;
 
-   <div class="slide">
-      <h1>bonus slides!</h1>
+my $rs = $schema-&gt;resultset('CD')-&gt;search({
+    artist_id =&gt; { -in =&gt; $inside_query },
+});</pre>
    </div>
 
    <div class="slide">
-      <h1>Template Toolkit</h1>
-      <ul>
-         <li><pre>[% author.books.count %]</pre> not working?</li>
-         <li>TT all methods are called in list context</li>
-         <li><pre>[% author.books<strong>_rs</strong>.count %]</pre> scalar context</li>
-         <li><em>Available for all relationships</em></li>
-      </ul>
+      <h1><a href="http://search.cpan.org/perldoc?SQL::Abstract#Literal_SQL_with_placeholders_and_bind_values_(subqueries)">Bare SQL w/ Placeholders</a></h1>
+<pre>$rs-&gt;update({
+   # !!! SQL INJECTION VECTOR
+   price =&gt; \"price + $inc",
+});
+
+$rs-&gt;update({
+   price =&gt; \['price + ?', [inc =&gt; $inc]],
+});
+</pre>
    </div>
 
    <div class="slide">
-      <h1>Catalyst</h1>
-      <pre>package Your::App::Model::<strong>Foo</strong>;
-use base qw(<strong>Catalyst::Model::Schema::Schema</strong>);
-
-use strict;
-use warnings;
-
-__PACKAGE__-&gt;config(
-  schema_class =&gt; '<strong>Foo::Schema</strong>',
-);
-
-1;</pre>
-   <p>Keep your Schema in a <em>separate</em> package from your Catalyst application</p>
+      <h1>Questions?</h1>
    </div>
 
    <div class="slide">
-      <h1>Catalyst</h1>
-<pre>sub action_name : Local {
-  my ($self, $c) = @_;
-
-  my $schema = $c-&gt;model('Schema::Foo');
-  my $author_rs = $schema-&gt;resultset('Authors');
-
-}
-
-1;</pre>
+      <h1>END</h1>
    </div>
-
 </div>
 </body>
 </html>