// Copyright 2023 Greptime Team // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. pub mod alter_expr; pub mod create_expr; pub mod insert_expr; pub mod repartition_expr; pub mod select_expr; use std::fmt; use datatypes::data_type::ConcreteDataType; use datatypes::types::TimestampType; use datatypes::value::Value; use rand::Rng; use crate::error::Error; use crate::ir::create_expr::ColumnOption; use crate::ir::{AlterTableExpr, Column, CreateTableExpr, Ident, RowValue}; pub type CreateTableExprGenerator = Box + Sync + Send>; pub type AlterTableExprGenerator = Box + Sync + Send>; pub type ColumnOptionGenerator = Box Vec>; pub type ConcreteDataTypeGenerator = Box>; pub type ValueGenerator = Box>) -> Value>; pub type TsValueGenerator = Box Value>; pub type ValueOverride = Box Option>; pub trait Generator { type Error: Sync + Send + fmt::Debug; fn generate(&self, rng: &mut R) -> Result; } pub trait Random { /// Generates a random element. fn generate(&self, rng: &mut R) -> T { self.choose(rng, 1).remove(0) } /// Uniformly sample `amount` distinct elements. fn choose(&self, rng: &mut R, amount: usize) -> Vec; } #[macro_export] macro_rules! impl_random { ($type: ident, $value:ident, $values: ident) => { impl Random<$type, R> for $value { fn choose(&self, rng: &mut R, amount: usize) -> Vec<$type> { // Collects the elements in deterministic order first. let mut result = std::collections::BTreeSet::new(); while result.len() != amount { result.insert($values.choose(rng).unwrap().clone()); } let mut result = result.into_iter().map(Into::into).collect::>(); // Shuffles the result slice. result.shuffle(rng); result } } }; }