SQL-Engine

 view release on metacpan or  search on metacpan

lib/SQL/Engine/Grammar.pm  view on Meta::CPAN

  push @$sql, sprintf('(%s)', $self->name($data->{source}{column}));

  # references
  push @$sql, $self->term('references');

  # foreign table and column name
  push @$sql, sprintf('%s (%s)', $self->table($data->{target}),
    $self->name($data->{target}{column}));

  # reference option (on delete)
  if ($data->{on}{delete}) {
    push @$sql, $self->term(qw(on delete)),
      $self->constraint_option($data->{on}{delete});
  }

  # reference option (on update)
  if ($data->{on}{update}) {
    push @$sql, $self->term(qw(on update)),
      $self->constraint_option($data->{on}{update});
  }

  # sql statement
  my $result = join ' ', @$sql;

  return $self->operation($result);
}

method constraint_drop(HashRef $data) {
  my $sql = [];

  # alter table
  push @$sql, $self->term(qw(alter table));

  # safe
  push @$sql, $self->term(qw(if exists)) if $data->{safe};

  # table name
  push @$sql, $self->table($data->{source});

  # drop constraint
  push @$sql, $self->term(qw(drop constraint));

  # constraint name
  push @$sql, $self->name($self->constraint_name($data));

  # sql statement
  my $result = join ' ', @$sql;

  return $self->operation($result);
}

method constraint_name(HashRef $data) {

  return $data->{name} || join('_', 'foreign',
    join('_', grep {defined} @{$data->{source}}{qw(schema table column)}),
    join('_', grep {defined} @{$data->{target}}{qw(schema table column)})
  );
}

method constraint_option(Str $name) {
  if (lc($name) eq "cascade") {
    return $self->term('cascade');
  }
  elsif (lc($name) eq "no-action") {
    return $self->term(qw(no action));
  }
  elsif (lc($name) eq "restrict") {
    return $self->term('restrict');
  }
  elsif (lc($name) eq "set-default") {
    return $self->term(qw(set default));
  }
  elsif (lc($name) eq "set-null") {
    return $self->term(qw(set null));
  }
  else {
    return $self->term(qw(no action));
  }
}

method criteria(ArrayRef $data) {

  return [map $self->criterion($_), @$data];
}

method criterion(HashRef $data) {
  if (my $cond = $data->{"and"}) {
    return sprintf('(%s)',
      join(sprintf(' %s ', $self->term('and')), @{$self->criteria($cond)}));
  }

  if (my $cond = $data->{"eq"}) {
    return sprintf '%s = %s', map $self->expression($_), @$cond;
  }

  if (my $cond = $data->{"glob"}) {
    return sprintf '%s %s %s', $self->expression($cond->[0]),
      $self->term('glob'), $self->expression($cond->[1]);
  }

  if (my $cond = $data->{"gt"}) {
    return sprintf '%s > %s', map $self->expression($_), @$cond;
  }

  if (my $cond = $data->{"gte"}) {
    return sprintf '%s >= %s', map $self->expression($_), @$cond;
  }

  if (my $cond = $data->{"in"}) {
    return sprintf '%s %s %s', $self->expression($cond->[0]),
      $self->term('in'), join ', ', map $self->expression($_),
      @$cond[1 .. $#$cond];
  }

  if (my $cond = $data->{"is"}) {
    return sprintf '(%s)',
      (ref($cond) eq 'HASH')
        ? $self->expression($cond)
        : join(sprintf(' %s ', $self->term('and')), @{$self->criteria($cond)});
  }

  if (my $cond = $data->{"is-null"}) {



( run in 2.299 seconds using v1.01-cache-2.11-cpan-13bb782fe5a )