use serde::{Deserialize, Serialize};
use serde_json::json;
#[cfg(feature = "graphql")]
use crate::search::{query::CompoundQueryInput, SortInput};
use crate::{
scalars::SortedValue,
search::{query::CompoundQuery, Sort},
};
#[cfg(feature = "graphql")]
#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
#[derive(async_graphql::InputObject, Serialize, Clone, Debug)]
#[cfg_attr(feature = "builder", builder(field_defaults(setter(into))))]
pub struct RequestInput {
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "CompoundQueryInput::is_empty")]
pub query: CompoundQueryInput,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub sort: Vec<SortInput>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<u64>,
#[graphql(default)]
#[cfg_attr(feature = "builder", builder(default))]
pub terminate_after: u64,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(rename = "search_after", skip_serializing_if = "Vec::is_empty")]
pub after: Vec<SortedValue>,
#[cfg_attr(feature = "builder", builder(default))]
pub version: bool,
#[cfg_attr(feature = "builder", builder(default))]
pub seq_no_primary_term: bool,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Option::is_none")]
pub track_total_hits: Option<u64>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Option::is_none")]
pub highlight: Option<HighlightOptionsInput>,
}
#[cfg(feature = "graphql")]
impl RequestInput {
#[inline]
pub fn query_mut(&mut self) -> &mut CompoundQueryInput {
&mut self.query
}
}
#[cfg_attr(feature = "graphql", derive(async_graphql::SimpleObject))]
#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
#[derive(Serialize, Clone, Debug)]
#[cfg_attr(feature = "builder", builder(field_defaults(setter(into))))]
pub struct Request {
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "CompoundQuery::is_empty")]
pub query: CompoundQuery,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub sort: Vec<Sort>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<u64>,
#[cfg_attr(feature = "builder", builder(default))]
pub terminate_after: u64,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(rename = "search_after", skip_serializing_if = "Vec::is_empty")]
pub after: Vec<SortedValue>,
#[cfg_attr(feature = "builder", builder(default))]
pub version: bool,
#[cfg_attr(feature = "builder", builder(default))]
pub seq_no_primary_term: bool,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Option::is_none")]
pub track_total_hits: Option<u64>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Option::is_none")]
pub highlight: Option<HighlightOptions>,
}
impl Request {
#[inline]
pub fn query_mut(&mut self) -> &mut CompoundQuery {
&mut self.query
}
}
#[cfg(feature = "graphql")]
#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
#[derive(async_graphql::InputObject, Serialize, Deserialize, Clone, Debug)]
#[cfg_attr(feature = "builder", builder(field_defaults(setter(into))))]
pub struct HighlightOptionsInput {
pub fields: crate::scalars::Map,
#[graphql(name = "type", default)]
#[serde(rename = "type")]
#[cfg_attr(feature = "builder", builder(default))]
pub ty: HighlighterType,
#[graphql(default_with = "5")]
#[cfg_attr(feature = "builder", builder(default = 5))]
pub number_of_fragments: u64,
#[graphql(default_with = "100")]
#[cfg_attr(feature = "builder", builder(default = 100))]
pub fragment_size: u32,
#[graphql(default_with = "20")]
#[cfg_attr(feature = "builder", builder(default = 20))]
pub boundary_max_scan: u32,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "builder", builder(default))]
pub tags_schema: Option<String>,
#[graphql(default)]
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Vec::is_empty")] pub pre_tags: Vec<String>,
#[graphql(default)]
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Vec::is_empty")] pub post_tags: Vec<String>,
#[graphql(default = true)]
#[cfg_attr(feature = "builder", builder(default = true))]
pub require_field_match: bool,
}
#[cfg_attr(feature = "graphql", derive(async_graphql::SimpleObject))]
#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
#[derive(Serialize, Deserialize, Clone, Debug)]
#[cfg_attr(feature = "builder", builder(field_defaults(setter(into))))]
pub struct HighlightOptions {
pub fields: crate::scalars::Map,
#[serde(rename = "type")]
#[cfg_attr(feature = "builder", builder(default))]
pub ty: HighlighterType,
#[cfg_attr(feature = "builder", builder(default = 5))]
pub number_of_fragments: u64,
#[cfg_attr(feature = "builder", builder(default = 100))]
pub fragment_size: u32,
#[cfg_attr(feature = "builder", builder(default = 20))]
pub boundary_max_scan: u32,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "builder", builder(default))]
pub tags_schema: Option<String>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Vec::is_empty")] pub pre_tags: Vec<String>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(skip_serializing_if = "Vec::is_empty")] pub post_tags: Vec<String>,
#[cfg_attr(feature = "builder", builder(default = true))]
pub require_field_match: bool,
}
impl Default for HighlightOptions {
#[inline]
fn default() -> Self {
let fields = [("*".to_string(), json!({}).into())]
.iter()
.cloned()
.collect();
HighlightOptions {
fields,
ty: HighlighterType::default(),
number_of_fragments: 5,
fragment_size: 100,
boundary_max_scan: 20,
tags_schema: Some("styled".to_string()),
pre_tags: vec![],
post_tags: vec![],
require_field_match: true,
}
}
}
#[cfg_attr(feature = "graphql", derive(async_graphql::Enum, Eq, PartialEq, Copy))]
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "lowercase")]
pub enum HighlighterType {
Unified,
Plain,
Fvh,
}
impl Default for HighlighterType {
#[inline]
fn default() -> Self {
Self::Unified
}
}