#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 [email protected].
To post to this group, send email to [email protected].
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