Created an EntityWriter responsable for writing into JSON and table into a writer

This commit is contained in:
Adrien Bouvais 2024-11-29 21:38:05 +01:00
parent 7f27557ca2
commit 4ee79c9629
2 changed files with 104 additions and 91 deletions

97
src/entityWriter.zig Normal file
View File

@ -0,0 +1,97 @@
const std = @import("std");
const utils = @import("stuffs/utils.zig");
const zid = @import("ZipponData");
const AdditionalData = @import("stuffs/additionalData.zig").AdditionalData;
const dtype = @import("dtype");
const DataType = dtype.DataType;
const DateTime = dtype.DateTime;
const UUID = dtype.UUID;
const ZipponError = @import("stuffs/errors.zig").ZipponError;
pub const EntityWriter = struct {
pub fn writeEntityTable(
writer: anytype,
row: []zid.Data,
additional_data: *AdditionalData,
data_types: []const DataType,
) !void {
try writer.writeAll("| ");
for (additional_data.member_to_find.items) |member| {
try writeValue(writer, row[member.index], data_types[member.index]);
try writer.writeAll(" \t| ");
}
try writer.writeByte('\n');
}
pub fn writeEntityJSON(
writer: anytype,
row: []zid.Data,
additional_data: *AdditionalData,
data_types: []const DataType,
) !void {
try writer.writeByte('{');
for (additional_data.member_to_find.items) |member| {
try writer.print("{s}: ", .{member.name});
try writeValue(writer, row[member.index], data_types[member.index]);
try writer.writeAll(", ");
}
try writer.writeAll("}, ");
}
fn writeValue(writer: anytype, value: zid.Data, data_type: DataType) !void {
switch (value) {
.Float => |v| try writer.print("{d}", .{v}),
.Int => |v| try writer.print("{d}", .{v}),
.Str => |v| try writer.print("\"{s}\"", .{v}),
.UUID => |v| {
const uuid = try UUID.parse("00000000-0000-0000-0000-000000000000"); // Maybe pass that comptime to prevent parsing it everytime
if (!std.meta.eql(v, uuid.bytes)) {
try writer.print("\"{s}\"", .{UUID.format_bytes(v)});
} else {
try writer.print("{{}}", .{});
}
},
.Bool => |v| try writer.print("{any}", .{v}),
.Unix => |v| {
const datetime = DateTime.initUnix(v);
try writer.writeByte('"');
switch (data_type) {
.date => try datetime.format("YYYY/MM/DD", writer),
.time => try datetime.format("HH:mm:ss.SSSS", writer),
.datetime => try datetime.format("YYYY/MM/DD-HH:mm:ss.SSSS", writer),
else => unreachable,
}
try writer.writeByte('"');
},
.IntArray, .FloatArray, .StrArray, .UUIDArray, .BoolArray, .UnixArray => try writeArray(writer, value, data_type),
}
}
fn writeArray(writer: anytype, data: zid.Data, data_type: DataType) ZipponError!void {
writer.writeByte('[') catch return ZipponError.WriteError;
var iter = zid.ArrayIterator.init(data) catch return ZipponError.ZipponDataError;
switch (data) {
.IntArray => while (iter.next()) |v| writer.print("{d}, ", .{v.Int}) catch return ZipponError.WriteError,
.FloatArray => while (iter.next()) |v| writer.print("{d}", .{v.Float}) catch return ZipponError.WriteError,
.StrArray => while (iter.next()) |v| writer.print("\"{s}\"", .{v.Str}) catch return ZipponError.WriteError,
.UUIDArray => while (iter.next()) |v| writer.print("\"{s}\"", .{UUID.format_bytes(v.UUID)}) catch return ZipponError.WriteError,
.BoolArray => while (iter.next()) |v| writer.print("{any}", .{v.Bool}) catch return ZipponError.WriteError,
.UnixArray => {
while (iter.next()) |v| {
const datetime = DateTime.initUnix(v.Unix);
writer.writeByte('"') catch return ZipponError.WriteError;
switch (data_type) {
.date => datetime.format("YYYY/MM/DD", writer) catch return ZipponError.WriteError,
.time => datetime.format("HH:mm:ss.SSSS", writer) catch return ZipponError.WriteError,
.datetime => datetime.format("YYYY/MM/DD-HH:mm:ss.SSSS", writer) catch return ZipponError.WriteError,
else => unreachable,
}
writer.writeAll("\", ") catch return ZipponError.WriteError;
}
},
else => unreachable,
}
writer.writeByte(']') catch return ZipponError.WriteError;
}
};

View File

@ -7,6 +7,7 @@ const Allocator = std.mem.Allocator;
const SchemaEngine = @import("schemaEngine.zig").SchemaEngine;
const SchemaStruct = @import("schemaEngine.zig").SchemaStruct;
const ThreadSyncContext = @import("threadEngine.zig").ThreadSyncContext;
const EntityWriter = @import("entityWriter.zig").EntityWriter;
const dtype = @import("dtype");
const s2t = dtype.s2t;
@ -160,7 +161,7 @@ pub const FileEngine = struct {
/// TODO: Multi thread that too
pub fn getNumberOfEntity(self: *FileEngine, struct_name: []const u8) ZipponError!usize {
var fa = std.heap.FixedBufferAllocator.init(&parsing_buffer);
defer fa.reset();
fa.reset();
const allocator = fa.allocator();
const sstruct = try self.schema_engine.structName2SchemaStruct(struct_name);
@ -283,7 +284,7 @@ pub const FileEngine = struct {
additional_data: *AdditionalData,
) ZipponError!void {
var fa = std.heap.FixedBufferAllocator.init(&parsing_buffer);
defer fa.reset();
fa.reset();
const allocator = fa.allocator();
const sstruct = try self.schema_engine.structName2SchemaStruct(struct_name);
@ -478,7 +479,7 @@ pub const FileEngine = struct {
if (sync_context.checkStructLimit()) break;
if (filter) |f| if (!f.evaluate(row)) continue;
writeEntityTable(
EntityWriter.writeEntityTable(
writer,
row,
additional_data,
@ -493,91 +494,6 @@ pub const FileEngine = struct {
_ = sync_context.completeThread();
}
fn writeEntityTable(
writer: anytype,
row: []zid.Data,
additional_data: *AdditionalData,
data_types: []const DataType,
) !void {
try writer.writeAll("| ");
for (additional_data.member_to_find.items) |member| {
try writeValue(writer, row[member.index], data_types[member.index]);
try writer.writeAll(" \t| ");
}
try writer.writeByte('\n');
}
fn writeEntityJSON(
writer: anytype,
row: []zid.Data,
additional_data: *AdditionalData,
data_types: []const DataType,
) !void {
try writer.writeByte('{');
for (additional_data.member_to_find.items) |member| {
try writer.print("{s}: ", .{member.name});
try writeValue(writer, row[member.index], data_types[member.index]);
try writer.writeAll(", ");
}
try writer.writeAll("}, ");
}
fn writeValue(writer: anytype, value: zid.Data, data_type: DataType) !void {
switch (value) {
.Float => |v| try writer.print("{d}", .{v}),
.Int => |v| try writer.print("{d}", .{v}),
.Str => |v| try writer.print("\"{s}\"", .{v}),
.UUID => |v| {
const uuid = try UUID.parse("00000000-0000-0000-0000-000000000000"); // Maybe pass that comptime to prevent parsing it everytime
if (!std.meta.eql(v, uuid.bytes)) {
try writer.print("\"{s}\"", .{UUID.format_bytes(v)});
} else {
try writer.print("{{}}", .{});
}
},
.Bool => |v| try writer.print("{any}", .{v}),
.Unix => |v| {
const datetime = DateTime.initUnix(v);
try writer.writeByte('"');
switch (data_type) {
.date => try datetime.format("YYYY/MM/DD", writer),
.time => try datetime.format("HH:mm:ss.SSSS", writer),
.datetime => try datetime.format("YYYY/MM/DD-HH:mm:ss.SSSS", writer),
else => unreachable,
}
try writer.writeByte('"');
},
.IntArray, .FloatArray, .StrArray, .UUIDArray, .BoolArray, .UnixArray => try writeArray(writer, value, data_type),
}
}
fn writeArray(writer: anytype, data: zid.Data, data_type: DataType) ZipponError!void {
writer.writeByte('[') catch return FileEngineError.WriteError;
var iter = zid.ArrayIterator.init(data) catch return FileEngineError.ZipponDataError;
switch (data) {
.IntArray => while (iter.next()) |v| writer.print("{d}, ", .{v.Int}) catch return FileEngineError.WriteError,
.FloatArray => while (iter.next()) |v| writer.print("{d}", .{v.Float}) catch return FileEngineError.WriteError,
.StrArray => while (iter.next()) |v| writer.print("\"{s}\"", .{v.Str}) catch return FileEngineError.WriteError,
.UUIDArray => while (iter.next()) |v| writer.print("\"{s}\"", .{UUID.format_bytes(v.UUID)}) catch return FileEngineError.WriteError,
.BoolArray => while (iter.next()) |v| writer.print("{any}", .{v.Bool}) catch return FileEngineError.WriteError,
.UnixArray => {
while (iter.next()) |v| {
const datetime = DateTime.initUnix(v.Unix);
writer.writeByte('"') catch return FileEngineError.WriteError;
switch (data_type) {
.date => datetime.format("YYYY/MM/DD", writer) catch return FileEngineError.WriteError,
.time => datetime.format("HH:mm:ss.SSSS", writer) catch return FileEngineError.WriteError,
.datetime => datetime.format("YYYY/MM/DD-HH:mm:ss.SSSS", writer) catch return FileEngineError.WriteError,
else => unreachable,
}
writer.writeAll("\", ") catch return FileEngineError.WriteError;
}
},
else => unreachable,
}
writer.writeByte(']') catch return FileEngineError.WriteError;
}
// --------------------Change existing files--------------------
// TODO: Make it in batch too
@ -589,7 +505,7 @@ pub const FileEngine = struct {
n: usize,
) ZipponError!void {
var fa = std.heap.FixedBufferAllocator.init(&parsing_buffer);
defer fa.reset();
fa.reset();
const allocator = fa.allocator();
const file_index = try self.getFirstUsableIndexFile(struct_name);
@ -617,7 +533,7 @@ pub const FileEngine = struct {
additional_data: *AdditionalData,
) ZipponError!void {
var fa = std.heap.FixedBufferAllocator.init(&parsing_buffer);
defer fa.reset();
fa.reset();
const allocator = fa.allocator();
const sstruct = try self.schema_engine.structName2SchemaStruct(struct_name);
@ -782,7 +698,7 @@ pub const FileEngine = struct {
additional_data: *AdditionalData,
) ZipponError!void {
var fa = std.heap.FixedBufferAllocator.init(&parsing_buffer);
defer fa.reset();
fa.reset();
const allocator = fa.allocator();
const sstruct = try self.schema_engine.structName2SchemaStruct(struct_name);