<?php
 
 
class Sql_CompilerFlow {
 
 
    /**
 
     * compileControlFlow
 
     * @desc redirects to different control flow functions
 
     * @param string $name name of control flow function 
 
     * @param array $tree 
 
     * @param bool $recursing optional 
 
     */
 
    public static function doCompile($name, $tree, $recursing) {
 
        return call_user_func(array(__CLASS__,"compile".$name),$tree, $recursing);
 
    }
 
    
 
    /**
 
     * compileCASE
 
     * @desc compiles nested case control flow sets
 
     * => control flow function CASE
 
     * @param array $tree
 
     * @param bool $recursing
 
     * @return string
 
     */    
 
    private function compileCASE($tree, $recursing=false){
 
 
        if(isset($tree["Function"])) {
 
            // if it is a nested function then recurse
 
            $column = self::doCompile($tree["Function"]["Name"],$tree["Function"], true);
 
        } 
 
        elseif(isset($tree["Name"])) 
 
        {
 
 
            if(is_array($tree["Arg"])) {
 
                $column = $tree["Name"] . " "; // function name    
 
                foreach($tree["Arg"] as $index => $value) {
 
                    switch($value["Type"])
 
                    {
 
                        case 'real_val':
 
                        case 'int_val':
 
                        case 'null':
 
                        case 'ident':
 
                            $column .= $value["Value"]." ";
 
                            break;
 
                        case 'flowcontrol':
 
                            $column .= strtoupper($value["Value"])." ";
 
                            break;
 
                        case 'text_val':
 
                            $column .= $value["Value"]." ";
 
                            break;
 
                        case 'Subclause':
 
                            $column .= Sql_Compiler::OPENBRACE
 
                                    . $this->reCompile($value["Subclause"])
 
                                    . Sql_Compiler::CLOSEBRACE." "
 
                                    ;
 
                            break;
 
                    }
 
                }
 
                $column .= "END ";
 
            }
 
        }
 
        return $column;
 
    }
 
    
 
    /**
 
     * compileIF
 
     * @desc compiles nested if control flow sets
 
     * => control flow function IF
 
     * @param array $tree
 
     * @param bool $recursing
 
     * @return string
 
     */    
 
    private static function compileIF($tree, $recursing=false){
 
        
 
        if(isset($tree["Function"])) {
 
            // if it is a nested function then recurse
 
            $column = self::doCompile($tree["Function"]["Name"],$tree["Function"], true);
 
        } 
 
        elseif(isset($tree["Name"])) 
 
        {
 
            if(is_array($tree["Arg"])) {
 
                $column = $tree["Name"] . Sql_Compiler::OPENBRACE; // function name    
 
                $implosion = implode (Sql_Compiler::COMMA, $tree);
 
                if(strstr(strtolower($implosion),'array')) { // check on error
 
                    $funcTree = array();
 
                    foreach($tree["Arg"] as $index => $value){
 
                        if(count($value)==1){
 
                            $valueNode = $value[0];
 
                        }
 
                        if(is_array($valueNode) && isset($valueNode["Function"]) && isset($valueNode["Function"]["Name"])) {
 
                            $funcTree[] = self::doCompile($valueNode["Function"]["Name"], $valueNode, true);
 
                        } else {
 
                            if(is_array($value)) {
 
                                $funcTree[] = implode("", $value);    
 
                            } else {
 
                                $funcTree[] = $value;
 
                            }
 
                        }
 
                    }
 
                    $column .= implode(Sql_Compiler::COMMA, $funcTree);
 
                } else {
 
                    $column .= $implosion;                                    
 
                }
 
                $column .= Sql_Compiler::CLOSEBRACE;
 
            }
 
            
 
            // only top most function shall have an alias
 
            if (empty($recursing) and $tree['Alias'] != '') {
 
                $column .= Sql_Compiler::ALIAS . $tree['Alias'];
 
            }
 
        }
 
        return $column;        
 
    }
 
 
    
 
    public function compile($name, $tree, $recursing=false){
 
        return self::doCompile($name,$tree, $recursing);        
 
    }
 
 
}
 
 
 
 |