Compare commits
3 Commits
5cbd2a0b69
...
a6865c6cbd
| Author | SHA1 | Date | |
|---|---|---|---|
| a6865c6cbd | |||
| 7c54dd4fc9 | |||
| bba41629f4 |
@@ -24,8 +24,8 @@ impl Query {
|
||||
&self.query
|
||||
}
|
||||
|
||||
pub fn resolution(&self) -> Option<Vec<u32>> {
|
||||
self.resolution.clone()
|
||||
pub fn resolution(&self) -> &Option<Vec<u32>> {
|
||||
&self.resolution
|
||||
}
|
||||
|
||||
pub fn volume(&self) -> Option<f64> {
|
||||
@@ -62,7 +62,7 @@ fn query((parameters, state): (Json<Query>, Data<RwLock<SharedState>>)) -> Handl
|
||||
parameters.resolution(),
|
||||
) {
|
||||
Err(_) => vec![], // FIXME: Return errors here instead!!
|
||||
Ok(objects) => to_spatial_objects(context.db(), objects),
|
||||
Ok(objects) => to_spatial_objects(objects),
|
||||
}
|
||||
})
|
||||
.collect::<Vec<_>>(),
|
||||
|
||||
@@ -22,7 +22,7 @@ fn get((core, state): (Path<String>, Data<RwLock<SharedState>>)) -> HandlerResul
|
||||
let core = core.to_string();
|
||||
let context = state.read().unwrap();
|
||||
|
||||
match context.db().core(core) {
|
||||
match context.db().core(&core) {
|
||||
Ok(core) => ok_200(&Core::from(core)),
|
||||
Err(_) => error_404(),
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ fn post((parameters, state): (Json<Filters>, Data<RwLock<SharedState>>)) -> Hand
|
||||
match context.filter(
|
||||
filter,
|
||||
core,
|
||||
space.clone(),
|
||||
&space,
|
||||
parameters.volume(),
|
||||
¶meters.view_port,
|
||||
parameters.resolution(),
|
||||
@@ -69,7 +69,7 @@ fn post((parameters, state): (Json<Filters>, Data<RwLock<SharedState>>)) -> Hand
|
||||
ok_200(
|
||||
&results
|
||||
.drain()
|
||||
.map(|x| Core::from(db.core(x).unwrap()))
|
||||
.map(|x| Core::from(db.core(&x).unwrap()))
|
||||
.collect::<Vec<_>>(),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ impl Filters {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn space(&self, db: &mercator_db::DataBase) -> Result<Option<String>, HandlerResult> {
|
||||
pub fn space(&self, db: &mercator_db::DataBase) -> Result<&Option<String>, HandlerResult> {
|
||||
if let Some(space_id) = &self.space {
|
||||
if !db.space_keys().contains(&space_id.to_string()) {
|
||||
return Err(error_422(format!(
|
||||
@@ -73,19 +73,17 @@ impl Filters {
|
||||
)));
|
||||
}
|
||||
}
|
||||
Ok(self.space.clone())
|
||||
Ok(&self.space)
|
||||
}
|
||||
|
||||
pub fn resolution(&self) -> Option<Vec<u32>> {
|
||||
self.resolution.clone()
|
||||
pub fn resolution(&self) -> &Option<Vec<u32>> {
|
||||
&self.resolution
|
||||
}
|
||||
|
||||
pub fn volume(&self) -> Option<f64> {
|
||||
match &self.view_port {
|
||||
None => None,
|
||||
Some((low, high)) => {
|
||||
Some(Shape::BoundingBox(low.clone().into(), high.clone().into()).volume())
|
||||
}
|
||||
Some((low, high)) => Some(Shape::BoundingBox(low.into(), high.into()).volume()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ fn get((path, state): (Path<String>, Data<RwLock<SharedState>>)) -> HandlerResul
|
||||
let name = path.to_string();
|
||||
let context = state.read().unwrap();
|
||||
|
||||
match context.db().space(name) {
|
||||
match context.db().space(&name) {
|
||||
Ok(space) => {
|
||||
let space: model::Space = space.into();
|
||||
ok_200(&space)
|
||||
|
||||
@@ -47,17 +47,17 @@ fn post((parameters, state): (Json<Filters>, Data<RwLock<SharedState>>)) -> Hand
|
||||
match context.filter(
|
||||
filter,
|
||||
core,
|
||||
space.clone(),
|
||||
&space,
|
||||
parameters.volume(),
|
||||
¶meters.view_port,
|
||||
parameters.resolution(),
|
||||
) {
|
||||
Err(e) => return error_422(e),
|
||||
Ok(objects) => {
|
||||
Ok(v) => {
|
||||
// We have a list of SpaceObjects, so extract
|
||||
// the space Ids
|
||||
for o in objects {
|
||||
results.insert(o.space_id);
|
||||
for (space_id, _) in v {
|
||||
results.insert(space_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -70,7 +70,7 @@ fn post((parameters, state): (Json<Filters>, Data<RwLock<SharedState>>)) -> Hand
|
||||
ok_200(
|
||||
&results
|
||||
.drain()
|
||||
.map(|id| match db.space(id) {
|
||||
.map(|id| match db.space(&id) {
|
||||
Err(_) => None,
|
||||
Ok(x) => Some(model::Space::from(x)),
|
||||
})
|
||||
|
||||
@@ -4,6 +4,7 @@ use actix_web::web;
|
||||
use actix_web::web::Data;
|
||||
use actix_web::web::Path;
|
||||
use mercator_db::CoreQueryParameters;
|
||||
use mercator_db::Properties;
|
||||
|
||||
use crate::model::to_spatial_objects;
|
||||
use crate::shared_state::SharedState;
|
||||
@@ -33,13 +34,26 @@ fn get((path, state): (Path<(String, String)>, Data<RwLock<SharedState>>)) -> Ha
|
||||
// Enforce highest resolution index.
|
||||
threshold_volume: None,
|
||||
view_port: &None,
|
||||
resolution: Some(vec![0]),
|
||||
resolution: &Some(vec![0]),
|
||||
};
|
||||
|
||||
match db.core(core) {
|
||||
match db.core(&core) {
|
||||
Ok(core) => match core.get_by_id(¶meters, &id) {
|
||||
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() {
|
||||
error_404()
|
||||
} else {
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
use std::collections::HashMap;
|
||||
use std::collections::HashSet;
|
||||
use std::sync::RwLock;
|
||||
|
||||
@@ -25,19 +26,19 @@ fn post(
|
||||
let context = state.read().unwrap();
|
||||
let db = context.db();
|
||||
|
||||
match db.core(core_id.clone()) {
|
||||
match db.core(&core_id) {
|
||||
Err(_) => error_404(),
|
||||
Ok(core) => match parameters.space(db) {
|
||||
Err(e) => e,
|
||||
Ok(space) => match parameters.filters() {
|
||||
None => {
|
||||
let mut results = HashSet::new();
|
||||
let mut results = HashMap::new();
|
||||
for property in core.keys().iter() {
|
||||
results.insert(property.id().clone());
|
||||
results.insert(property.id(), property);
|
||||
}
|
||||
|
||||
if parameters.ids_only() {
|
||||
ok_200(&results.drain().collect::<Vec<_>>())
|
||||
ok_200(&results.drain().map(|(k, _)| k).collect::<Vec<_>>())
|
||||
} else {
|
||||
let core_parameters = CoreQueryParameters {
|
||||
db,
|
||||
@@ -47,14 +48,27 @@ fn post(
|
||||
resolution: parameters.resolution(),
|
||||
};
|
||||
|
||||
let objects = results
|
||||
.drain()
|
||||
.flat_map(|id| match core.get_by_id(&core_parameters, id) {
|
||||
Err(_) => vec![], // FIXME: Return error ?
|
||||
Ok(r) => r,
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
let objects = to_spatial_objects(db, objects);
|
||||
let mut objects = vec![];
|
||||
for (id, properties) in results.drain() {
|
||||
match core.get_by_id(&core_parameters, id) {
|
||||
Err(_) => (), // FIXME: Return error ?
|
||||
Ok(r) => {
|
||||
let mut tmp = r
|
||||
.into_iter()
|
||||
.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)
|
||||
}
|
||||
@@ -72,13 +86,15 @@ fn post(
|
||||
Ok(objects) => {
|
||||
if parameters.ids_only() {
|
||||
let mut uniques = HashSet::new();
|
||||
for o in objects.iter() {
|
||||
uniques.insert(o.value.id().clone());
|
||||
for (_, v) in objects {
|
||||
for (_, properties) in v {
|
||||
uniques.insert(properties.id());
|
||||
}
|
||||
}
|
||||
|
||||
ok_200(&uniques.drain().collect::<Vec<_>>())
|
||||
} else {
|
||||
let objects = to_spatial_objects(db, objects);
|
||||
let objects = to_spatial_objects(objects);
|
||||
|
||||
ok_200(&objects)
|
||||
}
|
||||
|
||||
@@ -32,15 +32,15 @@ impl SharedState {
|
||||
&self.query_parser
|
||||
}
|
||||
|
||||
pub fn filter(
|
||||
&self,
|
||||
filter: &str,
|
||||
core: &str,
|
||||
output_space: Option<String>,
|
||||
pub fn filter<'q>(
|
||||
&'q self,
|
||||
filter: &'q str,
|
||||
core: &'q str,
|
||||
output_space: &'q Option<String>,
|
||||
volume: Option<f64>,
|
||||
view_port: &Option<(Vec<f64>, Vec<f64>)>,
|
||||
resolution: Option<Vec<u32>>,
|
||||
) -> mercator_db::ResultSet {
|
||||
view_port: &'q Option<(Vec<f64>, Vec<f64>)>,
|
||||
resolution: &'q Option<Vec<u32>>,
|
||||
) -> mercator_db::ResultSet<'q> {
|
||||
let parser = self.filter_parser();
|
||||
let parse;
|
||||
let parameters = CoreQueryParameters {
|
||||
@@ -92,14 +92,14 @@ impl SharedState {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn query(
|
||||
&self,
|
||||
pub fn query<'q>(
|
||||
&'q self,
|
||||
query: &str,
|
||||
core: &str,
|
||||
volume: Option<f64>,
|
||||
view_port: &Option<(Vec<f64>, Vec<f64>)>,
|
||||
resolution: Option<Vec<u32>>,
|
||||
) -> mercator_db::ResultSet {
|
||||
view_port: &'q Option<(Vec<f64>, Vec<f64>)>,
|
||||
resolution: &'q Option<Vec<u32>>,
|
||||
) -> mercator_db::ResultSet<'q> {
|
||||
let parser = self.query_parser();
|
||||
let parse;
|
||||
let parameters = CoreQueryParameters {
|
||||
|
||||
@@ -688,14 +688,14 @@ parameters:
|
||||
type: array
|
||||
items:
|
||||
type: number
|
||||
minimum: 0
|
||||
format: int32
|
||||
minimum: 0
|
||||
format: int32
|
||||
view_port:
|
||||
type: array
|
||||
items:
|
||||
type: array
|
||||
items:
|
||||
type: number
|
||||
items:
|
||||
type: number
|
||||
|
||||
Query:
|
||||
name: query
|
||||
@@ -712,14 +712,14 @@ parameters:
|
||||
type: array
|
||||
items:
|
||||
type: number
|
||||
minimum: 0
|
||||
format: int32
|
||||
minimum: 0
|
||||
format: int32
|
||||
view_port:
|
||||
type: array
|
||||
items:
|
||||
type: array
|
||||
items:
|
||||
type: number
|
||||
items:
|
||||
type: number
|
||||
|
||||
responses:
|
||||
Space200:
|
||||
|
||||
Reference in New Issue
Block a user