Update new xml query classes with xe 1.5

with improved query argument support and update and delete queries

git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8378 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
mosmartin 2011-05-19 13:06:56 +00:00
parent 5f9a5249ac
commit 7dbe0626b6
39 changed files with 1619 additions and 540 deletions

View file

@ -314,6 +314,16 @@
if($source_args) $args = @clone($source_args);
require_once(_XE_PATH_.'classes/xml/xmlquery/DBParser.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/expression/Expression.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/expression/SelectExpression.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/expression/InsertExpression.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/table/Table.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/table/JoinTable.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/condition/ConditionGroup.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/condition/Condition.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/expression/StarExpression.class.php');
$output = @include($cache_file);
if( (is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output;

View file

@ -812,7 +812,65 @@
* to get a specific page list easily in select statement,\n
* a method, navigation, is used
**/
function _executeSelectAct ($output)
function _executeSelectAct($output){
$query = '';
$select = 'SELECT ';
foreach($output->columns as $column){
if($column->show())
$select .= $column->getExpression() . ', ';
}
$select = substr($select, 0, -2);
$from = 'FROM ';
$simple_table_count = 0;
foreach($output->tables as $table){
/*if($simple_table_count > 0) $from .= ', ';
$from .= $table->toString() . ' ';
if(!$table->isJoinTable()) $simple_table_count++;
*/
if($table->isJoinTable() || !$simple_table_count) $from .= $table->toString() . ' ';
else $from .= ', '.$table->toString() . ' ';
$simple_table_count++;
}
$where = '';
if(count($output->conditions) > 0){
$where = 'WHERE ';
foreach($output->conditions as $conditionGroup){
$where .= $conditionGroup->toString();
}
}
$groupBy = '';
if($output->groups) if($output->groups[0] !== "")
$groupBy = 'GROUP BY ' . implode(', ', $output->groups);
$orderBy = '';
if(count($output->orderby) > 0){
$orderBy = 'ORDER BY ';
foreach($output->orderby as $order){
$orderBy .= $order->toString() .', ';
}
$orderBy = substr($orderBy, 0, -2);
}
$query = $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy;
//$query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, //$groupby_query.$orderby_query);
//$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):'';
$result = $this->_query ($query);
if ($this->isError ()) return;
$data = $this->_fetch ($result);
$buff = new Object ();
$buff->data = $data;
return $buff;
}
/*function _executeSelectAct ($output)
{
// tables
$table_list = array ();
@ -1049,6 +1107,7 @@
return $buff;
}
*/
/**
* @brief displays the current stack trace. Fetch the result

View file

@ -0,0 +1,87 @@
<?php
class Condition {
var $column_name;
var $value;
var $operation;
var $pipe;
function Condition($column_name, $value, $operation, $pipe = ""){
$this->column_name = $column_name;
$this->value = $value;
$this->operation = $operation;
$this->pipe = $pipe;
}
function toString(){
return $this->pipe . ' ' . $this->getConditionPart($this->column_name, $this->value, $this->operation);
}
function getConditionPart($name, $value, $operation) {
switch($operation) {
case 'equal' :
case 'more' :
case 'excess' :
case 'less' :
case 'below' :
case 'like_tail' :
case 'like_prefix' :
case 'like' :
case 'in' :
case 'notin' :
case 'notequal' :
// if variable is not set or is not string or number, return
if(!isset($value)) return;
if($value === '') return;
if(!in_array(gettype($value), array('string', 'integer'))) return;
break;
case 'between' :
if(!is_array($value)) return;
if(count($value)!=2) return;
}
switch($operation) {
case 'equal' :
return $name.' = '.$value;
break;
case 'more' :
return $name.' >= '.$value;
break;
case 'excess' :
return $name.' > '.$value;
break;
case 'less' :
return $name.' <= '.$value;
break;
case 'below' :
return $name.' < '.$value;
break;
case 'like_tail' :
case 'like_prefix' :
case 'like' :
return $name.' like '.$value;
break;
case 'in' :
return $name.' in ('.$value.')';
break;
case 'notin' :
return $name.' not in ('.$value.')';
break;
case 'notequal' :
return $name.' <> '.$value;
break;
case 'notnull' :
return $name.' is not null';
break;
case 'null' :
return $name.' is null';
break;
case 'between' :
return $name.' between ' . $value[0] . ' and ' . $value[1];
break;
}
}
}
?>

View file

@ -0,0 +1,27 @@
<?php
class ConditionGroup {
var $conditions;
var $pipe;
function ConditionGroup($conditions, $pipe = ""){
$this->conditions = $conditions;
$this->pipe = $pipe;
}
function toString(){
if($this->pipe !== "")
$group = $this->pipe .'(';
else $group = '';
foreach($this->conditions as $condition){
$group .= $condition->toString() . ' ';
}
if($this->pipe !== "")
$group .= ')';
return $group;
}
}
?>

View file

@ -0,0 +1,33 @@
<?php
/**
* @class ClickCountExpression
* @author Arnia Software
* @brief
*
*/
class ClickCountExpression extends SelectExpression {
var $click_count;
function ClickCountExpression($column_name, $alias = NULL, $click_count = false){
parent::SelectExpression($column_name, $alias);
if(!is_bool($click_count)){
error_log("Click_count value for $column_name was not boolean", 0);
$this->click_count = false;
return;
}
$this->click_count = $click_count;
}
function show() {
return $this->click_count;
}
function getExpression(){
return "$this->column_name = $this->column_name + 1";
}
}
?>

View file

@ -0,0 +1,34 @@
<?php
/**
* @class DeleteExpression
* @author Arnia Software
* @brief
*
*/
class DeleteExpression extends Expression {
var $value;
function DeleteExpression($column_name, $value){
parent::Expression($column_name);
$this->value = $value;
}
function getExpression(){
return "$this->column_name = $this->value";
}
function getValue(){
// TODO Escape value according to column type instead of variable type
if(!is_numeric($this->value)) return "'".$this->value."'";
return $this->value;
}
function show(){
if(!$this->value) return false;
return true;
}
}
?>

View file

@ -0,0 +1,30 @@
<?php
/**
* @class Expression
* @author Corina
* @brief Represents an expression used in select/update/insert/delete statements
*
* Examples (expressions are inside double square brackets):
* select [[columnA]], [[columnB as aliasB]] from tableA
* update tableA set [[columnA = valueA]] where columnB = something
*
*/
class Expression {
var $column_name;
function Expression($column_name){
$this->column_name = $column_name;
}
function getColumnName(){
return $this->column_name;
}
function show() {
return false;
}
function getExpression() {
}
}

View file

@ -0,0 +1,28 @@
<?php
/**
* @class InsertExpression
* @author Arnia Software
* @brief
*
*/
class InsertExpression extends Expression {
var $value;
function InsertExpression($column_name, $value){
parent::Expression($column_name);
$this->value = $value;
}
function getValue(){
return $this->value;
}
function show(){
if(!isset($this->value)) return false;
return true;
}
}
?>

View file

@ -0,0 +1,32 @@
<?php
/**
* @class SelectExpression
* @author Arnia Software
* @brief Represents an expresion that appears in the select clause
*
* @remarks
* $column_name can be:
* - a table column name
* - an sql function - like count(*)
* - an sql expression - substr(column_name, 1, 8) or score1 + score2
* $column_name is already escaped
*/
class SelectExpression extends Expression {
var $column_alias;
function SelectExpression($column_name, $alias = NULL){
parent::Expression($column_name);
$this->column_alias = $alias;
}
function getExpression() {
return sprintf("%s%s", $this->column_name, $this->column_alias ? " as ".$this->column_alias : "");
}
function show() {
return true;
}
}
?>

View file

@ -0,0 +1,16 @@
<?php
/**
* @class StarExpression
* @author Corina
* @brief Represents the * in 'select * from ...' statements
*
*/
class StarExpression extends SelectExpression {
function StarExpression(){
parent::SelectExpression("*");
}
}
?>

View file

@ -0,0 +1,34 @@
<?php
/**
* @class UpdateExpression
* @author Arnia Software
* @brief
*
*/
class UpdateExpression extends Expression {
var $value;
function UpdateExpression($column_name, $value){
parent::Expression($column_name);
$this->value = $value;
}
function getExpression(){
return "$this->column_name = $this->value";
}
function getValue(){
// TODO Escape value according to column type instead of variable type
if(!is_numeric($this->value)) return "'".$this->value."'";
return $this->value;
}
function show(){
if(!$this->value) return false;
return true;
}
}
?>

View file

@ -0,0 +1,16 @@
<?php
class OrderByColumn {
var $column_name;
var $sort_order;
function OrderByColumn($column_name, $sort_order){
$this->column_name = $column_name;
$this->sort_order = $sort_order;
}
function toString(){
return $this->column_name . ' ' . $this->sort_order;
}
}
?>

View file

@ -0,0 +1,37 @@
<?php
/**
* @class JoinTable
* @author Arnia Software
* @brief
*
* @remarks
* $conditions in an array of Condition objects
*
*/
class JoinTable extends Table {
var $join_type;
var $conditions;
function JoinTable($name, $alias, $join_type, $conditions){
parent::Table($name, $alias);
$this->join_type = $join_type;
$this->conditions = $conditions;
}
function toString(){
$part = $this->join_type . ' ' . $this->name ;
$part .= $this->alias ? ' as ' . $this->alias : '';
$part .= ' on ';
foreach($this->conditions as $conditionGroup)
$part .= $conditionGroup->toString();
return $part;
}
function isJoinTable(){
return true;
}
}
?>

View file

@ -0,0 +1,26 @@
<?php
class Table {
var $name;
var $alias;
function Table($name, $alias = NULL){
$this->name = $name;
$this->alias = $alias;
}
function toString(){
return sprintf("%s%s", $this->name, $this->alias ? ' as ' . $this->alias : '');
}
function getName(){
return $this->name;
}
function isJoinTable(){
if(in_array($tableName,array('left join','left outer join','right join','right outer join'))) return true;
return false;
}
}
?>