Update to new Index API, reduce allocations

This commit is contained in:
2019-10-30 21:33:37 +01:00
parent 7c54dd4fc9
commit a6865c6cbd
5 changed files with 62 additions and 32 deletions

View File

@@ -62,7 +62,7 @@ fn query((parameters, state): (Json<Query>, Data<RwLock<SharedState>>)) -> Handl
parameters.resolution(), parameters.resolution(),
) { ) {
Err(_) => vec![], // FIXME: Return errors here instead!! Err(_) => vec![], // FIXME: Return errors here instead!!
Ok(objects) => to_spatial_objects(context.db(), objects), Ok(objects) => to_spatial_objects(objects),
} }
}) })
.collect::<Vec<_>>(), .collect::<Vec<_>>(),

View File

@@ -53,11 +53,11 @@ fn post((parameters, state): (Json<Filters>, Data<RwLock<SharedState>>)) -> Hand
parameters.resolution(), parameters.resolution(),
) { ) {
Err(e) => return error_422(e), Err(e) => return error_422(e),
Ok(objects) => { Ok(v) => {
// We have a list of SpaceObjects, so extract // We have a list of SpaceObjects, so extract
// the space Ids // the space Ids
for o in objects { for (space_id, _) in v {
results.insert(o.space_id); results.insert(space_id);
} }
} }
} }

View File

@@ -4,6 +4,7 @@ use actix_web::web;
use actix_web::web::Data; use actix_web::web::Data;
use actix_web::web::Path; use actix_web::web::Path;
use mercator_db::CoreQueryParameters; use mercator_db::CoreQueryParameters;
use mercator_db::Properties;
use crate::model::to_spatial_objects; use crate::model::to_spatial_objects;
use crate::shared_state::SharedState; use crate::shared_state::SharedState;
@@ -39,7 +40,20 @@ fn get((path, state): (Path<(String, String)>, Data<RwLock<SharedState>>)) -> Ha
match db.core(&core) { match db.core(&core) {
Ok(core) => match core.get_by_id(&parameters, &id) { Ok(core) => match core.get_by_id(&parameters, &id) {
Ok(objects) => { Ok(objects) => {
let results = to_spatial_objects(db, objects); let value = Properties::Feature(id);
let tmp = objects
.into_iter()
.map(|(space, positions)| {
let shapes = positions
.into_iter()
.map(|position| (position, &value))
.collect();
(space, shapes)
})
.collect();
let results = to_spatial_objects(tmp);
if results.is_empty() { if results.is_empty() {
error_404() error_404()
} else { } else {

View File

@@ -1,3 +1,4 @@
use std::collections::HashMap;
use std::collections::HashSet; use std::collections::HashSet;
use std::sync::RwLock; use std::sync::RwLock;
@@ -31,13 +32,13 @@ fn post(
Err(e) => e, Err(e) => e,
Ok(space) => match parameters.filters() { Ok(space) => match parameters.filters() {
None => { None => {
let mut results = HashSet::new(); let mut results = HashMap::new();
for property in core.keys().iter() { for property in core.keys().iter() {
results.insert(property.id()); results.insert(property.id(), property);
} }
if parameters.ids_only() { if parameters.ids_only() {
ok_200(&results.drain().collect::<Vec<_>>()) ok_200(&results.drain().map(|(k, _)| k).collect::<Vec<_>>())
} else { } else {
let core_parameters = CoreQueryParameters { let core_parameters = CoreQueryParameters {
db, db,
@@ -47,14 +48,27 @@ fn post(
resolution: parameters.resolution(), resolution: parameters.resolution(),
}; };
let objects = results let mut objects = vec![];
.drain() for (id, properties) in results.drain() {
.flat_map(|id| match core.get_by_id(&core_parameters, id) { match core.get_by_id(&core_parameters, id) {
Err(_) => vec![], // FIXME: Return error ? Err(_) => (), // FIXME: Return error ?
Ok(r) => r, Ok(r) => {
}) let mut tmp = r
.collect::<Vec<_>>(); .into_iter()
let objects = to_spatial_objects(db, objects); .map(|(space, positions)| {
let shapes = positions
.into_iter()
.map(|position| (position, properties))
.collect();
(space, shapes)
})
.collect();
objects.append(&mut tmp);
}
}
}
let objects = to_spatial_objects(objects);
ok_200(&objects) ok_200(&objects)
} }
@@ -72,13 +86,15 @@ fn post(
Ok(objects) => { Ok(objects) => {
if parameters.ids_only() { if parameters.ids_only() {
let mut uniques = HashSet::new(); let mut uniques = HashSet::new();
for o in objects.iter() { for (_, v) in objects {
uniques.insert(o.value.id()); for (_, properties) in v {
uniques.insert(properties.id());
}
} }
ok_200(&uniques.drain().collect::<Vec<_>>()) ok_200(&uniques.drain().collect::<Vec<_>>())
} else { } else {
let objects = to_spatial_objects(db, objects); let objects = to_spatial_objects(objects);
ok_200(&objects) ok_200(&objects)
} }

View File

@@ -32,15 +32,15 @@ impl SharedState {
&self.query_parser &self.query_parser
} }
pub fn filter( pub fn filter<'q>(
&self, &'q self,
filter: &str, filter: &'q str,
core: &str, core: &'q str,
output_space: &Option<String>, output_space: &'q Option<String>,
volume: Option<f64>, volume: Option<f64>,
view_port: &Option<(Vec<f64>, Vec<f64>)>, view_port: &'q Option<(Vec<f64>, Vec<f64>)>,
resolution: &Option<Vec<u32>>, resolution: &'q Option<Vec<u32>>,
) -> mercator_db::ResultSet { ) -> mercator_db::ResultSet<'q> {
let parser = self.filter_parser(); let parser = self.filter_parser();
let parse; let parse;
let parameters = CoreQueryParameters { let parameters = CoreQueryParameters {
@@ -92,14 +92,14 @@ impl SharedState {
} }
} }
pub fn query( pub fn query<'q>(
&self, &'q self,
query: &str, query: &str,
core: &str, core: &str,
volume: Option<f64>, volume: Option<f64>,
view_port: &Option<(Vec<f64>, Vec<f64>)>, view_port: &'q Option<(Vec<f64>, Vec<f64>)>,
resolution: &Option<Vec<u32>>, resolution: &'q Option<Vec<u32>>,
) -> mercator_db::ResultSet { ) -> mercator_db::ResultSet<'q> {
let parser = self.query_parser(); let parser = self.query_parser();
let parse; let parse;
let parameters = CoreQueryParameters { let parameters = CoreQueryParameters {