Doctrine 1
  1. Doctrine 1
  2. DC-499

Doctrine_Query_Set incorrectly rewrites expressions

    Details

    • Type: Bug Bug
    • Status: Open
    • Priority: Major 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()

        Activity

        Hide
        Raphael Araújo added a comment -

        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.

        Show
        Raphael Araújo added a comment - 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.
        Hide
        Sebastião Farias Júnior added a comment -

        Tem como ignorar esta verificação? Pq o que esta acontecendo e que se eu digitar numa frase, exemplo, " teste( 89,0%), " o doctrine pensa que é uma expressão, como evitar isto?

        Show
        Sebastião Farias Júnior added a comment - Tem como ignorar esta verificação? Pq o que esta acontecendo e que se eu digitar numa frase, exemplo, " teste( 89,0%), " o doctrine pensa que é uma expressão, como evitar isto?

          People

          • Assignee:
            Guilherme Blanco
            Reporter:
            Lukas Kahwe
          • Votes:
            1 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated: