protected function processIndexColumnList($parsed) { $processor = new IndexColumnListProcessor(); return $processor->process($parsed); }
public function process($tokens) { $expr = array('expr_type' => ExpressionType::REFERENCE, 'base_expr' => false, 'sub_tree' => array()); $base_expr = ''; foreach ($tokens as $key => $token) { $trim = trim($token); $base_expr .= $token; if ($trim === '') { continue; } $upper = strtoupper($trim); switch ($upper) { case ',': # we stop on a single comma # or at the end of the array $tokens $expr = $this->buildReferenceDef($expr, trim(substr($base_expr, 0, -strlen($token))), $key - 1); break 2; case 'REFERENCES': $expr['sub_tree'][] = array('expr_type' => ExpressionType::RESERVED, 'base_expr' => $trim); $currCategory = $upper; break; case 'MATCH': if ($currCategory === 'REF_COL_LIST') { $expr['sub_tree'][] = array('expr_type' => ExpressionType::RESERVED, 'base_expr' => $trim); $currCategory = 'REF_MATCH'; continue 2; } # else? break; case 'FULL': case 'PARTIAL': case 'SIMPLE': if ($currCategory === 'REF_MATCH') { $expr['sub_tree'][] = array('expr_type' => ExpressionType::RESERVED, 'base_expr' => $trim); $expr['match'] = $upper; $currCategory = 'REF_COL_LIST'; continue 2; } # else? break; case 'ON': if ($currCategory === 'REF_COL_LIST') { $expr['sub_tree'][] = array('expr_type' => ExpressionType::RESERVED, 'base_expr' => $trim); $currCategory = 'REF_ACTION'; continue 2; } # else ? break; case 'UPDATE': case 'DELETE': if ($currCategory === 'REF_ACTION') { $expr['sub_tree'][] = array('expr_type' => ExpressionType::RESERVED, 'base_expr' => $trim); $currCategory = 'REF_OPTION_' . $upper; continue 2; } # else ? break; case 'RESTRICT': case 'CASCADE': if (strpos($currCategory, 'REF_OPTION_') === 0) { $expr['sub_tree'][] = array('expr_type' => ExpressionType::RESERVED, 'base_expr' => $trim); $expr['on_' . strtolower(substr($currCategory, -6))] = $upper; continue 2; } # else ? break; case 'SET': case 'NO': if (strpos($currCategory, 'REF_OPTION_') === 0) { $expr['sub_tree'][] = array('expr_type' => ExpressionType::RESERVED, 'base_expr' => $trim); $expr['on_' . strtolower(substr($currCategory, -6))] = $upper; $currCategory = 'SEC_' . $currCategory; continue 2; } # else ? break; case 'NULL': case 'ACTION': if (strpos($currCategory, 'SEC_REF_OPTION_') === 0) { $expr['sub_tree'][] = array('expr_type' => ExpressionType::RESERVED, 'base_expr' => $trim); $expr['on_' . strtolower(substr($currCategory, -6))] .= ' ' . $upper; $currCategory = 'REF_COL_LIST'; continue 2; } # else ? break; default: switch ($currCategory) { case 'REFERENCES': if ($upper[0] === '(' && substr($upper, -1) === ')') { # index_col_name list $processor = new IndexColumnListProcessor(); $cols = $processor->process($this->removeParenthesisFromStart($trim)); $expr['sub_tree'][] = array('expr_type' => ExpressionType::COLUMN_LIST, 'base_expr' => $trim, 'sub_tree' => $cols); $currCategory = 'REF_COL_LIST'; continue 3; } # foreign key reference table name $expr['sub_tree'][] = array('expr_type' => ExpressionType::TABLE, 'table' => $trim, 'base_expr' => $trim, 'no_quotes' => $this->revokeQuotation($trim)); continue 3; default: # else ? break; } break; } } if (!isset($expr['till'])) { $expr = $this->buildReferenceDef($expr, trim($base_expr), -1); } return $expr; }