A query language that can be learned by normal users, similar to an internet search engine. To empower users to filter and sort data in a kind of natural language while preserving permissions.
The search query entered by the user is parsed and converted into an SQL WHERE clause. For the best possible user experience, field-free queries are sent to all syntactically eligible fields as similarity (LIKE) searches.
A query like "plz=26440-26452 OR (Eisen AND sn!=Hammer*); plz" could generate a
WHERE-Clause for such kind of SELECT:
SELECTpa.shortname, pa.description, pa.taxnumber, pb.longname, pb.postcode, pb.city, pb.streetFROM
partner_partner pa, partner_branchstore pb
WHEREpa.id=pb.cmrpartnerAND
(
( pb.postcode>='26440'ANDpb.postcode<='26452'
) OR
( pa.shortname ILIKE '%Eisen%'ORpa.description ILIKE '%Eisen%'ORpa.taxnumber ILIKE '%Eisen%'ORpb.city ILIKE '%Eisen%'ORpb.street ILIKE '%Eisen%'
) AND
NOT pa.shortname ILIKE 'Hammer%'
)
LIMIT20;| Boolean Operator | Alternative Symbol | Description |
|---|---|---|
| AND | && | Requires both terms on either side of the Boolean operator to be present for a match. |
| NOT | ! | Requires that the following term not be present. |
| OR | || | Requires that either term (or both terms) be present for a match. |
The fields available for searching are registered:
DbField::new("db-fieldname", db-type, "permission", &["name", "alternative_name", "abbr"]),
use permeable::AllowAllPermission;use suchbar::{DbField,Suchbar};use suchbar::DbType::*;constSUCHBAR:Suchbar = Suchbar::new(&[// fieldname in SQL, fieldtype Permission Aliases for queryDbField::new("pa.shortname",TEXT,"STD",&["sname","sn"]),DbField::new("pa.description",TEXT,"STD",&["desc","d"]),DbField::new("pa.taxnumber",VARCHAR(15),"STD",&["ust_id","taxid","ustid","vatid"]),DbField::new("pb.city",VARCHAR(35),"STD",&["city","ort"]),DbField::new("pb.street",VARCHAR(55),"STD",&["street","st"]),DbField::new("pb.postcode",VARCHAR(5),"STD",&["plz","zip"]),]);fnmain(){let query = "plz=26440-26452 OR (Eisen AND sn!=Hammer*)";matchSUCHBAR.exec(&AllowAllPermission(), query){Err(error) => println!("\nParseError: {error}"),Ok(sr) => match sr.to_sql("AND"){Err(error) => println!("\nContentError: {error}"),Ok(clause) => println!("SELECT pa.shortname, pa.description, pa.taxnumber, \ pb.longname, pb.postcode AS INTEGER, pb.city, pb.street \ FROM partner_partner pa, partner_branchstore pb \ WHERE pa.id = pb.cmrpartner{clause} LIMIT 20",),}}}