ZipponDB/src/stuffs/additionalData.zig

44 lines
1.6 KiB
Zig

const std = @import("std");
const Allocator = std.mem.Allocator;
const dtype = @import("dtype");
const DataType = dtype.DataType;
/// This is the [] part
/// TODO: Include the part ".friends.comments" in "GRAB User.firends.comments {age > 10}"
pub const AdditionalData = struct {
limit: usize = 0,
childrens: std.ArrayList(AdditionalDataMember),
pub fn init(allocator: Allocator) AdditionalData {
return AdditionalData{ .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 {
for (members, dtypes, 0..) |member, dt, i| {
if (dt == .link or dt == .link_array) continue;
try self.childrens.append(AdditionalDataMember.init(allocator, member, i));
}
}
};
// This is name in: [name]
// There is an additional data because it can be [friend [1; name]]
pub const AdditionalDataMember = struct {
name: []const u8,
index: usize, // Index place in the schema
additional_data: AdditionalData,
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 };
}
};