Skip to content

Commit 450caac

Browse files
committed
Fixes
1 parent 652d0b5 commit 450caac

File tree

4 files changed

+111
-14
lines changed

4 files changed

+111
-14
lines changed

src/common.zig

+11-8
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,16 @@ pub const SearchResults = struct {
4949
return self.results.count();
5050
}
5151

52+
pub fn values(self: SearchResults) []SearchResult {
53+
return self.results.values();
54+
}
55+
5256
pub fn get(self: SearchResults, id: u32) ?SearchResult {
5357
return self.results.get(id);
5458
}
5559

5660
pub fn sort(self: *SearchResults) void {
61+
// sort by score in descending order
5762
const Ctx = struct {
5863
values: []SearchResult,
5964
pub fn lessThan(ctx: @This(), a: usize, b: usize) bool {
@@ -63,16 +68,14 @@ pub const SearchResults = struct {
6368
self.results.sort(Ctx{ .values = self.results.values() });
6469
}
6570

66-
pub fn values(self: SearchResults) []SearchResult {
67-
return self.results.values();
68-
}
69-
7071
pub fn removeOutdatedResults(self: *SearchResults, collection: anytype) void {
71-
var iter = self.results.iterator();
72-
while (iter.next()) |*entry| {
73-
var result = entry.value_ptr;
72+
var i: usize = 0;
73+
while (i < self.results.count()) {
74+
const result = self.results.values()[i];
7475
if (collection.hasNewerVersion(result.id, result.version)) {
75-
result.score = 0;
76+
self.results.swapRemoveAt(i);
77+
} else {
78+
i += 1;
7679
}
7780
}
7881
}

src/server.zig

+6-6
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ fn getIndex(ctx: *Context, req: *httpz.Request, res: *httpz.Response, send_body:
117117
const index = ctx.indexes.getIndex(index_name) catch |err| {
118118
if (err == error.IndexNotFound) {
119119
if (send_body) {
120-
try writeErrorResponse(400, err, req, res);
120+
try writeErrorResponse(404, err, req, res);
121121
} else {
122122
res.status = 404;
123123
}
@@ -246,11 +246,11 @@ fn handleSearch(ctx: *Context, req: *httpz.Request, res: *httpz.Response) !void
246246

247247
const results = try index.search(body.query, req.arena, deadline);
248248

249-
var results_json = SearchResultsJSON{ .results = try req.arena.alloc(SearchResultJSON, results.count()) };
249+
var results_json = SearchResultsJSON{
250+
.results = try req.arena.alloc(SearchResultJSON, results.count()),
251+
};
250252
for (results.values(), 0..) |r, i| {
251-
if (r.score > 0) {
252-
results_json.results[i] = SearchResultJSON{ .id = r.id, .score = r.score };
253-
}
253+
results_json.results[i] = SearchResultJSON{ .id = r.id, .score = r.score };
254254
}
255255
return writeResponse(results_json, req, res);
256256
}
@@ -274,7 +274,7 @@ fn handleUpdate(ctx: *Context, req: *httpz.Request, res: *httpz.Response) !void
274274

275275
try index.update(body.changes);
276276

277-
return writeResponse(.{ .status = "ok" }, req, res);
277+
return writeResponse(EmptyResponse{}, req, res);
278278
}
279279

280280
fn handleHeadIndex(ctx: *Context, req: *httpz.Request, res: *httpz.Response) !void {

tests/conftest.py

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import requests
2+
import pytest
3+
from urllib.parse import urljoin
4+
5+
6+
@pytest.fixture
7+
def index_name():
8+
return 'testidx'
9+
10+
11+
class Client:
12+
def __init__(self, session, base_url):
13+
self.session = session
14+
self.base_url = base_url
15+
16+
def get(self, url, **kwargs):
17+
return self.session.get(urljoin(self.base_url, url), **kwargs)
18+
19+
def put(self, url, **kwargs):
20+
return self.session.put(urljoin(self.base_url, url), **kwargs)
21+
22+
def post(self, url, **kwargs):
23+
return self.session.post(urljoin(self.base_url, url), **kwargs)
24+
25+
def delete(self, url, **kwargs):
26+
return self.session.delete(urljoin(self.base_url, url), **kwargs)
27+
28+
29+
@pytest.fixture
30+
def session():
31+
with requests.Session() as session:
32+
yield session
33+
34+
35+
@pytest.fixture
36+
def client(session):
37+
return Client(session, 'http://localhost:8080')
38+
39+
40+
@pytest.fixture(autouse=True)
41+
def delete_index(client, index_name):
42+
req = client.delete(f'/{index_name}')
43+
req.raise_for_status()
44+
45+
46+
@pytest.fixture()
47+
def create_index(client, index_name, delete_index):
48+
req = client.put(f'/{index_name}')
49+
req.raise_for_status()

tests/test_index_api.py

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import json
2+
3+
4+
def test_get_index_not_found(client, index_name):
5+
req = client.get(f'/{index_name}')
6+
assert req.status_code == 404, req.content
7+
assert json.loads(req.content) == {'error': 'IndexNotFound'}
8+
9+
10+
def test_get_index(client, index_name, create_index):
11+
req = client.get(f'/{index_name}')
12+
assert req.status_code == 200, req.content
13+
assert json.loads(req.content) == {'version': 0, 'attributes': []}
14+
15+
16+
def test_create_index(client, index_name):
17+
req = client.get(f'/{index_name}')
18+
assert req.status_code == 404, req.content
19+
20+
req = client.put(f'/{index_name}')
21+
assert req.status_code == 200, req.content
22+
assert json.loads(req.content) == {}
23+
24+
req = client.put(f'/{index_name}')
25+
assert req.status_code == 200, req.content
26+
assert json.loads(req.content) == {}
27+
28+
req = client.get(f'/{index_name}')
29+
assert req.status_code == 200, req.content
30+
31+
32+
def test_delete_index(client, index_name, create_index):
33+
req = client.get(f'/{index_name}')
34+
assert req.status_code == 200, req.content
35+
36+
req = client.delete(f'/{index_name}')
37+
assert req.status_code == 200, req.content
38+
assert json.loads(req.content) == {}
39+
40+
req = client.delete(f'/{index_name}')
41+
assert req.status_code == 200, req.content
42+
assert json.loads(req.content) == {}
43+
44+
req = client.get(f'/{index_name}')
45+
assert req.status_code == 404, req.content

0 commit comments

Comments
 (0)