#!/usr/bin/perl

#Subroutine to transform RA to SQL
sub transform {
	my $param = $_[0];
        my $full = $_[1];
        my $rename = $_[2];
	SWITCH: for ($param->{type}) {
                /intersection/ && do {
                	$result = "(" . transform($param->{left}, 1, 0)
                        	. " INTERSECT " . transform($param->{right}, 1, 0) . ")";
                        $result = $result . needfulRename() if ! $rename;
                        last;
                };
                /union/ && do {
                	$result = "(" . transform($param->{left}, 1, 0)
                        	. " UNION " . transform($param->{right}, 1, 0) . ")";
                        $result = $result . needfulRename() if ! $rename;
                        last;
                };
                /set_difference/ && do {
                	$result = "(" . transform($param->{left}, 1, 0)
                        	. " EXCEPT " . transform($param->{right}, 1, 0) . ")";
                        $result = $result . needfulRename() if ! $rename;
                        last;
                };
                /natural_join/ && do {
                	$result = "(SELECT * FROM " . transform($param->{left}, 0, 0)
                        	. " NATURAL JOIN " . transform($param->{right}, 0, 0) . ")";
                        $result = $result . needfulRename() if ! $rename;
                        last;
                };
                /left_join/ && do {
                	$result = "(SELECT * FROM " . transform($param->{left}, 0, 0)
                        	. " NATURAL LEFT JOIN " . transform($param->{right}, 0, 0) . ")";
                        $result = $result . needfulRename() if ! $rename;
                        last;
                };
                /right_join/ && do {
                	$result = "(SELECT * FROM " . transform($param->{left}, 0, 0)
                        	. " NATURAL RIGHT JOIN " . transform($param->{right}, 0, 0) . ")";
                        $result = $result . needfulRename() if ! $rename;
                        last;
                };
		/cartesian_product/ && do {
                	if ($param->{right}->{name} && $param->{right}->{name} && $full && $rename) {
	                	$result = "(SELECT * FROM " . transform($param->{left}, 0, 0)
        	                	. ", " . transform($param->{right}, 0, 0) . ")";
                        } else {
	                	$result = transform($param->{left}, 0, 0)
        	                	. ", " . transform($param->{right}, 0, 0);
                	        $result = $result . needfulRename() if ! $rename;
                        }
                        last;
                };
		/selection/ && do {
                	if ($param->{right}->{type} eq 'projection') {
                        	$result = "(SELECT " . $param->{right}->{left} .
                               		" FROM " . transform($param->{right}->{right}, 0, 0) .
                                        " WHERE " . $param->{left} . ")";
                	        $result = $result . needfulRename() if ! $rename;
                        } else {
	                	$result = "(SELECT * FROM " . transform($param->{right}, 0, 0);
        	                $result = $result . " WHERE " . $param->{left} . ")";
                	        $result = $result . needfulRename() if ! $rename;
                        }
                        last;
                };
		/projection/ && do {
                	if ($param->{right}->{type} eq 'selection') {
                        	$result = "(SELECT DISTINCT " . $param->{left} .
                               		" FROM " . transform($param->{right}->{right}, 0, 0) .
                                        " WHERE " . $param->{right}->{left} . ")";
                	        $result = $result . needfulRename() if ! $rename;
                        } else {
	                	$result = "(SELECT DISTINCT " . $param->{left} .
        	                	" FROM " . transform($param->{right}, 0, 0) . ")";
                	        $result = $result . needfulRename() if ! $rename;
                        }
                        last;
                };
		/rename/ && do {
                	if ($full) {
                	$result = "(SELECT * FROM " . transform($param->{right}, 0, 1) .
                        	" AS " . $param->{left};}
                        else {$result = transform($param->{right}, 0, 1) . " AS " . $param->{left};}
                        if ($param->{middle}) {$result = $result . "(" . $param->{middle} . ")";}
                        elsif ($full) {$result = $result . ")"}
                        last;
                };
		/braces/ && do {
                	$result = "(" . transform($param->{left}, 0, 0) . ")";
                        last;
                };
		/relation/ && do {
                	if ($full) {$result = "(SELECT * FROM " . $param->{name} . ")";}
                        else {$result = $param->{name};}
                        last;
                };
		die "Some error occured: '$param'";
        };
	return $result;
};

#Subroutine for needful rename
my $i = 0;
sub needfulRename {
	$i++;
        return " AS foo" . $i;
};

1;