mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-07 02:31:40 +09:00
Add 'ifvar' attribute to most query elements
XML 쿼리에서 'ifvar' 속성을 사용하여, 특정 변수가 있을 때만 유효한 테이블이나 컬럼, 인덱스 힌트 등을 지정할 수 있도록 합니다. 어떤 변수를 넣는지에 따라 <condition> 뿐 아니라 <table>, <column>, <index_hint? 등의 적용 여부도 XML 쿼리 수정 없이 자유롭게 컨트롤할 수 있게 됩니다.
This commit is contained in:
parent
1289776c97
commit
6b7486e74f
12 changed files with 88 additions and 11 deletions
|
|
@ -9,6 +9,7 @@ class ColumnRead
|
||||||
{
|
{
|
||||||
public $name;
|
public $name;
|
||||||
public $alias;
|
public $alias;
|
||||||
|
public $ifvar;
|
||||||
public $is_expression = false;
|
public $is_expression = false;
|
||||||
public $is_wildcard = false;
|
public $is_wildcard = false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ class ColumnWrite extends VariableBase
|
||||||
public $name;
|
public $name;
|
||||||
public $operation = 'equal';
|
public $operation = 'equal';
|
||||||
public $var;
|
public $var;
|
||||||
|
public $ifvar;
|
||||||
public $default;
|
public $default;
|
||||||
public $not_null;
|
public $not_null;
|
||||||
public $filter;
|
public $filter;
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ class Condition extends VariableBase
|
||||||
public $operation;
|
public $operation;
|
||||||
public $column;
|
public $column;
|
||||||
public $var;
|
public $var;
|
||||||
|
public $ifvar;
|
||||||
public $default;
|
public $default;
|
||||||
public $not_null;
|
public $not_null;
|
||||||
public $filter;
|
public $filter;
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,5 @@ class ConditionGroup
|
||||||
{
|
{
|
||||||
public $conditions = array();
|
public $conditions = array();
|
||||||
public $pipe = 'AND';
|
public $pipe = 'AND';
|
||||||
|
public $ifvar;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,5 @@ class GroupBy
|
||||||
{
|
{
|
||||||
public $columns = array();
|
public $columns = array();
|
||||||
public $having = array();
|
public $having = array();
|
||||||
|
public $ifvar;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,4 +12,5 @@ class IndexHint
|
||||||
public $index_name = '';
|
public $index_name = '';
|
||||||
public $table_name = '';
|
public $table_name = '';
|
||||||
public $var;
|
public $var;
|
||||||
|
public $ifvar;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,11 @@ class Query extends VariableBase
|
||||||
$columns = array();
|
$columns = array();
|
||||||
foreach ($this->columns as $column)
|
foreach ($this->columns as $column)
|
||||||
{
|
{
|
||||||
if ($column instanceof self)
|
if ($column->ifvar && !isset($this->_args[$column->ifvar]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
elseif ($column instanceof self)
|
||||||
{
|
{
|
||||||
$has_subquery_columns = true;
|
$has_subquery_columns = true;
|
||||||
$subquery_count_only = $count_only ? $count_only + 1 : 0;
|
$subquery_count_only = $count_only ? $count_only + 1 : 0;
|
||||||
|
|
@ -206,7 +210,7 @@ class Query extends VariableBase
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compose the GROUP BY clause.
|
// Compose the GROUP BY clause.
|
||||||
if ($this->groupby && count($this->groupby->columns))
|
if ($this->groupby && count($this->groupby->columns) && (!$this->groupby->ifvar || isset($this->_args[$this->groupby->ifvar])))
|
||||||
{
|
{
|
||||||
$columns = array();
|
$columns = array();
|
||||||
foreach ($this->groupby->columns as $column_name)
|
foreach ($this->groupby->columns as $column_name)
|
||||||
|
|
@ -222,7 +226,7 @@ class Query extends VariableBase
|
||||||
}
|
}
|
||||||
$result .= ' GROUP BY ' . implode(', ', $columns);
|
$result .= ' GROUP BY ' . implode(', ', $columns);
|
||||||
}
|
}
|
||||||
if ($this->groupby && count($this->groupby->having))
|
if ($this->groupby && count($this->groupby->having) && (!$this->groupby->ifvar || isset($this->_args[$this->groupby->ifvar])))
|
||||||
{
|
{
|
||||||
$having = $this->_arrangeConditions($this->groupby->having);
|
$having = $this->_arrangeConditions($this->groupby->having);
|
||||||
if ($having !== '')
|
if ($having !== '')
|
||||||
|
|
@ -277,6 +281,11 @@ class Query extends VariableBase
|
||||||
$columns = array();
|
$columns = array();
|
||||||
foreach ($this->columns as $column)
|
foreach ($this->columns as $column)
|
||||||
{
|
{
|
||||||
|
if ($column->ifvar && !isset($this->_args[$column->ifvar]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$setval_string = $this->_parseCondition($column);
|
$setval_string = $this->_parseCondition($column);
|
||||||
if ($setval_string !== '')
|
if ($setval_string !== '')
|
||||||
{
|
{
|
||||||
|
|
@ -324,6 +333,11 @@ class Query extends VariableBase
|
||||||
$columns = array();
|
$columns = array();
|
||||||
foreach ($this->columns as $column)
|
foreach ($this->columns as $column)
|
||||||
{
|
{
|
||||||
|
if ($column->ifvar && !isset($this->_args[$column->ifvar]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$setval_string = $this->_parseCondition($column);
|
$setval_string = $this->_parseCondition($column);
|
||||||
if ($setval_string !== '')
|
if ($setval_string !== '')
|
||||||
{
|
{
|
||||||
|
|
@ -407,6 +421,12 @@ class Query extends VariableBase
|
||||||
// Process each table definition.
|
// Process each table definition.
|
||||||
foreach ($tables as $table)
|
foreach ($tables as $table)
|
||||||
{
|
{
|
||||||
|
// Skip
|
||||||
|
if ($table->ifvar && !isset($this->_args[$table->ifvar]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Subquery
|
// Subquery
|
||||||
if ($table instanceof self)
|
if ($table instanceof self)
|
||||||
{
|
{
|
||||||
|
|
@ -465,6 +485,12 @@ class Query extends VariableBase
|
||||||
// Group each index hint by type.
|
// Group each index hint by type.
|
||||||
foreach ($index_hints as $index_hint)
|
foreach ($index_hints as $index_hint)
|
||||||
{
|
{
|
||||||
|
// Skip
|
||||||
|
if ($index_hint->ifvar && !isset($this->_args[$index_hint->ifvar]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!count($index_hint->target_db) || isset($index_hint->target_db['mysql']))
|
if (!count($index_hint->target_db) || isset($index_hint->target_db['mysql']))
|
||||||
{
|
{
|
||||||
$key = $index_hint->hint_type ?: 'USE';
|
$key = $index_hint->hint_type ?: 'USE';
|
||||||
|
|
@ -506,6 +532,12 @@ class Query extends VariableBase
|
||||||
// Process each condition.
|
// Process each condition.
|
||||||
foreach ($conditions as $condition)
|
foreach ($conditions as $condition)
|
||||||
{
|
{
|
||||||
|
// Skip
|
||||||
|
if ($condition->ifvar && !isset($this->_args[$condition->ifvar]))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Subquery
|
// Subquery
|
||||||
if ($condition instanceof self)
|
if ($condition instanceof self)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ class Table
|
||||||
{
|
{
|
||||||
public $name;
|
public $name;
|
||||||
public $alias;
|
public $alias;
|
||||||
|
public $ifvar;
|
||||||
public $join_type;
|
public $join_type;
|
||||||
public $join_conditions = array();
|
public $join_conditions = array();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ class VariableBase
|
||||||
* Instance properties.
|
* Instance properties.
|
||||||
*/
|
*/
|
||||||
public $var;
|
public $var;
|
||||||
|
public $ifvar;
|
||||||
public $default;
|
public $default;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -33,7 +34,11 @@ class VariableBase
|
||||||
$params = array();
|
$params = array();
|
||||||
|
|
||||||
// Process the variable or default value.
|
// Process the variable or default value.
|
||||||
if ($this instanceof Query)
|
if ($this->ifvar && !isset($args[$this->ifvar]))
|
||||||
|
{
|
||||||
|
return [$where, $params];
|
||||||
|
}
|
||||||
|
elseif ($this instanceof Query)
|
||||||
{
|
{
|
||||||
$is_expression = true;
|
$is_expression = true;
|
||||||
$value = '(' . $this->getQueryString($prefix, $args) . ')';
|
$value = '(' . $this->getQueryString($prefix, $args) . ')';
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,7 @@ class DBQueryParser extends BaseParser
|
||||||
$table = new DBQuery\Table;
|
$table = new DBQuery\Table;
|
||||||
$table->name = trim($tag['name']);
|
$table->name = trim($tag['name']);
|
||||||
$table->alias = trim($tag['alias']) ?: $table->name;
|
$table->alias = trim($tag['alias']) ?: $table->name;
|
||||||
|
$table->ifvar = trim($tag['if']) ?: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$table_type = trim($tag['type']);
|
$table_type = trim($tag['type']);
|
||||||
|
|
@ -101,6 +102,7 @@ class DBQueryParser extends BaseParser
|
||||||
$index_hint->hint_type = strtoupper(trim($tag['type'])) ?: 'USE';
|
$index_hint->hint_type = strtoupper(trim($tag['type'])) ?: 'USE';
|
||||||
$index_hint->index_name = trim($tag['name']) ?: '';
|
$index_hint->index_name = trim($tag['name']) ?: '';
|
||||||
$index_hint->table_name = trim($tag['table']) ?: '';
|
$index_hint->table_name = trim($tag['table']) ?: '';
|
||||||
|
$index_hint->ifvar = trim($tag['if']) ?: null;
|
||||||
if (isset($tag['var']) && trim($tag['var']))
|
if (isset($tag['var']) && trim($tag['var']))
|
||||||
{
|
{
|
||||||
$index_hint->var = trim($tag['var']);
|
$index_hint->var = trim($tag['var']);
|
||||||
|
|
@ -129,6 +131,7 @@ class DBQueryParser extends BaseParser
|
||||||
$column = new DBQuery\ColumnRead;
|
$column = new DBQuery\ColumnRead;
|
||||||
$column->name = trim($tag['name']);
|
$column->name = trim($tag['name']);
|
||||||
$column->alias = trim($tag['alias']) ?: null;
|
$column->alias = trim($tag['alias']) ?: null;
|
||||||
|
$column->ifvar = trim($tag['if']) ?: null;
|
||||||
if ($column->name === '*' || preg_match('/\.\*$/', $column->name))
|
if ($column->name === '*' || preg_match('/\.\*$/', $column->name))
|
||||||
{
|
{
|
||||||
$column->is_wildcard = true;
|
$column->is_wildcard = true;
|
||||||
|
|
@ -146,6 +149,7 @@ class DBQueryParser extends BaseParser
|
||||||
$column->name = $attribs['name'];
|
$column->name = $attribs['name'];
|
||||||
$column->operation = ($attribs['operation'] ?? null) ?: 'equal';
|
$column->operation = ($attribs['operation'] ?? null) ?: 'equal';
|
||||||
$column->var = $attribs['var'] ?? null;
|
$column->var = $attribs['var'] ?? null;
|
||||||
|
$column->ifvar = $attribs['if'] ?? null;
|
||||||
$column->default = $attribs['default'] ?? null;
|
$column->default = $attribs['default'] ?? null;
|
||||||
$column->not_null = ($attribs['notnull'] ?? false) ? true : false;
|
$column->not_null = ($attribs['notnull'] ?? false) ? true : false;
|
||||||
$column->filter = $attribs['filter'] ?? null;
|
$column->filter = $attribs['filter'] ?? null;
|
||||||
|
|
@ -165,6 +169,7 @@ class DBQueryParser extends BaseParser
|
||||||
if ($xml->groups)
|
if ($xml->groups)
|
||||||
{
|
{
|
||||||
$query->groupby = new DBQuery\GroupBy;
|
$query->groupby = new DBQuery\GroupBy;
|
||||||
|
$query->groupby->ifvar = trim($xml->groups['if']) ?: null;
|
||||||
foreach ($xml->groups->children() as $tag)
|
foreach ($xml->groups->children() as $tag)
|
||||||
{
|
{
|
||||||
$name = $tag->getName();
|
$name = $tag->getName();
|
||||||
|
|
@ -261,6 +266,7 @@ class DBQueryParser extends BaseParser
|
||||||
$cond->var = $attribs['var'] ?? null;
|
$cond->var = $attribs['var'] ?? null;
|
||||||
$cond->default = $attribs['default'] ?? null;
|
$cond->default = $attribs['default'] ?? null;
|
||||||
}
|
}
|
||||||
|
$cond->ifvar = $attribs['if'] ?? null;
|
||||||
$cond->not_null = ($attribs['notnull'] ?? false) ? true : false;
|
$cond->not_null = ($attribs['notnull'] ?? false) ? true : false;
|
||||||
$cond->filter = $attribs['filter'] ?? null;
|
$cond->filter = $attribs['filter'] ?? null;
|
||||||
$cond->minlength = intval($attribs['minlength'] ?? 0, 10);
|
$cond->minlength = intval($attribs['minlength'] ?? 0, 10);
|
||||||
|
|
@ -273,6 +279,7 @@ class DBQueryParser extends BaseParser
|
||||||
$group = new DBQuery\ConditionGroup;
|
$group = new DBQuery\ConditionGroup;
|
||||||
$group->conditions = self::_parseConditions($tag);
|
$group->conditions = self::_parseConditions($tag);
|
||||||
$group->pipe = strtoupper($attribs['pipe'] ?? null) ?: 'AND';
|
$group->pipe = strtoupper($attribs['pipe'] ?? null) ?: 'AND';
|
||||||
|
$group->ifvar = $attribs['if'] ?? null;
|
||||||
$result[] = $group;
|
$result[] = $group;
|
||||||
}
|
}
|
||||||
elseif ($name === 'query')
|
elseif ($name === 'query')
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,19 @@
|
||||||
<query id="selectJoinTest1" action="select">
|
<query id="selectJoinTest1" action="select">
|
||||||
<tables>
|
<tables>
|
||||||
<table name="documents" />
|
<table name="documents" />
|
||||||
<table name="member" />
|
<table name="member" if="if_table" />
|
||||||
</tables>
|
</tables>
|
||||||
<columns>
|
<columns>
|
||||||
<column name="member.member_srl" />
|
<column name="member.member_srl" />
|
||||||
<column name="COUNT(*)" alias="count" />
|
<column name="COUNT(*)" alias="count" if="if_column" />
|
||||||
</columns>
|
</columns>
|
||||||
<conditions>
|
<conditions>
|
||||||
<condition operation="equal" column="documents.member_srl" var="member.member_srl" />
|
<condition operation="equal" column="documents.member_srl" var="member.member_srl" />
|
||||||
<condition operation="equal" column="documents.member_srl" default="member.member_srl" />
|
<condition operation="equal" column="documents.member_srl" default="member.member_srl" if="if_condition1" />
|
||||||
<condition operation="in" column="documents.document_srl" var="document_srl_list" pipe="and" />
|
<condition operation="in" column="documents.document_srl" var="document_srl_list" />
|
||||||
|
<condition operation="notin" column="documents.document_srl" var="exclude_document_srl_list" if="if_condition2" />
|
||||||
</conditions>
|
</conditions>
|
||||||
<groups>
|
<groups if="if_groupby">
|
||||||
<group column="member.member_srl" />
|
<group column="member.member_srl" />
|
||||||
<having>
|
<having>
|
||||||
<condition operation="notequal" column="member.member_srl" var="exclude_member_srl" notnull="notnull" />
|
<condition operation="notequal" column="member.member_srl" var="exclude_member_srl" notnull="notnull" />
|
||||||
|
|
|
||||||
|
|
@ -137,7 +137,7 @@ class DBQueryParserTest extends \Codeception\TestCase\Test
|
||||||
$this->assertTrue($query->columns[1]->is_expression);
|
$this->assertTrue($query->columns[1]->is_expression);
|
||||||
$this->assertFalse($query->columns[1]->is_wildcard);
|
$this->assertFalse($query->columns[1]->is_wildcard);
|
||||||
|
|
||||||
$this->assertEquals(3, count($query->conditions));
|
$this->assertEquals(4, count($query->conditions));
|
||||||
$this->assertEquals('documents.member_srl', $query->conditions[0]->column);
|
$this->assertEquals('documents.member_srl', $query->conditions[0]->column);
|
||||||
$this->assertEquals('member.member_srl', $query->conditions[0]->default);
|
$this->assertEquals('member.member_srl', $query->conditions[0]->default);
|
||||||
$this->assertNull($query->conditions[0]->var);
|
$this->assertNull($query->conditions[0]->var);
|
||||||
|
|
@ -153,7 +153,10 @@ class DBQueryParserTest extends \Codeception\TestCase\Test
|
||||||
$this->assertEquals('member.member_srl', $query->groupby->having[0]->column);
|
$this->assertEquals('member.member_srl', $query->groupby->having[0]->column);
|
||||||
$this->assertEquals('notequal', $query->groupby->having[0]->operation);
|
$this->assertEquals('notequal', $query->groupby->having[0]->operation);
|
||||||
|
|
||||||
$args = array('document_srl_list' => [12, 34, 56], 'exclude_member_srl' => 4);
|
$args = array(
|
||||||
|
'document_srl_list' => [12, 34, 56], 'exclude_member_srl' => 4,
|
||||||
|
'if_table' => true, 'if_column' => true, 'if_condition1' => true, 'if_groupby' => true,
|
||||||
|
);
|
||||||
$sql = $query->getQueryString('rx_', $args);
|
$sql = $query->getQueryString('rx_', $args);
|
||||||
$params = $query->getQueryParams();
|
$params = $query->getQueryParams();
|
||||||
|
|
||||||
|
|
@ -161,6 +164,28 @@ class DBQueryParserTest extends \Codeception\TestCase\Test
|
||||||
'WHERE `documents`.`member_srl` = `member`.`member_srl` AND `documents`.`member_srl` = `member`.`member_srl` ' .
|
'WHERE `documents`.`member_srl` = `member`.`member_srl` AND `documents`.`member_srl` = `member`.`member_srl` ' .
|
||||||
'AND `documents`.`document_srl` IN (?, ?, ?) GROUP BY `member`.`member_srl` HAVING `member`.`member_srl` != ?', $sql);
|
'AND `documents`.`document_srl` IN (?, ?, ?) GROUP BY `member`.`member_srl` HAVING `member`.`member_srl` != ?', $sql);
|
||||||
$this->assertEquals(['12', '34', '56', '4'], $params);
|
$this->assertEquals(['12', '34', '56', '4'], $params);
|
||||||
|
|
||||||
|
$args = array(
|
||||||
|
'document_srl_list' => [12, 34, 56], 'exclude_member_srl' => 4, 'exclude_document_srl_list' => '78,90',
|
||||||
|
'if_table' => true, 'if_column' => true, 'if_condition2' => true,
|
||||||
|
);
|
||||||
|
$sql = $query->getQueryString('rx_', $args);
|
||||||
|
$params = $query->getQueryParams();
|
||||||
|
|
||||||
|
$this->assertEquals('SELECT `member`.`member_srl`, COUNT(*) AS `count` FROM `rx_documents` AS `documents`, `rx_member` AS `member` ' .
|
||||||
|
'WHERE `documents`.`member_srl` = `member`.`member_srl` AND `documents`.`document_srl` IN (?, ?, ?) ' .
|
||||||
|
'AND `documents`.`document_srl` NOT IN (?, ?)', $sql);
|
||||||
|
$this->assertEquals(['12', '34', '56', '78', '90'], $params);
|
||||||
|
|
||||||
|
$args = array(
|
||||||
|
'document_srl_list' => [12, 34, 56], 'exclude_member_srl' => 4,
|
||||||
|
);
|
||||||
|
$sql = $query->getQueryString('rx_', $args);
|
||||||
|
$params = $query->getQueryParams();
|
||||||
|
|
||||||
|
$this->assertEquals('SELECT `member`.`member_srl` FROM `rx_documents` AS `documents` ' .
|
||||||
|
'WHERE `documents`.`member_srl` = `member`.`member_srl` AND `documents`.`document_srl` IN (?, ?, ?)', $sql);
|
||||||
|
$this->assertEquals(['12', '34', '56'], $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testJoin2()
|
public function testJoin2()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue