
[![Travis Build Status](https://travis-ci.org/Corion/sql-type-guess.svg?branch=master)](https://travis-ci.org/corion/sql-type-guess)
[![appveyor build status](https://ci.appveyor.com/api/projects/status/github/corion/sql-type-guess?branch=master&svg=true)](https://ci.appveyor.com/project/corion/sql-type-guess)

# NAME

SQL::Type::Guess - guess an appropriate column type for a set of data

# SYNOPSIS

    my @data=(
      { seen => 1, when => '20140401', greeting => 'Hello', value => '1.05'  },
      { seen => 0, when => '20140402', greeting => 'World', value => '99.05' },
      { seen => 0, when => '20140402', greeting => 'World', value => '9.005' },
    );

    my $g= SQL::Type::Guess->new();
    $g->guess( @data );

    print $g->as_sql( table => 'test' );
    # create table test (
    #    "seen" decimal(1,0),
    #    "greeting" varchar(5),
    #    "value" decimal(5,3),
    #    "when" date
    # )

# METHODS

## `SQL:::Type::Guess->new( %OPTIONS )`

    my $g= SQL::Type::Guess->new();

Creates a new `SQL::Type::Guess` instance. The following options are
supported:

- **column\_type**

    Hashref of already known column types.

- **column\_map**

    Hashref mapping the combinations SQL type names
    to the resulting type name.

## `$g->column_type`

    $g->guess({ foo => 1, bar => 'Hello' },{ foo => 1000, bar => 'World' });
    print $g->column_type->{ 'foo' } # decimal(4,0)

Returns a hashref containing the SQL types to store all
values in the columns seen so far.

## `$g->column_map`

Returns the hashref used for the type transitions. The current
transitions used for generalizing data are:

    date -> decimal -> varchar

This is not entirely safe, as `2014-01-01` can't be safely
loaded into an `decimal` column, but assuming your data is representative
of the data to be stored that shouldn't be much of an issue.

## `$g->guess_data_type $OLD_TYPE, @VALUES`

    $type= $g->guess_data_type( $type, 1,2,3,undef,'Hello','World', );

Returns the data type that encompasses the already established data type in `$type`
and the new values as passed in via `@values`.

If there is no preexisting data type, `$type` can be `undef` or the empty string.

## `$g->guess( @RECORDS )`

    my @data= (
        { rownum => 1, name => 'John Smith', street => 'Nowhere Road', birthday => '1996-01-01' },
        { rownum => 2, name => 'John Doe', street => 'Anywhere Plaza', birthday => '1904-01-01' },
        { rownum => 3, name => 'John Bull', street => 'Everywhere Street', birthday => '2001-09-01' },
    );
    $g->guess( @data );

Modifies the data types for the keys in the given hash.

## `$g->as_sql %OPTIONS`

    print $g->as_sql();

Returns an SQL string that describes the data seen so far.

Options:

- **user**

    Supply a username for the table

- **columns**

    This allows you to specify the columns and their order. The default
    is alphabetical order of the columns.

# BUG TRACKER

Please report bugs in this module via the RT CPAN bug queue at
[https://rt.cpan.org/Public/Dist/Display.html?Name=SQL-Type-Guess](https://rt.cpan.org/Public/Dist/Display.html?Name=SQL-Type-Guess)
or via mail to [sql-type-guess-Bugs@rt.cpan.org](https://metacpan.org/pod/sql-type-guess-Bugs%40rt.cpan.org).

# AUTHOR

Max Maischein `corion@cpan.org`

# COPYRIGHT (c)

Copyright 2014-2018 by Max Maischein `corion@cpan.org`.

# LICENSE

This module is released under the same terms as Perl itself.
