Skip to content

Commit

Permalink
Merge 'trunk' into 'replication_dedux'
Browse files Browse the repository at this point in the history
r13529@dev (orig r4456):  castaway | 2008-06-02 13:46:12 -0500
I suck, should read code while doccing it, not assume someone else got it right!

r13584@dev (orig r4462):  ash | 2008-06-03 11:11:25 -0500
Remove the length limit on identifiers - it doesn't belong in DBIx::Class
A few doc fixes
r13585@dev (orig r4463):  ash | 2008-06-03 13:15:27 -0500
Remove Digest::SHA1 dep too
  • Loading branch information
jjn1056 committed Jun 4, 2008
2 parents 4fafa77 + 67325d9 commit f71a92a
Show file tree
Hide file tree
Showing 8 changed files with 41 additions and 171 deletions.
1 change: 0 additions & 1 deletion Makefile.PL
Expand Up @@ -22,7 +22,6 @@ requires 'Class::Inspector' => 0;
requires 'Class::Accessor::Grouped' => 0.05002;
requires 'JSON::Any' => 1.00;
requires 'Scope::Guard' => 0.03;
requires 'Digest::SHA1' => 2.00;
requires 'Path::Class' => 0;
requires 'List::Util' => 1.19;

Expand Down
25 changes: 14 additions & 11 deletions lib/DBIx/Class/Relationship.pm
Expand Up @@ -222,12 +222,13 @@ methods and valid relationship attributes.
=back
Creates a one-to-many relationship, where the corresponding elements of the
foreign class store the calling class's primary key in one (or more) of its
columns. This relationship defaults to using C<$accessor_name> as the foreign
key in C<$related_class> to resolve the join, unless C<$foreign_key_column>
specifies the foreign key column in C<$related_class> or C<cond> specifies a
reference to a join condition hash.
Creates a one-to-many relationship, where the corresponding elements
of the foreign class store the calling class's primary key in one (or
more) of its columns. This relationship defaults to using the end of
this classes namespace as the foreign key in C<$related_class> to
resolve the join, unless C<$foreign_key_column> specifies the foreign
key column in C<$related_class> or C<cond> specifies a reference to a
join condition hash.
=over
Expand Down Expand Up @@ -273,25 +274,27 @@ OR condition.
=back
# in an Author class (where Author has_many Books)
# assuming related class is storing our PK in "author_id"
My::DBIC::Schema::Author->has_many(
books =>
'My::DBIC::Schema::Book',
'author_id'
);
# OR (same result, assuming related_class is storing our PK)
# OR (same result)
My::DBIC::Schema::Author->has_many(
books =>
'My::DBIC::Schema::Book',
{ 'foreign.author_id' => 'self.id' },
);
# OR (same result)
# OR (similar result, assuming related_class is storing our PK, in "author")
# (the "author" is guessed at from "Author" in the class namespace)
My::DBIC::Schema::Author->has_many(
books =>
'My::DBIC::Schema::Book',
{ 'foreign.author_id' => 'self.id' },
);
# Usage
# resultset of Books belonging to author
Expand Down
22 changes: 18 additions & 4 deletions lib/DBIx/Class/ResultSet.pm
Expand Up @@ -2435,13 +2435,27 @@ C<cd> or C<artist> relationships, which saves us two SQL statements in this
case.
Simple prefetches will be joined automatically, so there is no need
for a C<join> attribute in the above search. If you're prefetching to
depth (e.g. { cd => { artist => 'label' } or similar), you'll need to
specify the join as well.
for a C<join> attribute in the above search.
C<prefetch> can be used with the following relationship types: C<belongs_to>,
C<has_one> (or if you're using C<add_relationship>, any relationship declared
with an accessor type of 'single' or 'filter').
with an accessor type of 'single' or 'filter'). A more complex example that
prefetches an artists cds, the tracks on those cds, and the tags associted
with that artist is given below (assuming many-to-many from artists to tags):
my $rs = $schema->resultset('Artist')->search(
undef,
{
prefetch => [
{ cds => 'tracks' },
{ artist_tags => 'tags' }
]
}
);
B<NOTE:> If you specify a C<prefetch> attribute, the C<join> and C<select>
attributes will be ignored.
=head2 page
Expand Down
36 changes: 3 additions & 33 deletions lib/SQL/Translator/Parser/DBIx/Class.pm
Expand Up @@ -14,7 +14,6 @@ $DEBUG = 0 unless defined $DEBUG;

use Exporter;
use Data::Dumper;
use Digest::SHA1 qw( sha1_hex );
use SQL::Translator::Utils qw(debug normalize_name);

use base qw(Exporter);
Expand Down Expand Up @@ -101,7 +100,7 @@ sub parse {
if (!$source->compare_relationship_keys($unique_constraints{$uniq}, \@primary)) {
$table->add_constraint(
type => 'unique',
name => _create_unique_symbol($uniq),
name => $uniq,
fields => $unique_constraints{$uniq}
);
}
Expand Down Expand Up @@ -169,9 +168,7 @@ sub parse {
if (scalar(@keys)) {
$table->add_constraint(
type => 'foreign_key',
name => _create_unique_symbol($table->name
. '_fk_'
. join('_', @keys)),
name => join('_', $table->name, 'fk', @keys),
fields => \@keys,
reference_fields => \@refkeys,
reference_table => $rel_table,
Expand All @@ -181,7 +178,7 @@ sub parse {
);

my $index = $table->add_index(
name => _create_unique_symbol(join('_', $table->name, 'idx', @keys)),
name => join('_', $table->name, 'idx', @keys),
fields => \@keys,
type => 'NORMAL',
);
Expand All @@ -201,31 +198,4 @@ sub parse {
return 1;
}

# TODO - is there a reasonable way to pass configuration?
# Default of 64 comes from mysql's limit.
our $MAX_SYMBOL_LENGTH ||= 64;
our $COLLISION_TAG_LENGTH ||= 8;

# -------------------------------------------------------------------
# $resolved_name = _create_unique_symbol($desired_name)
#
# If desired_name is really long, it will be truncated in a way that
# has a high probability of leaving it unique.
# -------------------------------------------------------------------
sub _create_unique_symbol {
my $desired_name = shift;
return $desired_name if length $desired_name <= $MAX_SYMBOL_LENGTH;

my $truncated_name = substr $desired_name, 0, $MAX_SYMBOL_LENGTH - $COLLISION_TAG_LENGTH - 1;

# Hex isn't the most space-efficient, but it skirts around allowed
# charset issues
my $digest = sha1_hex($desired_name);
my $collision_tag = substr $digest, 0, $COLLISION_TAG_LENGTH;

return $truncated_name
. '_'
. $collision_tag;
}

1;
5 changes: 3 additions & 2 deletions t/71mysql.t
Expand Up @@ -86,8 +86,9 @@ SKIP: {
}

## Can we properly deal with the null search problem?

use Data::Dump qw/dump/;
##
## Only way is to do a SET SQL_AUTO_IS_NULL = 0; on connect
## But I'm not sure if we should do this or not (Ash, 2008/06/03)

NULLINSEARCH: {

Expand Down
55 changes: 2 additions & 53 deletions t/86sqlt.t
Expand Up @@ -10,7 +10,7 @@ plan skip_all => 'SQL::Translator required' if $@;

my $schema = DBICTest->init_schema;

plan tests => 160;
plan tests => 131;

my $translator = SQL::Translator->new(
parser_args => {
Expand Down Expand Up @@ -203,35 +203,6 @@ my %fk_constraints = (
},
],

# LongColumns
long_columns => [
{
'display' => 'long_columns->owner',
'name' => 'long_columns_fk__64_character_column_aaaaaaaaaaaaaaaaaa_cfc8d5b0',
'index_name' => 'long_columns_idx__64_character_column_aaaaaaaaaaaaaaaaa_5050aa42',
'selftable' => 'long_columns', 'foreigntable' => 'long_columns',
'selfcols' => ['_64_character_column_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'],
'foreigncols' => ['lcid'],
on_delete => '', on_update => '', deferrable => 1,
},
{
'display' => 'long_columns->owner2',
'name' => 'long_columns_fk__32_character_column_bbbbbbbbbbb__32_ch_b7ee284e',
'index_name' => 'long_columns_idx__32_character_column_bbbbbbbbbbb__32_c_82bf6e69',
'selftable' => 'long_columns', 'foreigntable' => 'long_columns',
'selfcols' => ['_32_character_column_bbbbbbbbbbb', '_32_character_column_aaaaaaaaaaa'],
'foreigncols' => ['_32_character_column_aaaaaaaaaaa', '_32_character_column_bbbbbbbbbbb'],
on_delete => '', on_update => '', deferrable => 1,
},
{
'display' => 'long_columns->owner3',
'name' => 'long_columns_fk__16_chars_column',
'index_name' => 'long_columns_idx__16_chars_column',
'selftable' => 'long_columns', 'foreigntable' => 'long_columns',
'selfcols' => ['_16_chars_column'], 'foreigncols' => ['_8_chr_c'],
on_delete => '', on_update => '', deferrable => 1,
},
],
);

my %unique_constraints = (
Expand All @@ -253,29 +224,6 @@ my %unique_constraints = (
},
],

long_columns => [
{
'display' => 'long but not quite truncated unique',
'name' => 'long_columns__16_chars_column__32_character_column_aaaaaaaaaaa',
'table' => 'long_columns', 'cols' => [qw( _32_character_column_aaaaaaaaaaa _16_chars_column )],
},
{
'display' => 'multi column truncated unique',
'name' => 'long_columns__8_chr_c__16_chars_column__32_character_co_004ce318',
'table' => 'long_columns', 'cols' => [qw( _32_character_column_aaaaaaaaaaa _16_chars_column _8_chr_c )],
},
{
'display' => 'different multi column truncated unique with same base',
'name' => 'long_columns__8_chr_c__16_chars_column__32_character_co_25773323',
'table' => 'long_columns', 'cols' => [qw( _32_character_column_bbbbbbbbbbb _16_chars_column _8_chr_c )],
},
{
'display' => 'single column truncated unique',
'name' => 'long_columns__64_character_column_aaaaaaaaaaaaaaaaaaaaa_0acf5172',
'table' => 'long_columns', 'cols' => ['_64_character_column_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'],
},
],

# TwoKeyTreeLike
twokeytreelike => [
{
Expand Down Expand Up @@ -364,6 +312,7 @@ sub get_constraint {
my %fields = map { $_ => 1 } @$cols;
my %f_fields = map { $_ => 1 } @$f_cols;

die "No $table_name" unless $table;
CONSTRAINT:
for my $constraint ( $table->get_constraints ) {
next unless $constraint->type eq $type;
Expand Down
4 changes: 1 addition & 3 deletions t/lib/DBICTest/Schema.pm
Expand Up @@ -36,10 +36,8 @@ __PACKAGE__->load_classes(qw/
'CD_to_Producer',
),
qw/SelfRefAlias TreeLike TwoKeyTreeLike Event EventTZ NoPrimaryKey/,
qw/Collection CollectionObject TypedObject/,
qw/Owners BooksInLibrary/,
qw/Collection CollectionObject TypedObject Owners BooksInLibrary/,
qw/ForceForeign/,
qw/LongColumns/,
);

sub sqlt_deploy_hook {
Expand Down
64 changes: 0 additions & 64 deletions t/lib/DBICTest/Schema/LongColumns.pm

This file was deleted.

0 comments on commit f71a92a

Please sign in to comment.