Skip to content

Commit

Permalink
Add support for Float64 type
Browse files Browse the repository at this point in the history
  • Loading branch information
AmrDeveloper committed Sep 13, 2023
1 parent 3355ce7 commit 9207364
Show file tree
Hide file tree
Showing 12 changed files with 360 additions and 189 deletions.
32 changes: 16 additions & 16 deletions crates/gitql-ast/src/aggregation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,36 +30,36 @@ lazy_static! {
map.insert(
"max",
AggregationPrototype {
parameter: DataType::Number,
result: DataType::Number,
parameter: DataType::Integer,
result: DataType::Integer,
},
);
map.insert(
"min",
AggregationPrototype {
parameter: DataType::Number,
result: DataType::Number,
parameter: DataType::Integer,
result: DataType::Integer,
},
);
map.insert(
"sum",
AggregationPrototype {
parameter: DataType::Any,
result: DataType::Number,
result: DataType::Integer,
},
);
map.insert(
"avg",
AggregationPrototype {
parameter: DataType::Any,
result: DataType::Number,
result: DataType::Integer,
},
);
map.insert(
"count",
AggregationPrototype {
parameter: DataType::Any,
result: DataType::Number,
result: DataType::Integer,
},
);
map
Expand All @@ -70,46 +70,46 @@ fn aggregation_max(field_name: &String, objects: &Vec<GQLObject>) -> Value {
let mut max_length: i64 = 0;
for object in objects {
let field_value = &object.attributes.get(field_name).unwrap();
let int_value = field_value.as_number();
let int_value = field_value.as_int();
if int_value > max_length {
max_length = int_value;
}
}
return Value::Number(max_length);
return Value::Integer(max_length);
}

fn aggregation_min(field_name: &String, objects: &Vec<GQLObject>) -> Value {
let mut min_length: i64 = 0;
for object in objects {
let field_value = &object.attributes.get(field_name).unwrap();
let int_value = field_value.as_number();
let int_value = field_value.as_int();
if int_value < min_length {
min_length = int_value;
}
}
return Value::Number(min_length);
return Value::Integer(min_length);
}

fn aggregation_sum(field_name: &String, objects: &Vec<GQLObject>) -> Value {
let mut sum: i64 = 0;
for object in objects {
let field_value = &object.attributes.get(field_name).unwrap();
sum += field_value.as_number();
sum += field_value.as_int();
}
return Value::Number(sum);
return Value::Integer(sum);
}

fn aggregation_average(field_name: &String, objects: &Vec<GQLObject>) -> Value {
let mut sum: i64 = 0;
let count: i64 = objects.len().try_into().unwrap();
for object in objects {
let field_value = &object.attributes.get(field_name).unwrap();
sum += field_value.as_number();
sum += field_value.as_int();
}
let avg = sum / count;
return Value::Number(avg);
return Value::Integer(avg);
}

fn aggregation_count(_field_name: &String, objects: &Vec<GQLObject>) -> Value {
return Value::Number(objects.len() as i64);
return Value::Integer(objects.len() as i64);
}
11 changes: 6 additions & 5 deletions crates/gitql-ast/src/expression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use std::any::Any;
use crate::function::PROTOTYPES;
use crate::scope::Scope;
use crate::types::{DataType, TABLES_FIELDS_TYPES};
use crate::value::Value;

pub enum ExpressionKind {
String,
Expand Down Expand Up @@ -74,7 +75,7 @@ impl Expression for SymbolExpression {
}

pub struct NumberExpression {
pub value: i64,
pub value: Value,
}

impl Expression for NumberExpression {
Expand All @@ -83,7 +84,7 @@ impl Expression for NumberExpression {
}

fn expr_type(&self, _scope: &Scope) -> DataType {
return DataType::Number;
return self.value.data_type();
}

fn as_any(&self) -> &dyn Any {
Expand Down Expand Up @@ -129,7 +130,7 @@ impl Expression for PrefixUnary {
return if self.op == PrefixUnaryOperator::Bang {
DataType::Boolean
} else {
DataType::Number
DataType::Integer
};
}

Expand Down Expand Up @@ -159,7 +160,7 @@ impl Expression for ArithmeticExpression {
}

fn expr_type(&self, _scope: &Scope) -> DataType {
return DataType::Number;
return DataType::Integer;
}

fn as_any(&self) -> &dyn Any {
Expand Down Expand Up @@ -272,7 +273,7 @@ impl Expression for BitwiseExpression {
}

fn expr_type(&self, _scope: &Scope) -> DataType {
return DataType::Number;
return DataType::Integer;
}

fn as_any(&self) -> &dyn Any {
Expand Down
46 changes: 23 additions & 23 deletions crates/gitql-ast/src/function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,14 @@ lazy_static! {
map.insert(
"replicate",
Prototype {
parameters: vec![DataType::Text, DataType::Number],
parameters: vec![DataType::Text, DataType::Integer],
result: DataType::Text,
},
);
map.insert(
"space",
Prototype {
parameters: vec![DataType::Number],
parameters: vec![DataType::Integer],
result: DataType::Text,
},
);
Expand Down Expand Up @@ -106,34 +106,34 @@ lazy_static! {
"len",
Prototype {
parameters: vec![DataType::Text],
result: DataType::Number,
result: DataType::Integer,
},
);
map.insert(
"ascii",
Prototype {
parameters: vec![DataType::Text],
result: DataType::Number,
result: DataType::Integer,
},
);
map.insert(
"left",
Prototype {
parameters: vec![DataType::Text, DataType::Number],
parameters: vec![DataType::Text, DataType::Integer],
result: DataType::Text,
},
);
map.insert(
"datalength",
Prototype {
parameters: vec![DataType::Text],
result: DataType::Number,
result: DataType::Integer,
},
);
map.insert(
"char",
Prototype {
parameters: vec![DataType::Number],
parameters: vec![DataType::Integer],
result: DataType::Text,
},
);
Expand All @@ -147,21 +147,21 @@ lazy_static! {
map.insert(
"substring",
Prototype {
parameters: vec![DataType::Text, DataType::Number, DataType::Number],
parameters: vec![DataType::Text, DataType::Integer, DataType::Integer],
result: DataType::Text,
},
);
map.insert(
"stuff",
Prototype {
parameters: vec![DataType::Text, DataType::Number, DataType::Number, DataType::Text],
parameters: vec![DataType::Text, DataType::Integer, DataType::Integer, DataType::Text],
result: DataType::Text,
},
);
map.insert(
"right",
Prototype {
parameters: vec![DataType::Text, DataType::Number],
parameters: vec![DataType::Text, DataType::Integer],
result: DataType::Text
},
);
Expand Down Expand Up @@ -210,12 +210,12 @@ fn text_reverse(inputs: Vec<Value>) -> Value {

fn text_replicate(inputs: Vec<Value>) -> Value {
let str = inputs[0].as_text();
let count = inputs[1].as_number() as usize;
let count = inputs[1].as_int() as usize;
return Value::Text(str.repeat(count));
}

fn text_space(inputs: Vec<Value>) -> Value {
let n = inputs[0].as_number() as usize;
let n = inputs[0].as_int() as usize;
return Value::Text(" ".repeat(n));
}

Expand All @@ -232,15 +232,15 @@ fn text_right_trim(inputs: Vec<Value>) -> Value {
}

fn text_len(inputs: Vec<Value>) -> Value {
return Value::Number(inputs[0].as_text().len() as i64);
return Value::Integer(inputs[0].as_text().len() as i64);
}

fn text_ascii(inputs: Vec<Value>) -> Value {
let text = inputs[0].as_text();
if text.is_empty() {
return Value::Number(0);
return Value::Integer(0);
}
return Value::Number(text.chars().nth(0).unwrap() as i64);
return Value::Integer(text.chars().nth(0).unwrap() as i64);
}

fn text_left(inputs: Vec<Value>) -> Value {
Expand All @@ -249,7 +249,7 @@ fn text_left(inputs: Vec<Value>) -> Value {
return Value::Text("".to_string());
}

let number_of_chars = inputs[1].as_number();
let number_of_chars = inputs[1].as_int();
if number_of_chars > text.len() as i64 {
return Value::Text(text);
}
Expand All @@ -263,11 +263,11 @@ fn text_left(inputs: Vec<Value>) -> Value {

fn text_datalength(inputs: Vec<Value>) -> Value {
let text = inputs[0].as_text();
return Value::Number(text.as_bytes().len() as i64);
return Value::Integer(text.as_bytes().len() as i64);
}

fn text_char(inputs: Vec<Value>) -> Value {
let code = inputs[0].as_number() as u32;
let code = inputs[0].as_int() as u32;
if let Some(character) = char::from_u32(code) {
return Value::Text(character.to_string());
}
Expand Down Expand Up @@ -298,8 +298,8 @@ fn text_substring(inputs: Vec<Value>) -> Value {
let text = inputs[0].as_text();
//according to the specs, a stirng starts at position 1.
//but in Rust, the index of a string starts from 0
let start = inputs[1].as_number() as usize - 1;
let length = inputs[2].as_number();
let start = inputs[1].as_int() as usize - 1;
let length = inputs[2].as_int();

if start > text.len() || length > text.len() as i64 {
return Value::Text(text);
Expand All @@ -313,8 +313,8 @@ fn text_substring(inputs: Vec<Value>) -> Value {

fn text_stuff(inputs: Vec<Value>) -> Value {
let text = inputs[0].as_text();
let start = (inputs[1].as_number() - 1) as usize;
let length = inputs[2].as_number() as usize;
let start = (inputs[1].as_int() - 1) as usize;
let length = inputs[2].as_int() as usize;
let new_string = inputs[3].as_text();

if text.is_empty() {
Expand All @@ -337,7 +337,7 @@ fn text_right(inputs: Vec<Value>) -> Value {
return Value::Text("".to_string());
}

let number_of_chars = inputs[1].as_number() as usize;
let number_of_chars = inputs[1].as_int() as usize;
if number_of_chars > text.len() {
return Value::Text(text);
}
Expand Down
26 changes: 20 additions & 6 deletions crates/gitql-ast/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ use std::collections::HashMap;
pub enum DataType {
Any,
Text,
Number,
Integer,
Float,
Boolean,
Date,
Time,
Expand All @@ -15,11 +16,24 @@ pub enum DataType {
}

impl DataType {
pub fn is_int(&self) -> bool {
return *self == DataType::Integer;
}

pub fn is_float(&self) -> bool {
return *self == DataType::Float;
}

pub fn is_number(&self) -> bool {
return self.is_int() || self.is_float();
}

pub fn literal(&self) -> &'static str {
return match self {
DataType::Any => "Any",
DataType::Text => "Text",
DataType::Number => "Number",
DataType::Integer => "Integer",
DataType::Float => "Float",
DataType::Boolean => "Boolean",
DataType::Date => "Date",
DataType::Time => "Time",
Expand All @@ -38,15 +52,15 @@ lazy_static! {
map.insert("message", DataType::Text);
map.insert("name", DataType::Text);
map.insert("full_name", DataType::Text);
map.insert("insertions", DataType::Number);
map.insert("deletions", DataType::Number);
map.insert("files_changed", DataType::Number);
map.insert("insertions", DataType::Integer);
map.insert("deletions", DataType::Integer);
map.insert("files_changed", DataType::Integer);
map.insert("email", DataType::Text);
map.insert("type", DataType::Text);
map.insert("time", DataType::DateTime);
map.insert("is_head", DataType::Boolean);
map.insert("is_remote", DataType::Boolean);
map.insert("commit_count", DataType::Number);
map.insert("commit_count", DataType::Integer);
map.insert("repo", DataType::Text);
map
};
Expand Down
Loading

0 comments on commit 9207364

Please sign in to comment.