use std::path::PathBuf;
use url::Url;
use crate::{
AnalysisProbrem, Collection, ContextHandle, Nullability, ObjectKind, ObjectSummary, TextSpan,
TypeReference,
};
#[derive(serde::Serialize, serde::Deserialize)]
pub enum AnalyzeQueryInput {
Text(String),
File(PathBuf),
Url(Url),
}
#[derive(serde::Serialize, serde::Deserialize)]
pub struct AnalyzeQueryArgs {
context_handle: ContextHandle,
query: AnalyzeQueryInput,
}
#[derive(serde::Serialize, serde::Deserialize, derive_getters::Getters)]
pub struct AnalyzeQueryResponse {
queries: Collection<AnalyzeQueryItem>,
}
#[derive(serde::Serialize, serde::Deserialize)]
pub enum QueryKind {
Select,
Insert,
Update,
Delete,
Truncate,
}
#[derive(serde::Serialize, serde::Deserialize, derive_getters::Getters)]
pub struct AnalyzeQueryItem {
query_span: TextSpan,
query_kind: QueryKind,
probrems: Collection<AnalysisProbrem>,
accessing_relations: Collection<ObjectSummary>,
column_access: Collection<ColumnAccess>,
parameters: Collection<ParameterDescribe>,
result_columns: Collection<ResultSetColumn>,
}
#[derive(serde::Serialize, serde::Deserialize, derive_getters::Getters)]
pub struct ParameterDescribe {
name: String,
spans: Vec<TextSpan>,
type_candiate: Vec<TypeReference>,
nullability: Nullability,
}
#[derive(serde::Serialize, serde::Deserialize)]
pub enum ColumnAccessKind {
SelectResTarget,
SelectFrom,
SelectWhere,
SelectOrderBy,
SelectGroupBy,
SelectHaving,
UpdateSet,
UpdateSetValue,
UpdateFrom,
UpdateWhere,
InsertInto,
Delete,
}
#[derive(serde::Serialize, serde::Deserialize, derive_getters::Getters)]
pub struct ColumnAccess {
accessing_span: TextSpan,
relation_schema: String,
relation_local_name: String,
relation_kind: ObjectKind,
column_name: String,
column_ordinal: usize,
access_kind: ColumnAccessKind,
}
#[derive(serde::Serialize, serde::Deserialize, derive_getters::Getters)]
pub struct ResultSetColumn {
ordinal: u32,
name: String,
column_type: Option<TypeReference>,
nullability: Nullability,
}