only index _geo if it's set as sortable OR filterable

and only allow the filters if geo was set to filterable
This commit is contained in:
Tamo 2021-08-30 15:47:33 +02:00
parent f73273d71c
commit 5bb175fc90
No known key found for this signature in database
GPG Key ID: 20CD8020AFA88D69
3 changed files with 15 additions and 1 deletions

View File

@ -463,6 +463,9 @@ impl FilterCondition {
LowerThanOrEqual(val) => (Included(f64::MIN), Included(*val)), LowerThanOrEqual(val) => (Included(f64::MIN), Included(*val)),
Between(left, right) => (Included(*left), Included(*right)), Between(left, right) => (Included(*left), Included(*right)),
GeoLowerThan(point, distance) => { GeoLowerThan(point, distance) => {
if index.filterable_fields(rtxn)?.contains("_geo") {
Err(UserError::AttributeLimitReached)?; // TODO: TAMO use a real error
}
let mut result = RoaringBitmap::new(); let mut result = RoaringBitmap::new();
let rtree = match index.geo_rtree(rtxn)? { let rtree = match index.geo_rtree(rtxn)? {
Some(rtree) => rtree, Some(rtree) => rtree,
@ -477,6 +480,9 @@ impl FilterCondition {
return Ok(result); return Ok(result);
} }
GeoGreaterThan(point, distance) => { GeoGreaterThan(point, distance) => {
if index.filterable_fields(rtxn)?.contains("_geo") {
Err(UserError::AttributeLimitReached)?; // TODO: TAMO use a real error
}
let result = Self::evaluate_operator( let result = Self::evaluate_operator(
rtxn, rtxn,
index, index,

View File

@ -687,6 +687,8 @@ mod tests {
let mut wtxn = index.write_txn().unwrap(); let mut wtxn = index.write_txn().unwrap();
let mut builder = Settings::new(&mut wtxn, &index, 0); let mut builder = Settings::new(&mut wtxn, &index, 0);
builder.set_primary_key(S("id")); builder.set_primary_key(S("id"));
builder.set_filterable_fields(hashset!(S("_geo")));
builder.set_sortable_fields(hashset!(S("_geo")));
builder.execute(|_, _| ()).unwrap(); builder.execute(|_, _| ()).unwrap();
let content = &r#"[ let content = &r#"[

View File

@ -234,7 +234,13 @@ impl<'t, 'u, 'i, 'a> IndexDocuments<'t, 'u, 'i, 'a> {
// get filterable fields for facet databases // get filterable fields for facet databases
let faceted_fields = self.index.faceted_fields_ids(self.wtxn)?; let faceted_fields = self.index.faceted_fields_ids(self.wtxn)?;
// get the fid of the `_geo` field. // get the fid of the `_geo` field.
let geo_field_id = self.index.fields_ids_map(self.wtxn)?.id("_geo"); let geo_field_id = if let Some(gfid) = self.index.fields_ids_map(self.wtxn)?.id("_geo") {
(self.index.sortable_fields_ids(self.wtxn)?.contains(&gfid)
|| self.index.filterable_fields_ids(self.wtxn)?.contains(&gfid))
.then(|| gfid)
} else {
None
};
let stop_words = self.index.stop_words(self.wtxn)?; let stop_words = self.index.stop_words(self.wtxn)?;
// let stop_words = stop_words.as_ref(); // let stop_words = stop_words.as_ref();