# NAME

DBIx::Class::Helper::TableSample - Add support for tablesample clauses

# VERSION

version v0.2.0

# SYNOPSIS

In a resultset:

```perl
package MyApp::Schema::ResultSet::Wobbles;

use base qw/DBIx::Class::ResultSet/;

__PACKAGE__->load_components( qw/
   Helper::TableSample
/);
```

Using the resultset:

```perl
my $rs = $schema->resultset('Wobbles')->search_rs(
 undef,
 {
   columns     => [qw/ id name /],
   tablesample => {
     type     => 'system',
     fraction => 0.5,
   },
 }
);
```

This generates the SQL

```
SELECT me.id FROM artist me TABLESAMPLE SYSTEM (0.5)
```

# DESCRIPTION

This helper adds rudimentary support for tablesample queries
to [DBIx::Class](https://metacpan.org/pod/DBIx::Class) resultsets.

The `tablesample` key supports the following options as a hash
reference:

- `fraction`

   This is the percentage or fraction of the table to sample,
   between 0 and 100, or a numeric expression that returns
   such a value.

   (Some databases may restrict this to an integer.)

   The value is not checked by this helper, so you can use
   database-specific extensions, e.g. `1000 ROWS` or `15 PERCENT`.

   Scalar references are dereferenced, and expressions or
   database-specific extensions should be specified has scalar
   references, e.g.

   ```perl
   my $rs = $schema->resultset('Wobbles')->search_rs(
     undef,
     {
       columns     => [qw/ id name /],
       tablesample => {
         fraction => \ "1000 ROWS",
       },
     }
   );
   ```

- `type`

   By default, there is no sampling type., e.g. you can simply use:

   ```perl
   my $rs = $schema->resultset('Wobbles')->search_rs(
     undef,
     {
       columns     => [qw/ id name /],
       tablesample => 5,
     }
   );
   ```

   as an equivalent of

   ```perl
   my $rs = $schema->resultset('Wobbles')->search_rs(
     undef,
     {
       columns     => [qw/ id name /],
       tablesample => { fraction => 5 },
     }
   );
   ```

   to generate

   ```
   SELECT me.id FROM artist me TABLESAMPLE (5)
   ```

   If your database supports or requires a type, you can specify it,
   e.g. `system` or `bernoulli`.

   See your database documentation for the allowable types.

- `repeatable`

   If this key is specified, then it will add a REPEATABLE clause,
   e.g.

   ```perl
   my $rs = $schema->resultset('Wobbles')->search_rs(
     undef,
     {
       columns     => [qw/ id name /],
       tablesample => {
         fraction   => 5,
         repeatable => 123456,
       },
     }
   );
   ```

   to generate

   ```
   SELECT me.id FROM artist me TABLESAMPLE (5) REPEATABLE (123456)
   ```

   Scalar references are dereferenced, and expressions or
   database-specific extensions should be specified has scalar
   references.

Resultsets with joins or inner queries are not supported.

# CAVEATS

This module is experimental.

Not all databases support table sampling, and thoser that do may have
different restrictions.  You should consult your database
documentation.

# SEE ALSO

[DBIx::Class](https://metacpan.org/pod/DBIx::Class)

# SOURCE

The development version is on github at [https://github.com/robrwo/-DBIX-Class-Helper-TableSample](https://github.com/robrwo/-DBIX-Class-Helper-TableSample)
and may be cloned from [git://github.com/robrwo/-DBIX-Class-Helper-TableSample.git](git://github.com/robrwo/-DBIX-Class-Helper-TableSample.git)

# BUGS

Please report any bugs or feature requests on the bugtracker website
[https://github.com/robrwo/-DBIX-Class-Helper-TableSample/issues](https://github.com/robrwo/-DBIX-Class-Helper-TableSample/issues)

When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.

# AUTHOR

Robert Rothenberg <[email protected]>

The initial development of this module was sponsored by Science Photo
Library [https://www.sciencephoto.com](https://www.sciencephoto.com).

# COPYRIGHT AND LICENSE

This software is Copyright (c) 2019 by Robert Rothenberg.

This is free software, licensed under:

```
The Artistic License 2.0 (GPL Compatible)
```