Update to new Index API, reduce allocations
This commit is contained in:
@@ -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<_>>(),
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(¶meters, &id) {
|
Ok(core) => match core.get_by_id(¶meters, &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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user