Details
-
Type:
Bug
-
Status:
Open
-
Priority:
Major
-
Resolution: Unresolved
-
Affects Version/s: 1.2.1
-
Fix Version/s: None
-
Component/s: Query
-
Labels:None
Description
First up Doctrine_Query_Set should extend Doctrine_Query_Condition so that the parseLiteralValue method is available in _processPossibleAggExpression().
However I am not sure what this method is really supposed to do. It seems to do some reordering of clauses, but in my case it actually drops off some parts of my expression:
Doctrine_Query::create()
->update('Document')
->set('clause_ordering', "IF(clause_ordering IS NULL, '$id', CONCAT(clause_ordering, ',$id'))")
->where('id = ?', $document_id)
->execute();
Results in "UPDATE document SET clause_ordering = IF(clause_ordering IS NULL, '67', CONCAT(clause_ordering)) WHERE (id = ?)"
And not as expected "UPDATE document SET clause_ordering = IF(clause_ordering IS NULL, '67', CONCAT(clause_ordering, ',67')) WHERE (id = ?)"
Adding a space after IF and CONCAT fixes the issue, but is obviously a hack to get around the regexp in _processPossibleAggExpression()
Guilherme,
Como eu sei que você fala portuguese e I dont speek english, vou falar em português mesmo. Qualquer coisa você traduz.
Implementei uma solução meio nebulosa aqui: http://pastie.org/1011675
O que esta pegando é a expressão regular. Ela não esta aceitando muito bem quando existe na "$hasAggExpression" argumentos separados por vírgula.
O meu teste foi um pouco diferente do que o criado pelo Lukas. Veja:
->set('p.tempo_atual', 'IFNULL(p.tempo_atual, p.lance_tempo) - 1')
Na implementação atual ele descarto o segundo argumento do IFNULL(). Não tenho certeza se minha proposta de implementação é correta. não entendi muito bem o funcionamento do preg_match_all. Ao meu ver ele sempre retornaria apenas a posicao 0, mas foi uitlizado um foreach, não entendi o pq. Então como esta com foreach eu deixei e coloquei uma 'glue' variável para o implode no final.