diff --git a/src/fileEngine.zig b/src/fileEngine.zig index 2bf9da1..d727f69 100644 --- a/src/fileEngine.zig +++ b/src/fileEngine.zig @@ -403,7 +403,7 @@ pub const FileEngine = struct { // If there is no member to find, that mean we need to return all members, so let's populate additional data with all of them if (additional_data.childrens.items.len == 0) { - additional_data.populateWithEverythingExceptLink(allocator, sstruct.members, sstruct.types) catch return FileEngineError.MemoryError; + additional_data.populateWithEverythingExceptLink(sstruct.members, sstruct.types) catch return FileEngineError.MemoryError; } // Open the dir that contain all files diff --git a/src/stuffs/additionalData.zig b/src/stuffs/additionalData.zig index 3f61f29..254ca34 100644 --- a/src/stuffs/additionalData.zig +++ b/src/stuffs/additionalData.zig @@ -3,30 +3,36 @@ const Allocator = std.mem.Allocator; const dtype = @import("dtype"); const DataType = dtype.DataType; +const ZipponError = @import("errors.zig").ZipponError; + /// This is the [] part -/// TODO: Include the part ".friends.comments" in "GRAB User.firends.comments {age > 10}" pub const AdditionalData = struct { + allocator: Allocator, limit: usize = 0, childrens: std.ArrayList(AdditionalDataMember), pub fn init(allocator: Allocator) AdditionalData { - return AdditionalData{ .childrens = std.ArrayList(AdditionalDataMember).init(allocator) }; + return AdditionalData{ + .allocator = allocator, + .childrens = std.ArrayList(AdditionalDataMember).init(allocator), + }; } - pub fn deinit(self: *AdditionalData) void { - for (0..self.childrens.items.len) |i| { - self.childrens.items[i].additional_data.deinit(); - } - - self.childrens.deinit(); - } - - pub fn populateWithEverythingExceptLink(self: *AdditionalData, allocator: Allocator, members: [][]const u8, dtypes: []DataType) !void { + pub fn populateWithEverythingExceptLink(self: *AdditionalData, members: [][]const u8, dtypes: []DataType) !void { for (members, dtypes, 0..) |member, dt, i| { if (dt == .link or dt == .link_array) continue; - try self.childrens.append(AdditionalDataMember.init(allocator, member, i)); + try self.childrens.append(AdditionalDataMember.init(member, i)); } } + + pub fn addMember(self: *AdditionalData, name: []const u8, index: usize) ZipponError!void { + self.childrens.append(AdditionalDataMember.init(name, index)) catch return ZipponError.MemoryError; + } + + pub fn initAdditionalDataOfLastChildren(self: *AdditionalData) *AdditionalData { + self.childrens.items[self.childrens.items.len - 1].additional_data = AdditionalData.init(self.allocator); + return &self.childrens.items[self.childrens.items.len - 1].additional_data.?; + } }; // This is name in: [name] @@ -34,10 +40,9 @@ pub const AdditionalData = struct { pub const AdditionalDataMember = struct { name: []const u8, index: usize, // Index place in the schema - additional_data: AdditionalData, + additional_data: ?AdditionalData = null, - pub fn init(allocator: Allocator, name: []const u8, index: usize) AdditionalDataMember { - const additional_data = AdditionalData.init(allocator); - return AdditionalDataMember{ .name = name, .additional_data = additional_data, .index = index }; + pub fn init(name: []const u8, index: usize) AdditionalDataMember { + return AdditionalDataMember{ .name = name, .index = index }; } }; diff --git a/src/ziqlParser.zig b/src/ziqlParser.zig index c03ff61..6756b3e 100644 --- a/src/ziqlParser.zig +++ b/src/ziqlParser.zig @@ -45,7 +45,7 @@ const State = enum { expect_right_arrow, // For the additional data parser - expect_count_of_entity_to_find, + expect_limit, expect_semicolon_OR_right_bracket, expect_member, expect_comma_OR_r_bracket_OR_l_bracket, @@ -88,7 +88,6 @@ pub const Parser = struct { var state: State = .start; var additional_data = AdditionalData.init(allocator); - defer additional_data.deinit(); var struct_name: []const u8 = undefined; var action: enum { GRAB, ADD, UPDATE, DELETE } = undefined; @@ -636,25 +635,24 @@ pub const Parser = struct { fn parseAdditionalData(self: Parser, allocator: Allocator, additional_data: *AdditionalData, struct_name: []const u8) ZipponError!void { var token = self.toker.next(); var keep_next = false; - var state: State = .expect_count_of_entity_to_find; + var state: State = .expect_limit; while (state != .end) : ({ token = if ((!keep_next) and (state != .end)) self.toker.next() else token; keep_next = false; if (PRINT_STATE) std.debug.print("parseAdditionalData: {any}\n", .{state}); }) switch (state) { - .expect_count_of_entity_to_find => switch (token.tag) { + .expect_limit => switch (token.tag) { .int_literal => { - const count = std.fmt.parseInt(usize, self.toker.getTokenSlice(token), 10) catch { + additional_data.limit = std.fmt.parseInt(usize, self.toker.getTokenSlice(token), 10) catch { return printError( - "Error while transforming this into a integer.", + "Error while transforming limit into a integer.", ZiQlParserError.ParsingValueError, self.toker.buffer, token.loc.start, token.loc.end, ); }; - additional_data.limit = count; state = .expect_semicolon_OR_right_bracket; }, else => { @@ -694,13 +692,10 @@ pub const Parser = struct { token.loc.end, ); } - additional_data.childrens.append( - AdditionalDataMember.init( - allocator, - self.toker.getTokenSlice(token), - try self.schema_engine.memberName2DataIndex(struct_name, self.toker.getTokenSlice(token)), - ), - ) catch return ZipponError.MemoryError; + try additional_data.addMember( + self.toker.getTokenSlice(token), + try self.schema_engine.memberName2DataIndex(struct_name, self.toker.getTokenSlice(token)), + ); state = .expect_comma_OR_r_bracket_OR_l_bracket; }, @@ -717,9 +712,11 @@ pub const Parser = struct { .comma => state = .expect_member, .r_bracket => state = .end, .l_bracket => { + // Here now childrens is null, so I need to init it + try self.parseAdditionalData( allocator, - &additional_data.childrens.items[additional_data.childrens.items.len - 1].additional_data, + additional_data.initAdditionalDataOfLastChildren(), struct_name, ); state = .expect_comma_OR_r_bracket; @@ -954,8 +951,10 @@ pub const Parser = struct { .l_brace, .l_bracket => { var filter: ?Filter = null; defer if (filter != null) filter.?.deinit(); - var additional_data = AdditionalData.init(allocator); - defer additional_data.deinit(); + + var additional_data_arena = std.heap.ArenaAllocator.init(allocator); + defer additional_data_arena.deinit(); + var additional_data = AdditionalData.init(additional_data_arena.allocator()); if (token.tag == .l_bracket) { try self.parseAdditionalData(allocator, &additional_data, struct_name); @@ -1002,8 +1001,10 @@ pub const Parser = struct { .l_brace, .l_bracket => { var filter: ?Filter = null; defer if (filter != null) filter.?.deinit(); - var additional_data = AdditionalData.init(allocator); - defer additional_data.deinit(); + + var additional_data_arena = std.heap.ArenaAllocator.init(allocator); + defer additional_data_arena.deinit(); + var additional_data = AdditionalData.init(additional_data_arena.allocator()); if (token.tag == .l_bracket) { try self.parseAdditionalData(allocator, &additional_data, struct_name);