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 #!/usr/bin/env bash
set -e set -e
set -o pipefail
mkdir -p wasm mkdir -p wasm

View File

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

View File

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

View File

@ -26,11 +26,15 @@ export class PostRequest extends Request {
export class FetchRequest extends Request { export class FetchRequest extends Request {
public readonly username: string | null; 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(); super();
this.action = Action.Fetch; this.action = Action.Fetch;
this.username = username; 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 { export function decode(input: string): Request {
let jsonHandler = new RequestJSONEventsHandler(); let json = new RequestJSONEventsHandler();
let decoder = new JSONDecoder<RequestJSONEventsHandler>(jsonHandler); let decoder = new JSONDecoder<RequestJSONEventsHandler>(json);
let bytes = string2Bytes(input); let bytes = string2Bytes(input);
decoder.deserialize(bytes); decoder.deserialize(bytes);
let action = jsonHandler.action; let action = json.action;
let request: Request; let request: Request;
if (action == "Fetch") { if (action == "Fetch") {
request = new FetchRequest(jsonHandler.filter_handle); request = new FetchRequest(json.filter_handle, json.offset, json.count);
} else if (action == "Post") { } else if (action == "Post") {
request = new PostRequest(jsonHandler.message, jsonHandler.username) request = new PostRequest(json.message, json.username)
} else { } else {
request = new UnknownRequest() request = new UnknownRequest()
} }
@ -74,8 +78,12 @@ class RequestJSONEventsHandler extends JSONHandler {
public message: string; public message: string;
public username: string; public username: string;
public filter_handle: string | null; public filter_handle: string | null;
public offset: u32;
public count: u32;
setString(name: string, value: string): void { setString(name: string, value: string): void {
this.offset = 0;
this.count = 0;
if (name == "action") { if (name == "action") {
this.action = value; this.action = value;
@ -84,6 +92,10 @@ class RequestJSONEventsHandler extends JSONHandler {
} else if (name == "username") { } else if (name == "username") {
this.username = value; this.username = value;
this.filter_handle = 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 // 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 #!/usr/bin/env bash
set -e set -e
set -o pipefail
mkdir -p wasm mkdir -p wasm

View File

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

View File

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

View File

@ -10,19 +10,21 @@ export function addMessage(message: string, username: string): void {
query(request); 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) { if (username) {
let whereClause = ` WHERE username = "` + username + `" `;
let request = let request =
`SELECT json_group_array( `SELECT json_group_array(
json_object('message', message, 'username', username) json_object('message', message, 'username', username)
) AS json_result FROM ) AS json_result FROM
(SELECT * FROM messages WHERE username = "` + username + `")`; (SELECT * FROM messages` + whereClause + limitClause + `)`;
return query(request); return query(request);
} else { } else {
let request = let request =
`SELECT json_group_array( `SELECT json_group_array(
json_object('message', message, 'username', username) json_object('message', message, 'username', username)
) AS json_result FROM (SELECT * FROM messages)`; ) AS json_result FROM (SELECT * FROM messages` + limitClause + `)`;
return query(request); return query(request);
} }
} }

View File

@ -26,11 +26,15 @@ export class PostRequest extends Request {
export class FetchRequest extends Request { export class FetchRequest extends Request {
public readonly username: string | null; 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(); super();
this.action = Action.Fetch; this.action = Action.Fetch;
this.username = username; 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 { export function decode(input: string): Request {
let jsonHandler = new RequestJSONEventsHandler(); let json = new RequestJSONEventsHandler();
let decoder = new JSONDecoder<RequestJSONEventsHandler>(jsonHandler); let decoder = new JSONDecoder<RequestJSONEventsHandler>(json);
let bytes = string2Bytes(input); let bytes = string2Bytes(input);
decoder.deserialize(bytes); decoder.deserialize(bytes);
let action = jsonHandler.action; let action = json.action;
let request: Request; let request: Request;
if (action == "Fetch") { if (action == "Fetch") {
request = new FetchRequest(jsonHandler.filter_handle); request = new FetchRequest(json.filter_handle, json.offset, json.count);
} else if (action == "Post") { } else if (action == "Post") {
request = new PostRequest(jsonHandler.message, jsonHandler.username) request = new PostRequest(json.message, json.username)
} else { } else {
request = new UnknownRequest() request = new UnknownRequest()
} }
@ -74,8 +78,12 @@ class RequestJSONEventsHandler extends JSONHandler {
public message: string; public message: string;
public username: string; public username: string;
public filter_handle: string | null; public filter_handle: string | null;
public offset: u32;
public count: u32;
setString(name: string, value: string): void { setString(name: string, value: string): void {
this.offset = 0;
this.count = 0;
if (name == "action") { if (name == "action") {
this.action = value; this.action = value;
@ -84,6 +92,10 @@ class RequestJSONEventsHandler extends JSONHandler {
} else if (name == "username") { } else if (name == "username") {
this.username = value; this.username = value;
this.filter_handle = 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 // 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 #!/usr/bin/env bash
set -e set -e
set -o pipefail
command -v jq >/dev/null 2>&1 || { command -v jq >/dev/null 2>&1 || {
echo >&2 "jq is not installed, wouldn't parse responses" 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 # Assign json to a variable using heredoc technique
JSON=$(cat <<JSON JSON=$(cat <<JSON
{"action":"Fetch", "handle": "random_joe"} {"action":"Fetch", "handle": "random_joe", "offset": 0, "limit": 10}
JSON JSON
) )

View File

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

View File

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

View File

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

View File

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