djongo icon indicating copy to clipboard operation
djongo copied to clipboard

Django contains operator not working (LIKE)

Open muriloventuroso opened this issue 1 year ago • 4 comments

Operations like __contains, __icontains, __startswith and __endswith are not working.

Python script

User.objects.filter(username__icontains="admin")

Traceback

Traceback (most recent call last):
  File "/home/muriloventuroso/Dev/Python/sgc-env/lib/python3.10/site-packages/djongo/sql2mongo/query.py", line 926, in parse
    return handler(self, statement)
  File "/home/muriloventuroso/Dev/Python/sgc-env/lib/python3.10/site-packages/djongo/sql2mongo/query.py", line 1002, in _select
    return SelectQuery(self.db, self.connection_properties, sm, self._params)
  File "/home/muriloventuroso/Dev/Python/sgc-env/lib/python3.10/site-packages/djongo/sql2mongo/query.py", line 121, in __init__
    super().__init__(*args)
  File "/home/muriloventuroso/Dev/Python/sgc-env/lib/python3.10/site-packages/djongo/sql2mongo/query.py", line 67, in __init__
    self.parse()
  File "/home/muriloventuroso/Dev/Python/sgc-env/lib/python3.10/site-packages/djongo/sql2mongo/query.py", line 157, in parse
    self.where = WhereConverter(self, statement)
  File "/home/muriloventuroso/Dev/Python/sgc-env/lib/python3.10/site-packages/djongo/sql2mongo/converters.py", line 28, in __init__
    self.parse()
  File "/home/muriloventuroso/Dev/Python/sgc-env/lib/python3.10/site-packages/djongo/sql2mongo/converters.py", line 120, in parse
    self.op = WhereOp(
  File "/home/muriloventuroso/Dev/Python/sgc-env/lib/python3.10/site-packages/djongo/sql2mongo/operators.py", line 501, in __init__
    self._statement2ops()
  File "/home/muriloventuroso/Dev/Python/sgc-env/lib/python3.10/site-packages/djongo/sql2mongo/operators.py", line 454, in _statement2ops
    op = self._token2op(tok, statement)
  File "/home/muriloventuroso/Dev/Python/sgc-env/lib/python3.10/site-packages/djongo/sql2mongo/operators.py", line 421, in _token2op
    op = CmpOp(tok, self.query)
  File "/home/muriloventuroso/Dev/Python/sgc-env/lib/python3.10/site-packages/djongo/sql2mongo/operators.py", line 535, in __init__
    self._operator = OPERATOR_MAP[self.statement.token_next(0)[1].value]
KeyError: 'iLIKE'

muriloventuroso avatar Aug 26 '22 18:08 muriloventuroso

found same issue with iexact

mlodic avatar Sep 20 '22 07:09 mlodic

I think this problem may be caused by sqlparse version upgrade.

MrScallion avatar Sep 21 '22 07:09 MrScallion

@gregorlulichtec this seems related to the upgrade of sqlparse (https://github.com/doableware/djongo/commit/49ac474a1edda857ea92329de7f3efee7d30f3e6), it is not working on master but it works with djongo 1.3.6, can you take a look on it, please?

pimuzzo avatar Nov 04 '22 13:11 pimuzzo

I did some research on this. Since sqlparse==0.3.1, LIKE, iLIKE, NOT LIKE, and NOT ILIKE are parsed as comparison operators and not as simple keywords anymore, see https://github.com/andialbrecht/sqlparse/pull/525.

This means, they are not detected anymore here: https://github.com/doableware/djongo/blob/49ac474a1edda857ea92329de7f3efee7d30f3e6/djongo/sql2mongo/operators.py#L407-L411

The solution seems to be integrating LikeOp and iLikeOp into CmpOp.

KonRatt avatar Nov 15 '22 19:11 KonRatt