sub makesql
{
my $self = shift;
$self->queryparams(@_);
my $defop;
my $numlinks;
my @where = ();
my $alesql = $self->{_alesql};
my $links_table = $alesql->links_table();
my $words_table = $alesql->words_table();
my $urls_table = $alesql->urls_table();
# Find out how many links we have. for(my $i=0;$i<10;$i++)
{
if ($self->{query}{link}[$i])
{
$numlinks=$i;
}
}
if (!$numlinks)
{
$numlinks=1;
}
$self->{numlinks}=$numlinks;
if ($self->{query}{sqlmatch})
{
$defop = 'LIKE';
}
elsif ($self->{query}{regexp_match})
{
$defop = 'RLIKE';
}
else
{
$defop = '=';
}
my $numurls=$numlinks+1;
$self->{sqlpart}{sel} = "SELECT ".
join(", ",
"url1.urlid AS from_id",
"url1.url AS from_url",
(map { ("url$_.urlid AS url${_}_id", "url$_.url AS url${_}_url") } (2..($numurls-1))),
(map { ("link$_.link_text AS link${_}_text","link$_.linkid AS link${_}_id") } (1..$numlinks)),
"url$numurls.urlid AS to_id",
"url$numurls.url AS to_url",
);
# $self->{sqlpart}{sel} = 'SELECT source_url.docid AS source_docid, source_url.url AS source_url, dest_url.docid AS dest_docid, dest_url.url AS dest_url, link_num, type, text AS text';
if ($self->{query}{limit})
{
$self->{sqlpart}{limit} = "\tLIMIT ".$self->{query}{limit};
}
$self->{sqlpart}{from} = "FROM ";
if (($self->{query}{word}&&@{$self->{query}{word}[1]})||($self->{query}{word}&&@{$self->{query}{noword}[1]}))
{
$self->{sqlpart}{from} .= "$words_table AS word1, ";
push(@where,"word1.linkid = link1.linkid");
my $numwords;
my @words = ();
if ($self->{query}{word})
{
$numwords += scalar(@{$self->{query}{word}[1]});
}
if ($self->{query}{noword})
{
$numwords += scalar(@{$self->{query}{noword}[1]});
}
for(my $count=1;$count<$numwords;$count++)
{
my $let = chr(ord('a')+$count);
$self->{sqlpart}{from} .= " $words_table AS word1$let, ";
push(@where,"word1$let.linkid = word1.linkid");
}
}
$self->{sqlpart}{from} .=
" $links_table AS link1"
. ", $urls_table AS url1"
. ", $urls_table AS url2";
push(@where,"link1.link_from = url1.urlid");
push(@where,"link1.link_to = url2.urlid");
if ($numlinks > 1)
{
$self->{sqlpart}{from} .= "\n,".join(",\n",
map { my $urlnum=$_+1;
((@{$self->{query}{word}[$_]}||@{$self->{query}{noword}[$_]})
? "$words_table AS word$_ NATURAL LEFT JOIN "
: ""
) . "$links_table AS link$_ LEFT JOIN $urls_table AS url$urlnum ON link$_.link_to = url$urlnum.urlid" }
(2..$numlinks));
}
$self->{sqlpart}{where} =
"\tWHERE (".
join(")\n\t AND (",
@where,
# Make sure specified query requirements are satisfied. (map { my $linknum=$_;
(
(map { $self->onewhere('',$self->colname($_,$linknum),$defop,@{$self->{query}{$_}[$linknum]}); } qw(source_url dest_url text word)),
(map { $self->onewhere('NOT',$self->colname(nono($_),$linknum),$defop,@{$self->{query}{$_}[$linknum]}) } qw(no_source_url no_dest_url no_text no_word)),
(map { $self->onewhere('',$self->colname($_,$linknum),'IS NOT NULL',map { '' } @{$self->{query}{$_}[$linknum]}) } qw(source_cached dest_cached)),
(map { $self->onewhere('',$self->colname(nono($_),$linknum),'IS NULL',map { '' } @{$self->{query}{$_}[$linknum]}) } qw(source_not_cached dest_not_cached)),
),
} (1..$numlinks)),
# And join all of the links together properly. (map { "link".($_-1).".link_to = link$_.link_from" } (2..$numlinks)),
) . ")";
if ($self->{sqlpart}{where} eq "\tWHERE ()")
{
$self->{sqlpart}{where} = '';
}
$self->{sql} = join("\n",map { $self->{sqlpart}{$_} or ''} qw(sel from where limit));
$self->{sql};} |