use crate::expressions::{int_val, ExpOp, ExpType, Expression, ExpressionArgument, MODIFY};
use crate::operations::hll::HLLPolicy;
use crate::Value;
const MODULE: i64 = 2;
pub(crate) enum HllExpOp {
Init = 0,
Add = 1,
Count = 50,
Union = 51,
UnionCount = 52,
IntersectCount = 53,
Similarity = 54,
Describe = 55,
MayContain = 56,
}
pub fn init(policy: HLLPolicy, index_bit_count: Expression, bin: Expression) -> Expression {
init_with_min_hash(policy, index_bit_count, int_val(-1), bin)
}
pub fn init_with_min_hash(
policy: HLLPolicy,
index_bit_count: Expression,
min_hash_count: Expression,
bin: Expression,
) -> Expression {
add_write(
bin,
vec![
ExpressionArgument::Value(Value::from(HllExpOp::Init as i64)),
ExpressionArgument::FilterExpression(index_bit_count),
ExpressionArgument::FilterExpression(min_hash_count),
ExpressionArgument::Value(Value::from(policy.flags)),
],
)
}
pub fn add(policy: HLLPolicy, list: Expression, bin: Expression) -> Expression {
add_with_index_and_min_hash(policy, list, int_val(-1), int_val(-1), bin)
}
pub fn add_with_index(
policy: HLLPolicy,
list: Expression,
index_bit_count: Expression,
bin: Expression,
) -> Expression {
add_with_index_and_min_hash(policy, list, index_bit_count, int_val(-1), bin)
}
pub fn add_with_index_and_min_hash(
policy: HLLPolicy,
list: Expression,
index_bit_count: Expression,
min_hash_count: Expression,
bin: Expression,
) -> Expression {
add_write(
bin,
vec![
ExpressionArgument::Value(Value::from(HllExpOp::Add as i64)),
ExpressionArgument::FilterExpression(list),
ExpressionArgument::FilterExpression(index_bit_count),
ExpressionArgument::FilterExpression(min_hash_count),
ExpressionArgument::Value(Value::from(policy.flags)),
],
)
}
pub fn get_count(bin: Expression) -> Expression {
add_read(
bin,
ExpType::INT,
vec![ExpressionArgument::Value(Value::from(
HllExpOp::Count as i64,
))],
)
}
pub fn get_union(list: Expression, bin: Expression) -> Expression {
add_read(
bin,
ExpType::HLL,
vec![
ExpressionArgument::Value(Value::from(HllExpOp::Union as i64)),
ExpressionArgument::FilterExpression(list),
],
)
}
pub fn get_union_count(list: Expression, bin: Expression) -> Expression {
add_read(
bin,
ExpType::INT,
vec![
ExpressionArgument::Value(Value::from(HllExpOp::UnionCount as i64)),
ExpressionArgument::FilterExpression(list),
],
)
}
pub fn get_intersect_count(list: Expression, bin: Expression) -> Expression {
add_read(
bin,
ExpType::INT,
vec![
ExpressionArgument::Value(Value::from(HllExpOp::IntersectCount as i64)),
ExpressionArgument::FilterExpression(list),
],
)
}
pub fn get_similarity(list: Expression, bin: Expression) -> Expression {
add_read(
bin,
ExpType::FLOAT,
vec![
ExpressionArgument::Value(Value::from(HllExpOp::Similarity as i64)),
ExpressionArgument::FilterExpression(list),
],
)
}
pub fn describe(bin: Expression) -> Expression {
add_read(
bin,
ExpType::LIST,
vec![ExpressionArgument::Value(Value::from(
HllExpOp::Describe as i64,
))],
)
}
pub fn may_contain(list: Expression, bin: Expression) -> Expression {
add_read(
bin,
ExpType::INT,
vec![
ExpressionArgument::Value(Value::from(HllExpOp::MayContain as i64)),
ExpressionArgument::FilterExpression(list),
],
)
}
pub(crate) fn add_read(
bin: Expression,
return_type: ExpType,
arguments: Vec<ExpressionArgument>,
) -> Expression {
Expression {
cmd: Some(ExpOp::Call),
val: None,
bin: Some(Box::new(bin)),
flags: Some(MODULE),
module: Some(return_type),
exps: None,
arguments: Some(arguments),
bytes: None,
}
}
pub(crate) fn add_write(bin: Expression, arguments: Vec<ExpressionArgument>) -> Expression {
Expression {
cmd: Some(ExpOp::Call),
val: None,
bin: Some(Box::new(bin)),
flags: Some(MODULE | MODIFY),
module: Some(ExpType::HLL),
exps: None,
arguments: Some(arguments),
bytes: None,
}
}