NAME OData::QueryParams::DBIC - parse OData style query params and provide info for DBIC queries. VERSION version 0.09 SYNOPSIS use OData::QueryParams::DBIC; my $query_string = 'orderby=username asc, userid'; my ($where,$opts) = params_to_dbic( $query_string ); # $where = {} # $opts = { order_by => [ {-asc => 'username'}, {-asc => 'userid'} ] } # can be used in # $schema->resultset('users')->search( $where, $opts ); DESCRIPTION The OData <https://www.odata.org> protocol defines the behaviour of Query String Options <https://www.odata.org/documentation/odata-version-2-0/uri-conventions/#QueryStringOptions>. This module aims to help you when you want to use the OData query string options with an application that uses DBIx::Class <https://metacpan.org/pod/DBIx::Class>. It parses the query parameters and creates a hash of DBIx::Class options that can be used in the search method. EXPORTED FUNCTION params_to_dbic This function returns a hash reference of options that can be used as options for the search method in DBIx::Class. use OData::QueryParams::DBIC; my $query_string = 'orderby=username asc, userid'; my ($where,$opts) = params_to_dbic( $query_string ); More examples: my $query_string = 'filter=Price eq 5&orderby=username asc, userid'; my ($where,$opts) = params_to_dbic( $query_string ); # $where = { Price => 5 } # $opts = { order_by => [ {-asc => 'username'}, {-asc => 'userid'} ] } my $query_string = 'select=Price&orderby=username asc, userid'; my ($where,$opts) = params_to_dbic( $query_string ); # $where = {} # $opts = { columns => ['Price'], order_by => [ {-asc => 'username'}, {-asc => 'userid'} ] } my $query_string = 'orderby=username asc, userid'; my ($where,$opts) = params_to_dbic( $query_string ); # $where = {} # $opts = { order_by => [ {-asc => 'username'}, {-asc => 'userid'} ] } SUPPORTED QUERY PARAMS filter This lists the top number of entries. my $query_string = 'filter=Price le 100'; my ($where, $opts) = paras_to_dbic( $query_string ); # $where = { Price => { '<=' => 100 } } Currently only simple filters are supported: "filter=Price le 3.5 or Price gt 200" => { -or => [ { Price => { '<=' => 3.5 } }, { Price => { '>' => 200 } } ] } }, "filter=Price le 200 and Price gt 3.5" => { -and => [ { Price => { '<=' => 200 } }, { Price => { '>' => 3.5 } } ] }, "filter=Price le 100" => { Price => { '<=' => 100 } }, "filter=Price lt 20" => { Price => { '<' => 20 } }, "filter=Price ge 10" => { Price => { '>=' => 10 } }, "filter=Price gt 20" => { Price => { '>' => 20 } }, "filter=Address/City ne 'London'" => { 'Address.City' => { '!=' => 'London' } }, "filter=Address/City eq 'Redmond'" => { 'Address.City' => 'Redmond' }, orderby This orders the list of entries by the given column. A simple query string: my $query_string = 'orderby=username'; my $opts = paras_to_dbic( $query_string ); # $opts = { order_by => [ {-asc => 'username'} ] }; A more complex one: my $query_string = 'orderby=username asc, userid asc'; my $opts = paras_to_dbic( $query_string ); # $opts = { order_by => [ {-asc => 'username'}, {-asc => 'userid'} ] }; skip In combination with top, this can be used for pagination. my $query_string = 'skip=5'; my $opts = paras_to_dbic( $query_string ); # $opts = { page => 5 } top This lists the top number of entries. my $query_string = 'top=5'; my $opts = paras_to_dbic( $query_string ); # $opts = { rows => 5 } AUTHOR Renee Baecker <reneeb@cpan.org> COPYRIGHT AND LICENSE This software is Copyright (c) 2018 by Renee Baecker. This is free software, licensed under: The Artistic License 2.0 (GPL Compatible)