Put back all test
I removed some test while implementing the new Filter
This commit is contained in:
parent
2a946eafd0
commit
304ec89167
@ -207,19 +207,21 @@ pub const Parser = struct {
|
|||||||
|
|
||||||
.filter_and_send => switch (token.tag) {
|
.filter_and_send => switch (token.tag) {
|
||||||
.l_brace => {
|
.l_brace => {
|
||||||
var array = std.ArrayList(UUID).init(self.allocator);
|
var filter = try self.parseFilter(struct_name, false);
|
||||||
defer array.deinit();
|
defer filter.deinit();
|
||||||
_ = try self.parseFilter(&array, struct_name, true);
|
|
||||||
|
|
||||||
self.sendEntity(&array, additional_data, struct_name);
|
var uuids = std.ArrayList(UUID).init(self.allocator);
|
||||||
|
defer uuids.deinit();
|
||||||
|
|
||||||
|
// TODO: self.sendEntity(&uuids, additional_data, struct_name);
|
||||||
state = .end;
|
state = .end;
|
||||||
},
|
},
|
||||||
.eof => {
|
.eof => {
|
||||||
var array = std.ArrayList(UUID).init(self.allocator);
|
var uuids = std.ArrayList(UUID).init(self.allocator);
|
||||||
defer array.deinit();
|
defer uuids.deinit();
|
||||||
try self.file_engine.getAllUUIDList(struct_name, &array);
|
try self.file_engine.getAllUUIDList(struct_name, &uuids);
|
||||||
|
|
||||||
self.sendEntity(&array, additional_data, struct_name);
|
self.sendEntity(&uuids, additional_data, struct_name);
|
||||||
state = .end;
|
state = .end;
|
||||||
},
|
},
|
||||||
else => return printError(
|
else => return printError(
|
||||||
@ -234,9 +236,13 @@ pub const Parser = struct {
|
|||||||
// TODO: Optimize so it doesnt use parseFilter but just parse the file and directly check the condition. Here I end up parsing 2 times.
|
// TODO: Optimize so it doesnt use parseFilter but just parse the file and directly check the condition. Here I end up parsing 2 times.
|
||||||
.filter_and_update => switch (token.tag) {
|
.filter_and_update => switch (token.tag) {
|
||||||
.l_brace => {
|
.l_brace => {
|
||||||
|
var filter = try self.parseFilter(struct_name, false);
|
||||||
|
defer filter.deinit();
|
||||||
|
|
||||||
var uuids = std.ArrayList(UUID).init(self.allocator);
|
var uuids = std.ArrayList(UUID).init(self.allocator);
|
||||||
defer uuids.deinit();
|
defer uuids.deinit();
|
||||||
token = try self.parseFilter(&uuids, struct_name, true);
|
|
||||||
|
token = self.toker.last();
|
||||||
|
|
||||||
if (token.tag != .keyword_to) return printError(
|
if (token.tag != .keyword_to) return printError(
|
||||||
"Error: Expected TO",
|
"Error: Expected TO",
|
||||||
@ -295,9 +301,12 @@ pub const Parser = struct {
|
|||||||
|
|
||||||
.filter_and_delete => switch (token.tag) {
|
.filter_and_delete => switch (token.tag) {
|
||||||
.l_brace => {
|
.l_brace => {
|
||||||
|
var filter = try self.parseFilter(struct_name, false);
|
||||||
|
defer filter.deinit();
|
||||||
|
|
||||||
var uuids = std.ArrayList(UUID).init(self.allocator);
|
var uuids = std.ArrayList(UUID).init(self.allocator);
|
||||||
defer uuids.deinit();
|
defer uuids.deinit();
|
||||||
_ = try self.parseFilter(&uuids, struct_name, true);
|
|
||||||
_ = try self.file_engine.deleteEntities(struct_name, uuids.items);
|
_ = try self.file_engine.deleteEntities(struct_name, uuids.items);
|
||||||
try self.sendUUIDs(uuids.items);
|
try self.sendUUIDs(uuids.items);
|
||||||
state = .end;
|
state = .end;
|
||||||
@ -383,7 +392,7 @@ pub const Parser = struct {
|
|||||||
/// Take an array of UUID and populate it with what match what is between {}
|
/// Take an array of UUID and populate it with what match what is between {}
|
||||||
/// Main is to know if between {} or (), main is true if between {}, otherwise between () inside {}
|
/// Main is to know if between {} or (), main is true if between {}, otherwise between () inside {}
|
||||||
/// TODO: Optimize this so it can use multiple condition at the same time instead of parsing the all file for each condition
|
/// TODO: Optimize this so it can use multiple condition at the same time instead of parsing the all file for each condition
|
||||||
fn parseFilter(self: Parser, struct_name: []const u8) ZipponError!Filter {
|
fn parseFilter(self: Parser, struct_name: []const u8, is_sub: bool) ZipponError!Filter {
|
||||||
var filter = try Filter.init(self.allocator);
|
var filter = try Filter.init(self.allocator);
|
||||||
errdefer filter.deinit();
|
errdefer filter.deinit();
|
||||||
|
|
||||||
@ -398,10 +407,33 @@ pub const Parser = struct {
|
|||||||
switch (state) {
|
switch (state) {
|
||||||
.expect_condition => switch (token.tag) {
|
.expect_condition => switch (token.tag) {
|
||||||
.r_brace => {
|
.r_brace => {
|
||||||
state = .end;
|
if (!is_sub) {
|
||||||
|
state = .end;
|
||||||
|
} else {
|
||||||
|
return printError(
|
||||||
|
"Error: Expected ) not }",
|
||||||
|
ZipponError.SynthaxError,
|
||||||
|
self.toker.buffer,
|
||||||
|
token.loc.start,
|
||||||
|
token.loc.end,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.r_paren => {
|
||||||
|
if (is_sub) {
|
||||||
|
state = .end;
|
||||||
|
} else {
|
||||||
|
return printError(
|
||||||
|
"Error: Expected } not )",
|
||||||
|
ZipponError.SynthaxError,
|
||||||
|
self.toker.buffer,
|
||||||
|
token.loc.start,
|
||||||
|
token.loc.end,
|
||||||
|
);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
.l_paren => {
|
.l_paren => {
|
||||||
var sub_filter = try self.parseFilter(struct_name);
|
var sub_filter = try self.parseFilter(struct_name, true);
|
||||||
filter.addSubFilter(&sub_filter);
|
filter.addSubFilter(&sub_filter);
|
||||||
token = self.toker.last();
|
token = self.toker.last();
|
||||||
keep_next = true;
|
keep_next = true;
|
||||||
@ -424,8 +456,31 @@ pub const Parser = struct {
|
|||||||
},
|
},
|
||||||
|
|
||||||
.expect_ANDOR_OR_end => switch (token.tag) {
|
.expect_ANDOR_OR_end => switch (token.tag) {
|
||||||
.r_brace, .r_paren => {
|
.r_brace => {
|
||||||
state = .end;
|
if (!is_sub) {
|
||||||
|
state = .end;
|
||||||
|
} else {
|
||||||
|
return printError(
|
||||||
|
"Error: Expected ) not }",
|
||||||
|
ZipponError.SynthaxError,
|
||||||
|
self.toker.buffer,
|
||||||
|
token.loc.start,
|
||||||
|
token.loc.end,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.r_paren => {
|
||||||
|
if (is_sub) {
|
||||||
|
state = .end;
|
||||||
|
} else {
|
||||||
|
return printError(
|
||||||
|
"Error: Expected } not )",
|
||||||
|
ZipponError.SynthaxError,
|
||||||
|
self.toker.buffer,
|
||||||
|
token.loc.start,
|
||||||
|
token.loc.end,
|
||||||
|
);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
.keyword_and => {
|
.keyword_and => {
|
||||||
try filter.addLogicalOperator(.AND);
|
try filter.addLogicalOperator(.AND);
|
||||||
@ -962,6 +1017,62 @@ pub const Parser = struct {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
test "ADD" {
|
||||||
|
try testParsing("ADD User (name = 'Bob', email='bob@email.com', age=55, scores=[ 1 ], friends=[], bday=2000/01/01, a_time=12:04, last_order=2000/01/01-12:45)");
|
||||||
|
try testParsing("ADD User (name = 'Bob', email='bob@email.com', age=55, scores=[ 1 ], friends=[], bday=2000/01/01, a_time=12:04:54, last_order=2000/01/01-12:45)");
|
||||||
|
try testParsing("ADD User (name = 'Bob', email='bob@email.com', age=-55, scores=[ 1 ], friends=[], bday=2000/01/01, a_time=12:04:54.8741, last_order=2000/01/01-12:45)");
|
||||||
|
}
|
||||||
|
|
||||||
|
test "UPDATE" {
|
||||||
|
try testParsing("UPDATE User {name = 'Bob'} TO (email='new@gmail.com')");
|
||||||
|
}
|
||||||
|
|
||||||
|
test "DELETE" {
|
||||||
|
try testParsing("DELETE User {name='Bob'}");
|
||||||
|
}
|
||||||
|
|
||||||
|
test "GRAB filter with string" {
|
||||||
|
try testParsing("GRAB User {name = 'Bob'}");
|
||||||
|
try testParsing("GRAB User {name != 'Brittany Rogers'}");
|
||||||
|
}
|
||||||
|
|
||||||
|
test "GRAB with additional data" {
|
||||||
|
try testParsing("GRAB User [1] {age < 18}");
|
||||||
|
try testParsing("GRAB User [name] {age < 18}");
|
||||||
|
try testParsing("GRAB User [100; name] {age < 18}");
|
||||||
|
}
|
||||||
|
|
||||||
|
test "GRAB filter with int" {
|
||||||
|
try testParsing("GRAB User {age = 18}");
|
||||||
|
try testParsing("GRAB User {age > -18}");
|
||||||
|
try testParsing("GRAB User {age < 18}");
|
||||||
|
try testParsing("GRAB User {age <= 18}");
|
||||||
|
try testParsing("GRAB User {age >= 18}");
|
||||||
|
try testParsing("GRAB User {age != 18}");
|
||||||
|
}
|
||||||
|
|
||||||
|
test "GRAB filter with date" {
|
||||||
|
try testParsing("GRAB User {bday > 2000/01/01}");
|
||||||
|
try testParsing("GRAB User {a_time < 08:00}");
|
||||||
|
try testParsing("GRAB User {last_order > 2000/01/01-12:45}");
|
||||||
|
}
|
||||||
|
|
||||||
|
test "Specific query" {
|
||||||
|
try testParsing("GRAB User");
|
||||||
|
try testParsing("GRAB User {}");
|
||||||
|
try testParsing("GRAB User [1]");
|
||||||
|
}
|
||||||
|
|
||||||
|
test "Synthax error" {
|
||||||
|
try expectParsingError("GRAB {}", ZiQlParserError.StructNotFound);
|
||||||
|
try expectParsingError("GRAB User {qwe = 'qwe'}", ZiQlParserError.MemberNotFound);
|
||||||
|
try expectParsingError("ADD User (name='Bob')", ZiQlParserError.MemberMissing);
|
||||||
|
try expectParsingError("GRAB User {name='Bob'", ZiQlParserError.SynthaxError);
|
||||||
|
try expectParsingError("GRAB User {age = 50 name='Bob'}", ZiQlParserError.SynthaxError);
|
||||||
|
try expectParsingError("GRAB User {age <14 AND (age>55}", ZiQlParserError.SynthaxError);
|
||||||
|
try expectParsingError("GRAB User {name < 'Hello'}", ZiQlParserError.ConditionError);
|
||||||
|
}
|
||||||
|
|
||||||
fn testParsing(source: [:0]const u8) !void {
|
fn testParsing(source: [:0]const u8) !void {
|
||||||
const TEST_DATA_DIR = @import("config.zig").TEST_DATA_DIR;
|
const TEST_DATA_DIR = @import("config.zig").TEST_DATA_DIR;
|
||||||
const allocator = std.testing.allocator;
|
const allocator = std.testing.allocator;
|
||||||
@ -1010,7 +1121,7 @@ fn testParseFilter(source: [:0]const u8) !void {
|
|||||||
var tokenizer = Tokenizer.init(source);
|
var tokenizer = Tokenizer.init(source);
|
||||||
var parser = Parser.init(allocator, &tokenizer, &file_engine);
|
var parser = Parser.init(allocator, &tokenizer, &file_engine);
|
||||||
|
|
||||||
var filter = try parser.parseFilter("User");
|
var filter = try parser.parseFilter("User", false);
|
||||||
defer filter.deinit();
|
defer filter.deinit();
|
||||||
std.debug.print("{s}\n", .{source});
|
std.debug.print("{s}\n", .{source});
|
||||||
filter.debugPrint();
|
filter.debugPrint();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user