Implement limit for AS

This commit is contained in:
folex 2019-08-18 16:05:11 +03:00
parent 2146507ed9
commit 959143a5d7
14 changed files with 53 additions and 19 deletions

View File

@ -1,6 +1,7 @@
#!/usr/bin/env bash
set -e
set -o pipefail
mkdir -p wasm

View File

@ -19,7 +19,7 @@ export function handler(input: string): string {
} else if (request.action == Action.Fetch) {
let fetch = request as FetchRequest;
let result = getMessages(fetch.username);
let result = getMessages(fetch.username, fetch.offset, fetch.count);
return result;
}

View File

@ -6,7 +6,7 @@ export function createScheme(): void {
export function addMessage(message: string, username: string): void {
log("add message");
}
export function getMessages(username: string | null): string {
export function getMessages(username: string | null, offset: u32, count: u32): string {
log("get messages");
return "[]";
}

View File

@ -26,11 +26,15 @@ export class PostRequest extends Request {
export class FetchRequest extends Request {
public readonly username: string | null;
public readonly offset: u32;
public readonly count: u32;
constructor(username: string | null) {
constructor(username: string | null, offset: u32, count: u32) {
super();
this.action = Action.Fetch;
this.username = username;
this.offset = offset;
this.count = count;
}
}
@ -46,21 +50,21 @@ export function string2Bytes(str: string): Uint8Array {
}
export function decode(input: string): Request {
let jsonHandler = new RequestJSONEventsHandler();
let decoder = new JSONDecoder<RequestJSONEventsHandler>(jsonHandler);
let json = new RequestJSONEventsHandler();
let decoder = new JSONDecoder<RequestJSONEventsHandler>(json);
let bytes = string2Bytes(input);
decoder.deserialize(bytes);
let action = jsonHandler.action;
let action = json.action;
let request: Request;
if (action == "Fetch") {
request = new FetchRequest(jsonHandler.filter_handle);
request = new FetchRequest(json.filter_handle, json.offset, json.count);
} else if (action == "Post") {
request = new PostRequest(jsonHandler.message, jsonHandler.username)
request = new PostRequest(json.message, json.username)
} else {
request = new UnknownRequest()
}
@ -74,8 +78,12 @@ class RequestJSONEventsHandler extends JSONHandler {
public message: string;
public username: string;
public filter_handle: string | null;
public offset: u32;
public count: u32;
setString(name: string, value: string): void {
this.offset = 0;
this.count = 0;
if (name == "action") {
this.action = value;
@ -84,6 +92,10 @@ class RequestJSONEventsHandler extends JSONHandler {
} else if (name == "username") {
this.username = value;
this.filter_handle = value;
} else if (name == "offset") {
this.offset = U32.parseInt(value);
} else if (name == "count") {
this.count = U32.parseInt(value);
}
// json scheme is not strict, so we won't throw an error on excess fields
}

View File

@ -1,6 +1,7 @@
#!/usr/bin/env bash
set -e
set -o pipefail
mkdir -p wasm

View File

@ -1,6 +1,7 @@
#!/usr/bin/env bash
set -e
set -o pipefail
mkdir -p wasm

View File

@ -19,7 +19,7 @@ export function handler(input: string): string {
} else if (request.action == Action.Fetch) {
let fetch = request as FetchRequest;
let result = getMessages(fetch.username);
let result = getMessages(fetch.username, fetch.offset, fetch.count);
let response = decodePosts(result);
return response.serialize();

View File

@ -10,19 +10,21 @@ export function addMessage(message: string, username: string): void {
query(request);
}
export function getMessages(username: string | null): string {
export function getMessages(username: string | null, offset: u32, count: u32): string {
let limitClause = ` LIMIT ` + count.toString() + ` OFFSET ` + offset.toString() + ` `;
if (username) {
let whereClause = ` WHERE username = "` + username + `" `;
let request =
`SELECT json_group_array(
json_object('message', message, 'username', username)
) AS json_result FROM
(SELECT * FROM messages WHERE username = "` + username + `")`;
(SELECT * FROM messages` + whereClause + limitClause + `)`;
return query(request);
} else {
let request =
`SELECT json_group_array(
json_object('message', message, 'username', username)
) AS json_result FROM (SELECT * FROM messages)`;
) AS json_result FROM (SELECT * FROM messages` + limitClause + `)`;
return query(request);
}
}

View File

@ -26,11 +26,15 @@ export class PostRequest extends Request {
export class FetchRequest extends Request {
public readonly username: string | null;
public readonly offset: u32;
public readonly count: u32;
constructor(username: string | null) {
constructor(username: string | null, offset: u32, count: u32) {
super();
this.action = Action.Fetch;
this.username = username;
this.offset = offset;
this.count = count;
}
}
@ -46,21 +50,21 @@ export function string2Bytes(str: string): Uint8Array {
}
export function decode(input: string): Request {
let jsonHandler = new RequestJSONEventsHandler();
let decoder = new JSONDecoder<RequestJSONEventsHandler>(jsonHandler);
let json = new RequestJSONEventsHandler();
let decoder = new JSONDecoder<RequestJSONEventsHandler>(json);
let bytes = string2Bytes(input);
decoder.deserialize(bytes);
let action = jsonHandler.action;
let action = json.action;
let request: Request;
if (action == "Fetch") {
request = new FetchRequest(jsonHandler.filter_handle);
request = new FetchRequest(json.filter_handle, json.offset, json.count);
} else if (action == "Post") {
request = new PostRequest(jsonHandler.message, jsonHandler.username)
request = new PostRequest(json.message, json.username)
} else {
request = new UnknownRequest()
}
@ -74,8 +78,12 @@ class RequestJSONEventsHandler extends JSONHandler {
public message: string;
public username: string;
public filter_handle: string | null;
public offset: u32;
public count: u32;
setString(name: string, value: string): void {
this.offset = 0;
this.count = 0;
if (name == "action") {
this.action = value;
@ -84,6 +92,10 @@ class RequestJSONEventsHandler extends JSONHandler {
} else if (name == "username") {
this.username = value;
this.filter_handle = value;
} else if (name == "offset") {
this.offset = U32.parseInt(value);
} else if (name == "count") {
this.count = U32.parseInt(value);
}
// json scheme is not strict, so we won't throw an error on excess fields
}

View File

@ -1,6 +1,7 @@
#!/usr/bin/env bash
set -e
set -o pipefail
command -v jq >/dev/null 2>&1 || {
echo >&2 "jq is not installed, wouldn't parse responses"
@ -64,7 +65,7 @@ echo "$RESPONSE" | jq . 2>/dev/null || echo "$RESPONSE"
# Assign json to a variable using heredoc technique
JSON=$(cat <<JSON
{"action":"Fetch", "handle": "random_joe"}
{"action":"Fetch", "handle": "random_joe", "offset": 0, "limit": 10}
JSON
)

View File

@ -1,6 +1,7 @@
#!/usr/bin/env bash
set -e
set -o pipefail
mkdir -p wasm

View File

@ -1,6 +1,7 @@
#!/usr/bin/env bash
set -e
set -o pipefail
mkdir -p wasm

View File

@ -1,6 +1,7 @@
#!/usr/bin/env bash
set -e
set -o pipefail
mkdir -p wasm

View File

@ -1,6 +1,7 @@
#!/usr/bin/env bash
set -e
set -o pipefail
mkdir -p wasm