|
|
@ -63,9 +63,6 @@ pub fn query(jobj: *json.Obj, db: *Db, allocator: std.mem.Allocator) !json.Obj { |
|
|
|
const query_str = jobj.getString(); |
|
|
|
var jret = json.Obj.newArray(); |
|
|
|
|
|
|
|
// Go through each tag |
|
|
|
var tag_iter = std.mem.split(u8, query_str, " "); |
|
|
|
|
|
|
|
var ids = std.ArrayList([]u8).init(allocator); |
|
|
|
defer { |
|
|
|
for (ids.items) |item| { |
|
|
@ -74,16 +71,22 @@ pub fn query(jobj: *json.Obj, db: *Db, allocator: std.mem.Allocator) !json.Obj { |
|
|
|
ids.deinit(); |
|
|
|
} |
|
|
|
|
|
|
|
while (tag_iter.next()) |tag| { |
|
|
|
// Get the tag selector: "tag:<tag>" |
|
|
|
const tag_sel = try std.mem.concat(allocator, u8, &[_][]const u8{ "tag:", tag }); |
|
|
|
defer allocator.free(tag_sel); |
|
|
|
if (query_str.len > 0) { |
|
|
|
// Get all the items under the individual tags |
|
|
|
var tag_iter = std.mem.split(u8, query_str, " "); |
|
|
|
while (tag_iter.next()) |tag| { |
|
|
|
// Get the tag selector: "tag:<tag>" |
|
|
|
const tag_sel = try std.mem.concat(allocator, u8, &[_][]const u8{ "tag:", tag }); |
|
|
|
defer allocator.free(tag_sel); |
|
|
|
|
|
|
|
// Get the items that have that tag: "<item1> <item2> <item3>" |
|
|
|
try ids.append(db.get(tag_sel) orelse return jret); |
|
|
|
// Get the items that have that tag: "<item1> <item2> <item3>" |
|
|
|
try ids.append(db.get(tag_sel) orelse return jret); |
|
|
|
|
|
|
|
// This has been deferred before. |
|
|
|
//defer Db.free(tag_str.ptr); |
|
|
|
// This has been deferred before. |
|
|
|
//defer Db.free(tag_str.ptr); |
|
|
|
} |
|
|
|
} else { |
|
|
|
try ids.append(db.get("item") orelse return jret); |
|
|
|
} |
|
|
|
|
|
|
|
var id_iter = util.intersection(ids.items); |
|
|
|