The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Bio::ConnectDots::DotQuery::InnerCt;
use vars qw(@ISA @AUTO_ATTRIBUTES @OTHER_ATTRIBUTES %SYNONYMS %DEFAULTS);
use strict;
use DBI;
use Class::AutoClass;
use Bio::ConnectDots::Util;
use Bio::ConnectDots::DotQuery;
use Bio::ConnectDots::DotQuery::CtMixin;
@ISA = qw(Bio::ConnectDots::DotQuery Bio::ConnectDots::DotQuery::CtMixin);

@AUTO_ATTRIBUTES=qw();
%SYNONYMS=();
@OTHER_ATTRIBUTES=qw();
%DEFAULTS=();
Class::AutoClass::declare(__PACKAGE__);

sub _init_self {
  my($self,$class,$args)=@_;
  return unless $class eq __PACKAGE__; # to prevent subclasses from re-running this
  $self->execute if $args->execute;
}

sub db_execute {
  my($self)=@_;
  my $db=$self->db;
  $self->throw("Cannot run query: database is not connected") unless $db->is_connected;
  $self->throw("Cannot run query: database does not exist") unless $db->exists;
  my $name=$self->name;
  my $preview = $self->dottable->preview;
	my $plimit = $self->dottable->preview_limit;

  my(@targets,@columns,@where);
	my $subselect = $self->input." AS ct";
	$subselect = "(SELECT * FROM ". $self->input ." LIMIT $plimit) AS ct" if $preview;
  my @tables=($subselect);
  my $i=0;
  for my $output (@{$self->outputs}) {
    my($output_name,$column,$cs_id,$label_id)=$output->get(qw(output_name column cs_id label_id));
    my $cd="cd$i";
    push(@targets,"$cd.id AS $output_name");
    push(@columns,$output_name);
		my $subselect = "connectdot AS cd$i";		
		$subselect = "(SELECT * FROM connectdot WHERE connectorset_id=$cs_id AND label_id=$label_id LIMIT $plimit) AS cd$i" if $preview;
    push(@tables,$subselect);
    push(@where,("ct.$column=$cd.connector_id",
		 "$cd.connectorset_id=$cs_id",
		 "$cd.label_id=$label_id"));
    $i++;
  }
  for my $constraint (@{$self->constraints}) {
    my $cd="cd$i";
    my($column,$cs_id)=($constraint->column,$constraint->cs_id);
    push(@tables,"connectdot AS $cd");
    push(@where,("ct.$column=$cd.connector_id",
		 $self->constraint_where($constraint,$cs_id,$cd)));
    $i++;
  }
  my $targets=join(', ',@targets);
  my $from=join(', ',@tables);
  my $where=join(' AND ',@where);
  my $sql="SELECT DISTINCT $targets FROM $from WHERE $where";
  $db->create_table_sql($name,$sql,\@columns)
}


1;