Spaces:
Build error
Build error
File size: 4,108 Bytes
d8435ba |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
use actix_web::{post, web, Responder};
use actix_web_validator::{Json, Path, Query};
use collection::operations::shard_selector_internal::ShardSelectorInternal;
use collection::operations::types::{DiscoverRequest, DiscoverRequestBatch};
use itertools::Itertools;
use storage::content_manager::collection_verification::{
check_strict_mode, check_strict_mode_batch,
};
use storage::dispatcher::Dispatcher;
use tokio::time::Instant;
use crate::actix::api::read_params::ReadParams;
use crate::actix::api::CollectionPath;
use crate::actix::auth::ActixAccess;
use crate::actix::helpers::{self, get_request_hardware_counter, process_response_error};
use crate::common::points::do_discover_batch_points;
use crate::settings::ServiceConfig;
#[post("/collections/{name}/points/discover")]
async fn discover_points(
dispatcher: web::Data<Dispatcher>,
collection: Path<CollectionPath>,
request: Json<DiscoverRequest>,
params: Query<ReadParams>,
service_config: web::Data<ServiceConfig>,
ActixAccess(access): ActixAccess,
) -> impl Responder {
let DiscoverRequest {
discover_request,
shard_key,
} = request.into_inner();
let pass = match check_strict_mode(
&discover_request,
params.timeout_as_secs(),
&collection.name,
&dispatcher,
&access,
)
.await
{
Ok(pass) => pass,
Err(err) => return process_response_error(err, Instant::now(), None),
};
let shard_selection = match shard_key {
None => ShardSelectorInternal::All,
Some(shard_keys) => shard_keys.into(),
};
let request_hw_counter = get_request_hardware_counter(
&dispatcher,
collection.name.clone(),
service_config.hardware_reporting(),
);
let timing = Instant::now();
let result = dispatcher
.toc(&access, &pass)
.discover(
&collection.name,
discover_request,
params.consistency,
shard_selection,
access,
params.timeout(),
request_hw_counter.get_counter(),
)
.await
.map(|scored_points| {
scored_points
.into_iter()
.map(api::rest::ScoredPoint::from)
.collect_vec()
});
helpers::process_response(result, timing, request_hw_counter.to_rest_api())
}
#[post("/collections/{name}/points/discover/batch")]
async fn discover_batch_points(
dispatcher: web::Data<Dispatcher>,
collection: Path<CollectionPath>,
request: Json<DiscoverRequestBatch>,
params: Query<ReadParams>,
service_config: web::Data<ServiceConfig>,
ActixAccess(access): ActixAccess,
) -> impl Responder {
let request = request.into_inner();
let pass = match check_strict_mode_batch(
request.searches.iter().map(|i| &i.discover_request),
params.timeout_as_secs(),
&collection.name,
&dispatcher,
&access,
)
.await
{
Ok(pass) => pass,
Err(err) => return process_response_error(err, Instant::now(), None),
};
let request_hw_counter = get_request_hardware_counter(
&dispatcher,
collection.name.clone(),
service_config.hardware_reporting(),
);
let timing = Instant::now();
let result = do_discover_batch_points(
dispatcher.toc(&access, &pass),
&collection.name,
request,
params.consistency,
access,
params.timeout(),
request_hw_counter.get_counter(),
)
.await
.map(|batch_scored_points| {
batch_scored_points
.into_iter()
.map(|scored_points| {
scored_points
.into_iter()
.map(api::rest::ScoredPoint::from)
.collect_vec()
})
.collect_vec()
});
helpers::process_response(result, timing, request_hw_counter.to_rest_api())
}
pub fn config_discovery_api(cfg: &mut web::ServiceConfig) {
cfg.service(discover_points);
cfg.service(discover_batch_points);
}
|