protected function AppendCriterion(QueryBuilder $QueryBuilder, Relational\Criterion $Criterion)
 {
     if ($Criterion->IsConstrained()) {
         $QueryBuilder->Append('WHERE ');
     }
     $QueryBuilder->AppendCriterion($Criterion);
 }
示例#2
0
 protected function AppendIf(QueryBuilder $QueryBuilder, E\IfExpression $Expression)
 {
     $QueryBuilder->Append('CASE WHEN ');
     $this->Append($QueryBuilder, $Expression->GetConditionExpression());
     $QueryBuilder->Append(' THEN ');
     $this->Append($QueryBuilder, $Expression->GetIfTrueExpression());
     $QueryBuilder->Append(' ELSE ');
     $this->Append($QueryBuilder, $Expression->GetIfFalseExpression());
     $QueryBuilder->Append(' END ');
 }
示例#3
0
 protected function UpsertRowsQuery(QueryBuilder $QueryBuilder, Table $Table, array $Rows, $ShouldReturnKeyData)
 {
     if ($ShouldReturnKeyData) {
         throw new \Storm\Drivers\Base\Relational\PlatformException('SQLite does not support returning data');
     }
     $Columns = $Table->GetColumns();
     $PrimaryKeyColumns = $Table->GetPrimaryKeyColumns();
     $ColumnNames = array_keys($Columns);
     $PrimaryKeyColumnNames = array_keys($PrimaryKeyColumns);
     $TableName = $Table->GetName();
     $DerivedTableName = $TableName . 'Values';
     $PrimaryKeyIdentifiers = [];
     foreach ($PrimaryKeyColumnNames as $ColumnName) {
         $PrimaryKeyIdentifiers[] = [$TableName, $ColumnName];
     }
     $QueryBuilder->AppendIdentifier('INSERT OR REPLACE INTO #', [$TableName]);
     $QueryBuilder->AppendIdentifiers('(#)', $ColumnNames, ',');
     //TODO: Fix unique constraint conflicts
     $this->AppendDataAsInlineTable($QueryBuilder, $Table->GetColumns(), $DerivedTableName, $Rows);
 }
示例#4
0
 protected function AppendRange(QueryBuilder $QueryBuilder, $Offset, $Limit)
 {
     $QueryBuilder->Append(' ');
     if ($Limit === null) {
         $QueryBuilder->Append('LIMIT 18446744073709551615');
     } else {
         $QueryBuilder->AppendValue('LIMIT #', $Limit, Queries\ParameterType::Integer);
     }
     $QueryBuilder->Append(' ');
     $QueryBuilder->AppendValue('OFFSET #', $Offset, Queries\ParameterType::Integer);
 }
示例#5
0
 protected function AppendLiteral(QueryBuilder $QueryBuilder, E\LiteralExpression $Expression)
 {
     $QueryBuilder->Append($Expression->GetString());
 }
示例#6
0
 private function AppendOnDuplicateKeyUpdate(QueryBuilder $QueryBuilder, $TableName, array $Columns, array $PrimaryKeyIdentifiers)
 {
     $QueryBuilder->Append(' ON DUPLICATE KEY UPDATE ');
     $FirstPrimaryKey = true;
     foreach ($QueryBuilder->Delimit($Columns, ',') as $ColumName => $Column) {
         $ColumnIdentifier = [$TableName, $ColumName];
         if ($FirstPrimaryKey && $Column->IsPrimaryKey()) {
             /*
              * Ugly fix/hack to prevent mysql from updating primary key when encountering
              * a duplicate value on a seperate unique constraint. Sadly Mysql does not support
              * the more robust 'MERGE' operation. Furthermore there is no clean way to throw a 
              * conditional runtime error in Mysql reliably.
              * 
              * Example: Persisting a account entity with a unique username, if the user changes
              * their username and and a duplicate username exists, mysql could attempt to update
              * the other duplicate row with the new values/primary key. This should not be an 
              * issue as then it will fail with a duplicate primary key but could lead to some 
              * wacky edge cases that I want no part in.
              */
             $QueryBuilder->AppendIdentifier('# = IF(', $ColumnIdentifier);
             foreach ($QueryBuilder->Delimit($PrimaryKeyIdentifiers, ' AND ') as $PrimaryKeyIdentifier) {
                 $QueryBuilder->AppendIdentifier('# = VALUES(#)', $PrimaryKeyIdentifier);
             }
             $QueryBuilder->Append(',');
             $QueryBuilder->AppendIdentifier('VALUES(#)', $ColumnIdentifier);
             $QueryBuilder->Append(',');
             $QueryBuilder->Append('(SELECT 1 UNION ALL SELECT 1))');
             $FirstPrimaryKey = false;
         } else {
             $QueryBuilder->AppendIdentifier('# = VALUES(#)', $ColumnIdentifier);
         }
     }
 }
示例#7
0
 public function AppendNotNullable(QueryBuilder $QueryBuilder, Traits\NotNullable $Trait)
 {
     $QueryBuilder->Append('NOT NULL');
 }
 public static function AppendAlterTable(QueryBuilder $Builder, Relational\Table $Table)
 {
     $Builder->AppendIdentifier('ALTER TABLE # ', [$Table->GetName()]);
 }
示例#9
0
 public function PrimaryKey(QueryBuilder $QueryBuilder, Table $Table, Traits\PrimaryKey $Trait)
 {
     $QueryBuilder->AppendIdentifiers('PRIMARY KEY (#)', $Trait->GetColumnNames(), ',');
 }
示例#10
0
 public function AppendDataAsInlineRow(QueryBuilder $QueryBuilder, array $Columns, Relational\ColumnData $ColumnData)
 {
     $QueryBuilder->Append(' SELECT ');
     foreach ($QueryBuilder->Delimit($Columns, ', ') as $Column) {
         $QueryBuilder->AppendExpression(Expression::PersistData($Column, Expression::Constant($ColumnData[$Column])));
     }
 }
示例#11
0
 protected function AppendIf(QueryBuilder $QueryBuilder, E\IfExpression $Expression)
 {
     $QueryBuilder->Append('IF');
     $QueryBuilder->Append('(');
     $this->Append($QueryBuilder, $Expression->GetConditionExpression());
     $QueryBuilder->Append(',');
     $this->Append($QueryBuilder, $Expression->GetIfTrueExpression());
     $QueryBuilder->Append(',');
     $this->Append($QueryBuilder, $Expression->GetIfFalseExpression());
     $QueryBuilder->Append(')');
 }
示例#12
0
 private function AppendColumnPosition(QueryBuilder $QueryBuilder, Column $PreviousColumn = null)
 {
     return $PreviousColumn === null ? $QueryBuilder->Append('FIRST') : $QueryBuilder->AppendIdentifier('AFTER #', [$PreviousColumn->GetName()]);
 }