Skip to main content

Filterparams

Project description

# Python Filterparams #

Filterparams is a library for parsing URL paramters for filter
purposes in a backend. It provides a syntax to map SQL-like
queries on top of the query parameters and parses it into a
python object.

This is a helper library for providing filter collection APIs.
The primary use case for developing the library is to
use it with a REST-API which uses the [JSONAPI](http://jsonapi.org/)
standard. Because of this the syntax is completely compatible with
the standard and encapsulates everything in the `filter` query
parameter.

## Example ##

Given the URL (non URL escaped for better readability):
```
/users?filter[param][name][like][no_default_name]=doe&filter[param][first_name]=doe%&filter[binding]=(!no_brand_name&first_name)&filter[order]=name&filter[order]=desc(first_name)
```

It can be parsed by the given function:

```python
from filterparams import build_parser
valid_filters = ['eq', 'like']
default_filter = 'eq'

parser = build_parser(
valid_filters=valid_filters,
default_filter=default_filter,
)

query = parser(

)
```

Would parse the data. You can access the parsed filters through
`.param_order` and the orders through `.orders`. The param order
in this specific case would be resolved to:

```python
And(
left=Parameter(
name='name',
alias='no_default_name',
filter='like',
value='doe%',
),
right=Parameter(
name='first_name',
alias='first_name',
filter='eq',
value='doe',
)
)
```

The orders would be:

```python
[Order(name='name', direction='asc'),
Order(name='first_name', direction='desc')]
```

## Syntax ##

All arguments must be prefixed by "filter". It is possible to
query for specific data with filters, apply orders to the result
and to combine filters through AND, NOT and OR bindings.

The syntax builds under the filter parameter a virtual object.
The keys of the object are simulated through specifying `[{key}]`
in the passed query parameter. Thus `filter[param]` would point
to the param key in the filter object.

### Filter specification ###

The solution supports to query data through the `param` subkey.

```
filter[param][{parameter_name}][{operation}][{alias}] = {to_query_value}
```

The `operation` and `alias` parameters may be omitted. If no
`alias` is provided the given parameter name is used for it.
If no `operation` is given, the default one is used (in the
example this would be equal).

Example:
```
filter[param][phone_number][like]=001%
```

This would add a filter to all phone numbers which start with "001".

### Filter binding ###

Per default all filters are combined through AND clauses.
You can change that by specifying the `filter[binding]` argument.

This is where the aliases which you can define come into place.
The binding provides means to combine filters with AND and OR.
Also you are able to negate filters here.

The filters are addressed by their alias or name, if no alias is
provided.

If you have a filter `search_for_name`, `search_for_phone_number`
and `search_for_account_number` defined you can say
`search_for_name OR NOT search_for_number AND search_for_account_number`
by specifying the following filter:

```
filter[binding]=search_for_name|(!search_for_phone_number&search_for_account_number)
```

Even though the brackets are useless here, you can use them in
more complex filters.

The following table summarizes the possible configuration options:
<table>
<thead>
<tr>
<th>Type</th>
<th>Symbol</th>
<th>Example</th>
</tr>
</thead>
<tbody>
<tr>
<td>AND</td>
<td>&</td>
<td>a&b</td>
</tr>
<tr>
<td>OR</td>
<td>|</td>
<td>a|b</td>
</tr>
<tr>
<td>NOT</td>
<td>!</td>
<td>!a</td>
</tr>
<tr>
<td>Bracket</td>
<td>()</td>
<td>(a|b)&c</td>
</tr>
</tbody>
</table>

### Ordering ###

To specify a sort order of the results the `filter[order]` parameter
may be used. The value can be specified multiple times. To add
ordering you have to provide the name of the parameter which should
be ordered, not its alias!

If you want to order by `name`, `first_name` and in reverse order
`balance` you can do so by specifying the following query url
parameters:

```
filter[order]=name&filter[order]=first_name&filter[order]=desc(balance)
```

As you can see the `desc()` definition can be used to indicate
reverse ordering.

### Filter definition ###

Not every backend does or should support all possible filter
mechanisms. This is why the filters which should be accepted
by the backend have to be added before processing the query
parameters.

You can limit the allowed filters by building a parse through the
`filterparams.build_parser` function. You can configure the allowed
filters through the `valid_filters` definition. Additionally you
have to add the default filter by using the second `default_filter`
parameter.

```python
from filterparams import build_parser

valid_filters = ['eq', 'like']
default_filter = 'eq'

parser = build_parser(
valid_filters=valid_filters,
default_filter=default_filter,
)

query = parser({})
```

If you don't want any validation you can use the `parse` function.

```python
from filterparams import parse

query = parse({})
```

## Notes ##

- There do no yet exist any public projects which use this library to provide transparent mapping to an underlying
backend. I plan long-term to add another library which does use this package and provide a way to map it on sqlalchemy models.
If you are planning to do this or use it for other data mapping please contact me and I'll add a reference to it in
the README.
- The same as mentioned above is valid for client libraries, which generate the filter query structure in any language.
Again, as soon as the API is stable I'll probably add a JavaScript library.
- Depending on your backend it might not make sense to support all features (ordering, parameter binding) of the
language. You might still want to use it to parse your basic parameters though and ignore the rest.

## Used Libraries ##

For evaluating the filter params ordering the [funcparserlib](https://github.com/vlasovskikh/funcparserlib) ([MIT license](https://github.com/vlasovskikh/funcparserlib/blob/master/LICENSE))
module is used. Additionally the [Werkzeug](https://github.com/mitsuhiko/werkzeug/blob/master/LICENSE) package is used for supporting dicts with multiple values in the same key.

## Other Languages ##

This is a list of projects implementing the same API for other languages.
Currently this list only has one entry.

- Go - [go-filterparams](https://github.com/cbrand/go-filterparams)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

filterparams-1.0.0.tar.gz (9.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

filterparams-1.0.0-py3.5.egg (5.3 kB view details)

Uploaded Egg

filterparams-1.0.0-py3.4.egg (12.8 kB view details)

Uploaded Egg

filterparams-1.0.0-py3.3.egg (13.0 kB view details)

Uploaded Egg

filterparams-1.0.0-py3.2.egg (11.0 kB view details)

Uploaded Egg

filterparams-1.0.0-py3-none-any.whl (6.6 kB view details)

Uploaded Python 3

filterparams-1.0.0-py2.7.egg (5.5 kB view details)

Uploaded Egg

filterparams-1.0.0-py2-none-any.whl (6.8 kB view details)

Uploaded Python 2

File details

Details for the file filterparams-1.0.0.tar.gz.

File metadata

  • Download URL: filterparams-1.0.0.tar.gz
  • Upload date:
  • Size: 9.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for filterparams-1.0.0.tar.gz
Algorithm Hash digest
SHA256 33e5e776d99d8ecc5c11f610db5fb4562bd24367dd991a84e6dceaabc5e6d1f2
MD5 bde39a1d253c82703d23d17b13a8ea9d
BLAKE2b-256 97cab30397d0db5aa79d28666c0627ae60d9e102c47cc133d7744f20b90fbec9

See more details on using hashes here.

File details

Details for the file filterparams-1.0.0-py3.5.egg.

File metadata

File hashes

Hashes for filterparams-1.0.0-py3.5.egg
Algorithm Hash digest
SHA256 2538c205cf0739cb4ea1feb596522438a0edda448aacb699b65daf804891478c
MD5 33b084013438324687bd33262ceafca6
BLAKE2b-256 1e6a935394d1b446c50a4825e989a105a634ed2ff79fa3c4242c808d678f791a

See more details on using hashes here.

File details

Details for the file filterparams-1.0.0-py3.4.egg.

File metadata

File hashes

Hashes for filterparams-1.0.0-py3.4.egg
Algorithm Hash digest
SHA256 5e7baabdcf3ecf05dc1ac1bf216fc7994b5e8528ad3c1850e558261fa05fca1a
MD5 61a5965ebfd63a9dfba259c7bdf3a434
BLAKE2b-256 aaca3b11d56ef03fe231b8066d63fa0cf92d1a574c2c6ca7eb4bf25099db4aa6

See more details on using hashes here.

File details

Details for the file filterparams-1.0.0-py3.3.egg.

File metadata

File hashes

Hashes for filterparams-1.0.0-py3.3.egg
Algorithm Hash digest
SHA256 757a8473e001fa9fd3f4f30f8d026002e5f4406e8d2c2ce6c3a8a2a0d17d00f1
MD5 1a7f2f8f7e9a86867d9992fcca6e9df1
BLAKE2b-256 c969868ef4c94068ff20c72444fca45cef965a49ae3a7e859d5e4ac7220d24ab

See more details on using hashes here.

File details

Details for the file filterparams-1.0.0-py3.2.egg.

File metadata

File hashes

Hashes for filterparams-1.0.0-py3.2.egg
Algorithm Hash digest
SHA256 ab79b6c116801bbdd1d19de8c74a7656b87d881682413faf015326ba962487f4
MD5 41019118e71eec62a3e484188730f0fa
BLAKE2b-256 9317ed6c730c1fcf36ce20cfd57231ff3017dec2da583b7ab92b591eeff00ea0

See more details on using hashes here.

File details

Details for the file filterparams-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for filterparams-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 650e67187849e21145b56fa222d68020e7dbf0e40d0b6f1387089010896a400d
MD5 54c89b7ba5319fe371756692f16f608b
BLAKE2b-256 5ee39f8c781522eee6cca6e41b91bc03fda6539d191dc026c1aa34b8a31061fe

See more details on using hashes here.

File details

Details for the file filterparams-1.0.0-py2.7.egg.

File metadata

File hashes

Hashes for filterparams-1.0.0-py2.7.egg
Algorithm Hash digest
SHA256 7ae8042b5188c12e7b177ff472422339daf2337a95beb9b77cbd1f1f9c153ab4
MD5 284a268d2e4c6f6441b9797dec689409
BLAKE2b-256 23d22980f35db71ffcb9de32e2d609fa388a4cd06bd820a689e6a193c3f2acce

See more details on using hashes here.

File details

Details for the file filterparams-1.0.0-py2-none-any.whl.

File metadata

File hashes

Hashes for filterparams-1.0.0-py2-none-any.whl
Algorithm Hash digest
SHA256 0681ebe05d49523029009a4f71bb755f275377fe00d88f378592cf98710a169f
MD5 455675e16faa3f6b6df0b840997fce42
BLAKE2b-256 e732e7d77082da678dbbcd11a930412068513de43a946bf0a1bab6e3a7176a9c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page