Skip to content

Commit bf21d01

Browse files
authored
Pre-optimise routes at indexing time (#605)
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent 2a26416 commit bf21d01

File tree

9 files changed

+69
-33
lines changed

9 files changed

+69
-33
lines changed

src/index/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::alterschema
2020
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::editorschema)
2121
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::parallel)
2222
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::options)
23+
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::uritemplate)
2324
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::blaze::compiler)
2425
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::blaze::evaluator)
2526
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::blaze::output)

src/index/generators.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <sourcemeta/core/json.h>
1111
#include <sourcemeta/core/jsonpointer.h>
1212
#include <sourcemeta/core/jsonschema.h>
13+
#include <sourcemeta/core/uritemplate.h>
1314

1415
#include <sourcemeta/blaze/compiler.h>
1516
#include <sourcemeta/blaze/evaluator.h>
@@ -408,6 +409,18 @@ struct GENERATE_STATS {
408409
}
409410
};
410411

412+
struct GENERATE_URITEMPLATE_ROUTES {
413+
using Context = sourcemeta::core::URITemplateRouter;
414+
static auto
415+
handler(const std::filesystem::path &destination,
416+
const sourcemeta::core::BuildDependencies<std::filesystem::path> &,
417+
const sourcemeta::core::BuildDynamicCallback<std::filesystem::path> &,
418+
const Context &router) -> void {
419+
std::filesystem::create_directories(destination.parent_path());
420+
sourcemeta::core::URITemplateRouterView::save(router, destination);
421+
}
422+
};
423+
411424
} // namespace sourcemeta::one
412425

413426
#endif

src/index/index.cc

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <sourcemeta/core/options.h>
55
#include <sourcemeta/core/parallel.h>
66
#include <sourcemeta/core/uri.h>
7+
#include <sourcemeta/core/uritemplate.h>
78

89
#include <sourcemeta/one/configuration.h>
910
#include <sourcemeta/one/resolver.h>
@@ -470,6 +471,48 @@ static auto index_main(const std::string_view &program,
470471
concurrency);
471472
}
472473

474+
/////////////////////////////////////////////////////////////////////////////
475+
// (12) Generate the pre computed routes
476+
/////////////////////////////////////////////////////////////////////////////
477+
478+
sourcemeta::core::URITemplateRouter router;
479+
router.add("/self/v1/api/list", sourcemeta::one::HANDLER_SELF_V1_API_LIST);
480+
router.add("/self/v1/api/list/{+path}",
481+
sourcemeta::one::HANDLER_SELF_V1_API_LIST_PATH);
482+
router.add("/self/v1/api/schemas/dependencies/{+schema}",
483+
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_DEPENDENCIES);
484+
router.add("/self/v1/api/schemas/health/{+schema}",
485+
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_HEALTH);
486+
router.add("/self/v1/api/schemas/locations/{+schema}",
487+
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_LOCATIONS);
488+
router.add("/self/v1/api/schemas/positions/{+schema}",
489+
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_POSITIONS);
490+
router.add("/self/v1/api/schemas/stats/{+schema}",
491+
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_STATS);
492+
router.add("/self/v1/api/schemas/metadata/{+schema}",
493+
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_METADATA);
494+
router.add("/self/v1/api/schemas/evaluate/{+schema}",
495+
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_EVALUATE);
496+
router.add("/self/v1/api/schemas/trace/{+schema}",
497+
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_TRACE);
498+
router.add("/self/v1/api/schemas/search",
499+
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_SEARCH);
500+
router.add("/self/v1/api/{+any}",
501+
sourcemeta::one::HANDLER_SELF_V1_API_DEFAULT);
502+
503+
if (configuration.html.has_value()) {
504+
router.add("/self/static/{+path}", sourcemeta::one::HANDLER_SELF_STATIC);
505+
}
506+
507+
const auto routes_path{output.path() / "routes.bin"};
508+
DISPATCH<sourcemeta::one::GENERATE_URITEMPLATE_ROUTES>(
509+
routes_path, {mark_configuration_path, mark_version_path}, router, mutex,
510+
"Producing", routes_path.string(), "routes", adapter, output);
511+
512+
/////////////////////////////////////////////////////////////////////////////
513+
// Finish generation
514+
/////////////////////////////////////////////////////////////////////////////
515+
473516
// TODO: Print the size of the output directory here
474517

475518
output.remove_unknown_files();

src/server/server.cc

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ static const Handler HANDLERS[] = {handle_default,
246246
handle_self_api_not_found,
247247
handle_self_static};
248248

249-
static auto dispatch(const sourcemeta::core::URITemplateRouter &router,
249+
static auto dispatch(const sourcemeta::core::URITemplateRouterView &router,
250250
const std::filesystem::path &base,
251251
uWS::HttpResponse<true> *const raw_response,
252252
uWS::HttpRequest *const raw_request) noexcept -> void {
@@ -306,38 +306,7 @@ auto main(int argc, char *argv[]) noexcept -> int {
306306

307307
const auto port{static_cast<std::uint32_t>(std::stoul(argv[2]))};
308308
const auto base{std::filesystem::canonical(argv[1])};
309-
const auto is_headless{!std::filesystem::exists(
310-
base / "explorer" / SENTINEL / "directory-html.metapack")};
311-
312-
// TODO: Restore this from a URI Template binary view
313-
sourcemeta::core::URITemplateRouter router;
314-
router.add("/self/v1/api/list", sourcemeta::one::HANDLER_SELF_V1_API_LIST);
315-
router.add("/self/v1/api/list/{+path}",
316-
sourcemeta::one::HANDLER_SELF_V1_API_LIST_PATH);
317-
router.add("/self/v1/api/schemas/dependencies/{+schema}",
318-
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_DEPENDENCIES);
319-
router.add("/self/v1/api/schemas/health/{+schema}",
320-
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_HEALTH);
321-
router.add("/self/v1/api/schemas/locations/{+schema}",
322-
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_LOCATIONS);
323-
router.add("/self/v1/api/schemas/positions/{+schema}",
324-
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_POSITIONS);
325-
router.add("/self/v1/api/schemas/stats/{+schema}",
326-
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_STATS);
327-
router.add("/self/v1/api/schemas/metadata/{+schema}",
328-
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_METADATA);
329-
router.add("/self/v1/api/schemas/evaluate/{+schema}",
330-
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_EVALUATE);
331-
router.add("/self/v1/api/schemas/trace/{+schema}",
332-
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_TRACE);
333-
router.add("/self/v1/api/schemas/search",
334-
sourcemeta::one::HANDLER_SELF_V1_API_SCHEMAS_SEARCH);
335-
router.add("/self/v1/api/{+any}",
336-
sourcemeta::one::HANDLER_SELF_V1_API_DEFAULT);
337-
338-
if (!is_headless) {
339-
router.add("/self/static/{+path}", sourcemeta::one::HANDLER_SELF_STATIC);
340-
}
309+
const sourcemeta::core::URITemplateRouterView router{base / "routes.bin"};
341310

342311
uWS::LocalCluster(
343312
{}, [&router, &base, port, timestamp_start](uWS::SSLApp &app) -> void {

test/cli/index/rebuild-cache.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ Detecting: $(realpath "$TMP")/schemas/foo.json (#1)
9999
(skip) Rendering: . [not-found]
100100
(100%) Rendering: example/schemas/foo
101101
(skip) Rendering: example/schemas/foo [schema]
102+
(skip) Producing: $(realpath "$TMP")/output/routes.bin [routes]
102103
EOF
103104
diff "$TMP/output.txt" "$TMP/expected.txt"
104105

@@ -128,6 +129,7 @@ Detecting: $(realpath "$TMP")/schemas/foo.json (#1)
128129
( 75%) Rendering: .
129130
(skip) Rendering: . [not-found]
130131
(100%) Rendering: example/schemas/foo
132+
(skip) Producing: $(realpath "$TMP")/output/routes.bin [routes]
131133
EOF
132134
diff "$TMP/output.txt" "$TMP/expected.txt"
133135

test/cli/index/rebuild-to-empty.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ cat << 'EOF' > "$TMP/new-expected.txt"
5858
./explorer/%/directory.metapack.deps
5959
./explorer/%/search.metapack
6060
./explorer/%/search.metapack.deps
61+
./routes.bin
62+
./routes.bin.deps
6163
./version.json
6264
EOF
6365

test/sandbox/manifest-empty.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@
99
./explorer/%/directory.metapack.deps
1010
./explorer/%/search.metapack
1111
./explorer/%/search.metapack.deps
12+
./routes.bin
13+
./routes.bin.deps
1214
./version.json

test/sandbox/manifest-headless.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5399,6 +5399,8 @@
53995399
./explorer/test/v2.0/schema/%
54005400
./explorer/test/v2.0/schema/%/schema.metapack
54015401
./explorer/test/v2.0/schema/%/schema.metapack.deps
5402+
./routes.bin
5403+
./routes.bin.deps
54025404
./schemas
54035405
./schemas/self
54045406
./schemas/self/v1

test/sandbox/manifest-html.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8101,6 +8101,8 @@
81018101
./explorer/test/v2.0/schema/%/schema-html.metapack.deps
81028102
./explorer/test/v2.0/schema/%/schema.metapack
81038103
./explorer/test/v2.0/schema/%/schema.metapack.deps
8104+
./routes.bin
8105+
./routes.bin.deps
81048106
./schemas
81058107
./schemas/self
81068108
./schemas/self/v1

0 commit comments

Comments
 (0)