consolidate some slides, add some stuff, yay.
[dbsrgits/dbix-class-introduction-presentation.git] / slideshow.html
index 4ea1daf..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,14 +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>Transparrently uses INSERT ... RETURNING for databases that support it</li>
+         <li>Transparently uses INSERT ... RETURNING for databases that support it</li>
       </ul>
    </div>
 
@@ -197,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 '
@@ -213,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;next;
+}, { 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">
@@ -253,11 +248,11 @@ $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>Lazy Update</li>
+         <li>Won't update unless value changes</li>
       </ul>
    </div>
 
@@ -273,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">
@@ -293,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>
 
@@ -324,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>
@@ -335,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},
 });
@@ -344,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(      ...          )],
 );
@@ -366,13 +365,13 @@ 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>
@@ -394,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>
@@ -414,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>
@@ -423,7 +423,7 @@ my $schema = Foo::Schema-&gt;connect($dsn, $user, $pass);
    </div>
 
    <div class="slide">
-      <h1>SQL::Abstract</h1>
+      <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>
@@ -447,25 +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 {
-   $_[0]-&gt;search({
-      rating =&gt; { '&gt;=' =&gt; 4 },
+   my $self = shift;
+   $self-&gt;search({
+      $self-&gt;current_source_alias .
+         '.rating' =&gt; { '&gt;=' =&gt; 4 },
    })
 };
 sub cheap {
-   $_[0]-&gt;search({
-      price =&gt; { '&lt;=' =&gt; 5}
+   my $self = shift;
+   $self-&gt;search({
+      $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>
 
@@ -485,33 +494,32 @@ sub cheap {
 
    <div class="slide">
       <h1>search_related</h1>
-<pre>my @test_rs = ($schema-&gt;resultset('User')-&gt;search({'me.userid' =&gt; 'marial'})
-   -&gt;related_resultset('access')
+<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;search({'orders.reporttype' =&gt; 0})
-   -&gt;related_resultset('shops')-&gt;search({'shops.status' =&gt; 'Completed', 'shops.datecompleted' =&gt; {-between =&gt; ['2009-10-01','2009-10-08']}})
-   -&gt;related_resultset('rpt_score')-&gt;get_column('raw_scores')-&gt;first);
+   -&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>related_resultset</h1>
-<pre>my @screens = $user-&gt;roles
-   -&gt;related_resultset('role_permissions')
-   -&gt;related_resultset('permission')
-   -&gt;related_resultset('permission_screens')
-   -&gt;related_resultset('screen')
-   -&gt;search(undef, { distinct =&gt; 1 })-&gt;all;</pre>
-   </div>
-
-   <div class="slide">
       <h1>bonus rel methods</h1>
-<pre>my $book = $author-&gt;create_related(
-  <strong>books</strong> =&gt; {
-   title =&gt; 'Another Discworld book',
-});
+<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',
+   }
+);
 
-my $book2 = $pratchett-&gt;add_to_<strong>books</strong>({
+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">
@@ -521,17 +529,17 @@ my $book2 = $pratchett-&gt;add_to_<strong>books</strong>({
 
    <div class="slide">
       <h1>Excellent Transaction Support</h1>
-<pre>$schema-&gt;txn_do(sub {
+<pre>$schema-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema#txn_do">txn_do</a>(sub {
    ...
 });
 
-my $guard = $schema-&gt;txn_scope_guard;
+my $guard = $schema-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema#txn_scope_guard">txn_scope_guard</a>;
 # ...
 $guard-&gt;commit;
 
-$schema-&gt;txn_begin; # &lt;-- low level
+$schema-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema#txn_begin">txn_begin</a>; # &lt;-- low level
 # ...
-$schema-&gt;txn_commit;
+$schema-&gt;<a href="http://search.cpan.org/perldoc?DBIx::Class::Schema#txn_commit">txn_commit</a>;
 </pre>
    </div>
 
@@ -539,16 +547,20 @@ $schema-&gt;txn_commit;
       <h1>InflateColumn</h1>
 <pre>package Foo::Schema::Result::Book;
 use base 'DBIx::Class::Core';
-# 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">
@@ -559,8 +571,7 @@ $book-&gt;update;</pre>
 
    <div class="slide">
       <h1>InflateColumn: inflation</h1>
-<pre>my $date_published = $book-&gt;date_published;
-print $date_published-&gt;month_abbr;</pre>
+<pre>say $book-&gt;date_published-&gt;month_abbr;</pre>
 
 <strong><em>Nov</em></strong>
    </div>
@@ -570,9 +581,9 @@ print $date_published-&gt;month_abbr;</pre>
 <pre>package Foo::Schema::Result::Book;
 use base 'DBIx::Class::Core';
 # Result code here
-__PACKAGE__-&gt;load_components('FilterColumn');
+__PACKAGE__-&gt;load_components('<a href="http://search.cpan.org/perldoc?DBIx::Class::FilterColumn">FilterColumn</a>');
 
-__PACKAGE__-&gt;<strong>filter_column</strong>(
+__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',
@@ -581,12 +592,14 @@ __PACKAGE__-&gt;<strong>filter_column</strong>(
 
 sub to_metric   { $_[1] * .305 }
 sub to_imperial { $_[1] * 3.28 }
-# Automatic see: DBIx::Class::InflateColumn::DateTime</pre>
    </div>
 
    <div class="slide">
-      <h1>ResultSetColumn</h1>
-<pre>my $rsc = $schema-&gt;resultset('Book')-&gt;get_column('price');
+      <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;
@@ -596,15 +609,26 @@ $rsc-&gt;sum;
    <div class="slide">
       <h1>Aggregates</h1>
 <pre>my @res = $rs-&gt;search({}, {
-   select   =&gt; [qw(price genre), { max =&gt; price }, { avg =&gt; price }],
-   as       =&gt; [qw(price genre max_price avg_price)],
-   group_by =&gt; [qw(price genre)],
+   <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>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>
@@ -616,7 +640,8 @@ for (@res) {
    <div class="slide">
       <h1>HRI</h1>
 <pre>$rs-&gt;search({}, {
-   result_class =&gt; 'DBIx::Class::ResultClass::HashRefInflator',
+  <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>
       <ul class="incremental">
          <li>Easy on memory</li>
@@ -627,20 +652,22 @@ for (@res) {
    </div>
 
    <div class="slide">
-      <h1>Subquery Support</h1>
-<pre>  my $inside_rs = $schema-&gt;resultset('Artist')-&gt;search({
+      <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;
 
 my $rs = $schema-&gt;resultset('CD')-&gt;search({
-    artist_id =&gt; { -in =&gt; $inside_rs-&gt;get_column('id')-&gt;as_query },
+    artist_id =&gt; { -in =&gt; $inside_query },
 });</pre>
    </div>
 
    <div class="slide">
-      <h1>Bare SQL w/ Placeholders</h1>
+      <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({
-   price =&gt; \"price + $inc", # !!! SQL INJECTION VECTOR
+   # !!! SQL INJECTION VECTOR
+   price =&gt; \"price + $inc",
 });
 
 $rs-&gt;update({