Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 94 additions & 59 deletions exercises/practice/binary-search/.meta/example.sql
Original file line number Diff line number Diff line change
@@ -1,74 +1,109 @@
UPDATE "binary-search"
SET error = 'value not in array'
WHERE JSON(array) = '[]'
;
SET
error = 'value not in array'
WHERE
JSON(array) = '[]';

DROP TABLE IF EXISTS tmp;

CREATE TEMPORARY TABLE tmp (
array TEXT NOT NULL,
value INTEGER NOT NULL,
array TEXT NOT NULL,
value INTEGER NOT NULL,
result TEXT,
PRIMARY KEY(array, value)
PRIMARY KEY (array, value)
);

INSERT INTO tmp
INSERT INTO
tmp
SELECT
array,
value,
(WITH RECURSIVE rcte (list, target) AS (
VALUES ((
SELECT JSON_GROUP_ARRAY(JSON_ARRAY(j.value, j.key))
FROM JSON_EACH("binary-search".array) j),
"binary-search".value
)
UNION
SELECT CASE
WHEN JSON_EXTRACT(
list, PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2)
) = target
THEN JSON_ARRAY(
JSON_EXTRACT(
list,PRINTF('$[%d]', JSON_ARRAY_LENGTH(list) / 2)))
WHEN JSON_EXTRACT(
list, PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2)
) > target
THEN (SELECT JSON_GROUP_ARRAY(JSON(j.value))
FROM JSON_EACH(list) j
WHERE j.key < JSON_ARRAY_LENGTH(list) / 2)
WHEN JSON_EXTRACT(
list, PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2)
) < target
THEN (SELECT JSON_GROUP_ARRAY(JSON(j.value))
FROM JSON_EACH(list) j
WHERE j.key > JSON_ARRAY_LENGTH(list) / 2)
END,
target
FROM rcte
WHERE JSON_ARRAY_LENGTH(list) > 1
)
SELECT IIF(JSON_EXTRACT(list, '$[0][0]') != target,
JSON_OBJECT('error', 'value not in array'),
JSON_OBJECT('result', JSON_EXTRACT(list, '$[0][1]'))
)
FROM rcte
WHERE JSON_ARRAY_LENGTH(list) = 1
(
WITH RECURSIVE
rcte (list, target) AS (
VALUES
(
(
SELECT
JSON_GROUP_ARRAY(JSON_ARRAY(j.value, j.key))
FROM
JSON_EACH("binary-search".array) j
),
"binary-search".value
)
UNION
SELECT
CASE
WHEN JSON_EXTRACT(
list,
PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2)
) = target THEN JSON_ARRAY(
JSON_EXTRACT(
list,
PRINTF('$[%d]', JSON_ARRAY_LENGTH(list) / 2)
)
)
WHEN JSON_EXTRACT(
list,
PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2)
) > target THEN (
SELECT
JSON_GROUP_ARRAY(JSON(j.value))
FROM
JSON_EACH(list) j
WHERE
j.key < JSON_ARRAY_LENGTH(list) / 2
)
WHEN JSON_EXTRACT(
list,
PRINTF('$[%d][0]', JSON_ARRAY_LENGTH(list) / 2)
) < target THEN (
SELECT
JSON_GROUP_ARRAY(JSON(j.value))
FROM
JSON_EACH(list) j
WHERE
j.key > JSON_ARRAY_LENGTH(list) / 2
)
END,
target
FROM
rcte
WHERE
JSON_ARRAY_LENGTH(list) > 1
)
SELECT
IIF(
JSON_EXTRACT(list, '$[0][0]') != target,
JSON_OBJECT('error', 'value not in array'),
JSON_OBJECT('result', JSON_EXTRACT(list, '$[0][1]'))
)
FROM
rcte
WHERE
JSON_ARRAY_LENGTH(list) = 1
)
FROM "binary-search"
WHERE JSON(array) != '[]'
;
FROM
"binary-search"
WHERE
JSON(array) != '[]';

UPDATE "binary-search"
SET error = JSON_EXTRACT(tmp.result, '$."error"')
FROM tmp
WHERE "binary-search".array = tmp.array
AND "binary-search".value = tmp.value
AND JSON_EXTRACT(tmp.result, '$."error"') NOTNULL
;
SET
error = JSON_EXTRACT(tmp.result, '$."error"')
FROM
tmp
WHERE
"binary-search".array = tmp.array
AND "binary-search".value = tmp.value
AND JSON_EXTRACT(tmp.result, '$."error"') NOTNULL;

UPDATE "binary-search"
SET result = JSON_EXTRACT(tmp.result, '$."result"')
FROM tmp
WHERE "binary-search".array = tmp.array
AND "binary-search".value = tmp.value
AND JSON_EXTRACT(tmp.result, '$."result"') NOTNULL
;
SET
result = JSON_EXTRACT(tmp.result, '$."result"')
FROM
tmp
WHERE
"binary-search".array = tmp.array
AND "binary-search".value = tmp.value
AND JSON_EXTRACT(tmp.result, '$."result"') NOTNULL;
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
DROP TABLE IF EXISTS tests;

CREATE TABLE IF NOT EXISTS tests (
-- uuid and description are taken from the test.toml file
uuid TEXT PRIMARY KEY,
Expand All @@ -10,13 +11,21 @@ CREATE TABLE IF NOT EXISTS tests (
test_code TEXT,
task_id INTEGER DEFAULT NULL,
-- Here are columns for the actual tests
array TEXT NOT NULL, -- json array
array TEXT NOT NULL, -- json array
value INTEGER NOT NULL,
expected_result INTEGER,
expected_error TEXT
);

INSERT INTO tests (uuid, description, array, value, expected_result, expected_error)
INSERT INTO
tests (
uuid,
description,
array,
value,
expected_result,
expected_error
)
VALUES
{%- for case in cases %}
(
Expand Down
13 changes: 11 additions & 2 deletions exercises/practice/binary-search/create_test_table.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
DROP TABLE IF EXISTS tests;

CREATE TABLE IF NOT EXISTS tests (
-- uuid and description are taken from the test.toml file
uuid TEXT PRIMARY KEY,
Expand All @@ -10,13 +11,21 @@ CREATE TABLE IF NOT EXISTS tests (
test_code TEXT,
task_id INTEGER DEFAULT NULL,
-- Here are columns for the actual tests
array TEXT NOT NULL, -- json array
array TEXT NOT NULL, -- json array
value INTEGER NOT NULL,
expected_result INTEGER,
expected_error TEXT
);

INSERT INTO tests (uuid, description, array, value, expected_result, expected_error)
INSERT INTO
tests (
uuid,
description,
array,
value,
expected_result,
expected_error
)
VALUES
(
'b55c24a9-a98d-4379-a08c-2adcf8ebeee8',
Expand Down
Loading