#29702: QuerySet database pattern regexp support
-----------------------------------------+------------------------
               Reporter:  ddalex         |          Owner:  nobody
                   Type:  Uncategorized  |         Status:  new
              Component:  Uncategorized  |        Version:  2.1
               Severity:  Normal         |       Keywords:
           Triage Stage:  Unreviewed     |      Has patch:  0
    Needs documentation:  0              |    Needs tests:  0
Patch needs improvement:  0              |  Easy pickings:  0
                  UI/UX:  0              |
-----------------------------------------+------------------------
 Currently there is no API to match a string against regex patterns stored
 in a database. Proposing an API to enable this functionality.

 == Current regex API

 The current set of QuerySet APIs supports regexp functions (i.e `__regex`
 and `__iregex`) support passing in a pattern that is matched against a
 field in the database. E.g. for a database `value_field=CharField()`
 containing the `foo`, `bar` and `for`, the queryset API
 `Q(value__regexp='.o.')` will match `foo` and `for` through a `value_field
 REGEX 'o'` WHERE clause.

 == New API proposal

 What is missing is an API to allow the regex (proposing `__revregex` and
 `__irevregex`) pattern to be stored in the field and to apply a WHERE
 clause on a string that returns pattern-matching entries in the database.

 E.G have the database field `pattern=CharField()` that stores a regex
 pattern, with the values '.o.' and '.*'.
 The queryset  statement `Q(pattern__revregex='foo')` will match both
 values, while the pattern `Q(pattern__revregex)='bar')` will match only
 the `.*` value.

 == Example

 Currently I'm implementing this with an `extra()` query:

 {{{

 class DisplayClassifiers(models.Model):
     regex_pattern = models.CharField(max_length=10, null=False)

 ....

  # return my classifiers that match the string supplied

 DisplayClassifiers.objects.extra(where=["'{0}' REGEXP
 regex_pattern".format(regex_pattern.replace("'", ""))])
 }}}

 This generates this SQL:
 {{{
  SELECT .... FROM `mainapp_displayclassifier` WHERE ('foo-bar-go' REGEXP
 regex_pattern)
 }}}

 Works as expected with mariadb 10.0.31

-- 
Ticket URL: <https://code.djangoproject.com/ticket/29702>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/049.5eb706db39e0643ab76f4b0fa9f44a31%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to