speedup CONTAINS when un-necessary REPLACE

This commit is contained in:
mdipierro
2013-06-24 14:24:36 -05:00
parent 51e510e30f
commit 7564f5f671
3 changed files with 17 additions and 7 deletions
+14 -5
View File
@@ -1255,13 +1255,22 @@ class BaseAdapter(ConnectionPool):
return '(%s LIKE %s)' % (self.expand(first),
self.expand('%'+second, 'string'))
def CONTAINS(self,first,second,case_sensitive=False):
def CONTAINS(self,first,second,case_sensitive=False):
if first.type in ('string','text', 'json'):
second = Expression(None,self.CONCAT('%',Expression(
None,self.REPLACE(second,('%','%%'))),'%'))
if isinstance(second,Expression):
second = Expression(None,self.CONCAT('%',Expression(
None,self.REPLACE(second,('%','%%'))),'%'))
else:
second = '%'+str(second).replace('%','%%')+'%'
elif first.type.startswith('list:'):
second = Expression(None,self.CONCAT('%|',Expression(None,self.REPLACE(
Expression(None,self.REPLACE(second,('%','%%'))),('|','||'))),'|%'))
if isinstance(second,Expression):
second = Expression(None,self.CONCAT(
'%|',Expression(None,self.REPLACE(
Expression(None,self.REPLACE(
second,('%','%%'))),('|','||'))),'|%'))
else:
second = '%|'+str(second).replace('%','%%')\
.replace('|','||')+'|%'
op = case_sensitive and self.LIKE or self.ILIKE
return op(first,second)