protected static function processSelectStatement($parsed = array()) { $query = $parsed["SQL"]; // SELECT <select list> FROM <table reference> preg_match_all("/SELECT ([\\w,\\*`\\s]+) FROM\\s+([\\w,`]+)/i", $query, $matches); if (!empty($matches[1][0]) && !empty($matches[2][0])) { $column = $matches[1][0] == "*" ? null : $matches[1][0]; $column = str_replace("`", "", $column); $column = str_replace(" ", "", $column); $table = str_replace("`", "", $matches[2][0]); $rowkey = "*"; $filter = ""; // SQL 有挑選特定欄位就加入 MultipleColumnPrefixFilter if ($column != "*" && !empty($column)) { // Convert Col1,Col2 => 'Col1','Col2' $column = "'" . str_replace(",", "','", $column) . "'"; $filter .= "MultipleColumnPrefixFilter ({$column}) AND "; } } // SELECT <select list> FROM <table reference> WHERE <search condition> preg_match_all("/SELECT ([\\w,\\*`\\s]+) FROM\\s+([\\w,`]+)\\s+(WHERE ([\\w\\W,`\\s<=>'\"\\-:]+)*)/i", $query, $matches); if (!empty($matches[3])) { self::debug(print_r($matches, true)); $condition_str = trim($matches[4][0]); //debugdump($condition_str); Predicate::parseMultiPredicate($condition_str); $predicates = Predicate::getPredicates(); $operators = Predicate::getOperators(); foreach ($predicates as $predicate_str) { $predicate = Predicate::getMappingPredicate($predicate_str); //new \Predicate($condition_str); if (!$predicate) { throw new SQLBridgeException('查詢子句語意不明! (WHERE clause is ambiguity.)'); } $args = $predicate->toFilterArguments(); $qualifier = $args->qualifier; $op = $args->compareOperator; $comparator = $args->comparatorType; $value = $args->comparatorValue; $comparator = !empty($comparator) ? $comparator : $default_comparator; $cf = self::$hbase->getFirstColumnFamilyName($table); if (!preg_match("/^rowkey|id\$/i", $qualifier)) { // SQL WHERE 條件子句以 SingleColumnValueFilter 處理 $filter .= "SingleColumnValueFilter ('{$cf}', '{$qualifier}', {$op}, '{$comparator}:{$value}', true, false)"; } else { $filter .= "RowFilter ({$op}, '{$comparator}:{$value}')"; } $filter .= " " . current($operators) . " "; next($operators); } } // LIMIT preg_match_all("/LIMIT\\s*([\\d]+)/i", $query, $matches); if (!empty($matches[1][0])) { $limit = $matches[1][0]; if (!empty($filter)) { $filter .= " AND "; } $filter .= "PageFilter ({$limit})"; } if (preg_match("/^\\s*SELECT /i", $query)) { return MMB::select($table, $rowkey, $column, $filter); } }