-module(bench@memory_adapter_bench). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/bench/memory_adapter_bench.gleam"). -export([main/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. -file("src/bench/memory_adapter_bench.gleam", 21). ?DOC(" Create a user schema for benchmarking\n"). -spec user_schema() -> cquill@schema:schema(). user_schema() -> _pipe = cquill@schema:new(<<"users"/utf8>>), _pipe@2 = cquill@schema:field( _pipe, begin _pipe@1 = cquill@schema@field:integer(<<"id"/utf8>>), cquill@schema@field:primary_key(_pipe@1) end ), _pipe@4 = cquill@schema:field( _pipe@2, begin _pipe@3 = cquill@schema@field:string(<<"email"/utf8>>), cquill@schema@field:not_null(_pipe@3) end ), _pipe@5 = cquill@schema:field( _pipe@4, cquill@schema@field:string(<<"name"/utf8>>) ), _pipe@6 = cquill@schema:field( _pipe@5, cquill@schema@field:boolean(<<"active"/utf8>>) ), _pipe@7 = cquill@schema:field( _pipe@6, cquill@schema@field:integer(<<"age"/utf8>>) ), cquill@schema:single_primary_key(_pipe@7, <<"id"/utf8>>). -file("src/bench/memory_adapter_bench.gleam", 32). ?DOC(" Create a store with the user table\n"). -spec create_store() -> cquill@adapter@memory:memory_store(). create_store() -> _pipe = cquill@adapter@memory:new(), cquill@adapter@memory:create_table_from_schema(_pipe, user_schema()). -file("src/bench/memory_adapter_bench.gleam", 38). ?DOC(" Create a store pre-populated with n users\n"). -spec create_populated_store(integer()) -> cquill@adapter@memory:memory_store(). create_populated_store(Count) -> Store = create_store(), Rows = begin _pipe = gleam@list:range(1, Count), gleam@list:map( _pipe, fun(I) -> Row = [gleam_stdlib:identity(I), gleam_stdlib:identity( <<<<"user"/utf8, (erlang:integer_to_binary(I))/binary>>/binary, "@example.com"/utf8>> ), gleam_stdlib:identity( <<"User "/utf8, (erlang:integer_to_binary(I))/binary>> ), gleam_stdlib:identity(true), gleam_stdlib:identity(20 + (I rem 50))], {erlang:integer_to_binary(I), Row} end ) end, case cquill@adapter@memory:insert_all(Store, <<"users"/utf8>>, Rows) of {ok, {New_store, _}} -> New_store; {error, _} -> Store end. -file("src/bench/memory_adapter_bench.gleam", 60). ?DOC(" Create a single user row\n"). -spec create_user_row(integer()) -> list(gleam@dynamic:dynamic_()). create_user_row(Id) -> [gleam_stdlib:identity(Id), gleam_stdlib:identity( <<<<"user"/utf8, (erlang:integer_to_binary(Id))/binary>>/binary, "@example.com"/utf8>> ), gleam_stdlib:identity( <<"User "/utf8, (erlang:integer_to_binary(Id))/binary>> ), gleam_stdlib:identity(true), gleam_stdlib:identity(25)]. -file("src/bench/memory_adapter_bench.gleam", 75). ?DOC(" Benchmark single row insert\n"). -spec bench_single_insert() -> nil. bench_single_insert() -> Store = create_store(), Row = create_user_row(1), _ = cquill@adapter@memory:insert_row( Store, <<"users"/utf8>>, <<"1"/utf8>>, Row ), nil. -file("src/bench/memory_adapter_bench.gleam", 83). ?DOC(" Benchmark batch insert of 10 rows\n"). -spec bench_batch_insert_10() -> nil. bench_batch_insert_10() -> Store = create_store(), Rows = begin _pipe = gleam@list:range(1, 10), gleam@list:map( _pipe, fun(I) -> {erlang:integer_to_binary(I), create_user_row(I)} end ) end, _ = cquill@adapter@memory:insert_all(Store, <<"users"/utf8>>, Rows), nil. -file("src/bench/memory_adapter_bench.gleam", 93). ?DOC(" Benchmark batch insert of 100 rows\n"). -spec bench_batch_insert_100() -> nil. bench_batch_insert_100() -> Store = create_store(), Rows = begin _pipe = gleam@list:range(1, 100), gleam@list:map( _pipe, fun(I) -> {erlang:integer_to_binary(I), create_user_row(I)} end ) end, _ = cquill@adapter@memory:insert_all(Store, <<"users"/utf8>>, Rows), nil. -file("src/bench/memory_adapter_bench.gleam", 103). ?DOC(" Benchmark batch insert of 1000 rows\n"). -spec bench_batch_insert_1000() -> nil. bench_batch_insert_1000() -> Store = create_store(), Rows = begin _pipe = gleam@list:range(1, 1000), gleam@list:map( _pipe, fun(I) -> {erlang:integer_to_binary(I), create_user_row(I)} end ) end, _ = cquill@adapter@memory:insert_all(Store, <<"users"/utf8>>, Rows), nil. -file("src/bench/memory_adapter_bench.gleam", 117). ?DOC(" Benchmark get single row by key\n"). -spec bench_get_by_key() -> nil. bench_get_by_key() -> Store = create_populated_store(1000), _ = cquill@adapter@memory:get_row(Store, <<"users"/utf8>>, <<"500"/utf8>>), nil. -file("src/bench/memory_adapter_bench.gleam", 124). ?DOC(" Benchmark get all rows from small table (100 rows)\n"). -spec bench_get_all_100() -> nil. bench_get_all_100() -> Store = create_populated_store(100), _ = cquill@adapter@memory:get_all_rows(Store, <<"users"/utf8>>), nil. -file("src/bench/memory_adapter_bench.gleam", 131). ?DOC(" Benchmark get all rows from medium table (1000 rows)\n"). -spec bench_get_all_1000() -> nil. bench_get_all_1000() -> Store = create_populated_store(1000), _ = cquill@adapter@memory:get_all_rows(Store, <<"users"/utf8>>), nil. -file("src/bench/memory_adapter_bench.gleam", 138). ?DOC(" Benchmark get all rows from large table (10000 rows)\n"). -spec bench_get_all_10000() -> nil. bench_get_all_10000() -> Store = create_populated_store(10000), _ = cquill@adapter@memory:get_all_rows(Store, <<"users"/utf8>>), nil. -file("src/bench/memory_adapter_bench.gleam", 145). ?DOC(" Benchmark row count operation\n"). -spec bench_row_count() -> nil. bench_row_count() -> Store = create_populated_store(1000), _ = cquill@adapter@memory:row_count(Store, <<"users"/utf8>>), nil. -file("src/bench/memory_adapter_bench.gleam", 156). ?DOC(" Benchmark single row update\n"). -spec bench_single_update() -> nil. bench_single_update() -> Store = create_populated_store(100), Updated_row = [gleam_stdlib:identity(50), gleam_stdlib:identity(<<"updated@example.com"/utf8>>), gleam_stdlib:identity(<<"Updated User"/utf8>>), gleam_stdlib:identity(false), gleam_stdlib:identity(30)], _ = cquill@adapter@memory:update_row( Store, <<"users"/utf8>>, <<"50"/utf8>>, Updated_row ), nil. -file("src/bench/memory_adapter_bench.gleam", 170). ?DOC(" Benchmark update all rows matching predicate\n"). -spec bench_update_all_matching() -> nil. bench_update_all_matching() -> Store = create_populated_store(100), _ = cquill@adapter@memory:update_all( Store, <<"users"/utf8>>, fun(_, _) -> true end, fun(Row) -> case Row of [Id, Email, Name, _, Age] -> [Id, Email, Name, gleam_stdlib:identity(false), Age]; _ -> Row end end ), nil. -file("src/bench/memory_adapter_bench.gleam", 194). ?DOC(" Benchmark single row delete\n"). -spec bench_single_delete() -> nil. bench_single_delete() -> Store = create_populated_store(100), _ = cquill@adapter@memory:delete_row(Store, <<"users"/utf8>>, <<"50"/utf8>>), nil. -file("src/bench/memory_adapter_bench.gleam", 201). ?DOC(" Benchmark delete all rows matching predicate\n"). -spec bench_delete_all_matching() -> nil. bench_delete_all_matching() -> Store = create_populated_store(100), _ = cquill@adapter@memory:delete_all( Store, <<"users"/utf8>>, fun(Key, _) -> case gleam_stdlib:parse_int(Key) of {ok, Id} -> (Id rem 2) =:= 0; {error, _} -> false end end ), nil. -file("src/bench/memory_adapter_bench.gleam", 215). ?DOC(" Benchmark truncate table\n"). -spec bench_truncate_table() -> nil. bench_truncate_table() -> Store = create_populated_store(1000), _ = cquill@adapter@memory:delete_all_rows(Store, <<"users"/utf8>>), nil. -file("src/bench/memory_adapter_bench.gleam", 226). ?DOC(" Benchmark transaction with commit\n"). -spec bench_transaction_commit() -> nil. bench_transaction_commit() -> Store = create_populated_store(100), _ = cquill@adapter@memory:execute_transaction( Store, fun(Tx_store) -> Row = create_user_row(999), case cquill@adapter@memory:insert_row( Tx_store, <<"users"/utf8>>, <<"999"/utf8>>, Row ) of {ok, New_store} -> {ok, {New_store, nil}}; {error, E} -> {error, E} end end ), nil. -file("src/bench/memory_adapter_bench.gleam", 240). ?DOC(" Benchmark transaction with rollback\n"). -spec bench_transaction_rollback() -> nil. bench_transaction_rollback() -> Store = create_populated_store(100), _ = cquill@adapter@memory:execute_transaction( Store, fun(Tx_store) -> Row = create_user_row(50), case cquill@adapter@memory:insert_row( Tx_store, <<"users"/utf8>>, <<"50"/utf8>>, Row ) of {ok, New_store} -> {ok, {New_store, nil}}; {error, E} -> {error, E} end end ), nil. -file("src/bench/memory_adapter_bench.gleam", 256). ?DOC(" Benchmark nested transactions (savepoints)\n"). -spec bench_nested_transaction() -> nil. bench_nested_transaction() -> Store = create_populated_store(100), _ = cquill@adapter@memory:execute_transaction( Store, fun(Tx_store) -> case cquill@adapter@memory:create_savepoint( Tx_store, <<"sp1"/utf8>> ) of {ok, Sp_store} -> Row = create_user_row(999), case cquill@adapter@memory:insert_row( Sp_store, <<"users"/utf8>>, <<"999"/utf8>>, Row ) of {ok, New_store} -> case cquill@adapter@memory:release_savepoint( New_store, <<"sp1"/utf8>> ) of {ok, Final_store} -> {ok, {Final_store, nil}}; {error, _} -> {ok, {Sp_store, nil}} end; {error, E} -> {error, E} end; {error, _} -> {ok, {Tx_store, nil}} end end ), nil. -file("src/bench/memory_adapter_bench.gleam", 283). ?DOC(" Benchmark unique constraint check on insert\n"). -spec bench_unique_constraint_check() -> nil. bench_unique_constraint_check() -> Store = create_populated_store(100), Row = create_user_row(50), _ = cquill@adapter@memory:insert_row( Store, <<"users"/utf8>>, <<"50"/utf8>>, Row ), nil. -file("src/bench/memory_adapter_bench.gleam", 295). -spec main() -> nil. main() -> gleam_stdlib:println(<<""/utf8>>), gleam_stdlib:println(<<"cquill Memory Adapter Benchmarks"/utf8>>), gleam_stdlib:println(<<"================================="/utf8>>), gleam_stdlib:println(<<""/utf8>>), Quick = bench@bench:quick_config(), Default = bench@bench:default_config(), Insert_suite = bench@bench:run_suite( <<"Insert Operations"/utf8>>, [{<<"Single insert"/utf8>>, fun bench_single_insert/0}, {<<"Batch insert (10 rows)"/utf8>>, fun bench_batch_insert_10/0}, {<<"Batch insert (100 rows)"/utf8>>, fun bench_batch_insert_100/0}], Default ), Batch_insert_suite = bench@bench:run_suite( <<"Large Batch Insert"/utf8>>, [{<<"Batch insert (1000 rows)"/utf8>>, fun bench_batch_insert_1000/0}], Quick ), Query_suite = bench@bench:run_suite( <<"Query Operations"/utf8>>, [{<<"Get by key (1000 rows)"/utf8>>, fun bench_get_by_key/0}, {<<"Get all (100 rows)"/utf8>>, fun bench_get_all_100/0}, {<<"Get all (1000 rows)"/utf8>>, fun bench_get_all_1000/0}, {<<"Row count"/utf8>>, fun bench_row_count/0}], Default ), Large_query_suite = bench@bench:run_suite( <<"Large Query Operations"/utf8>>, [{<<"Get all (10000 rows)"/utf8>>, fun bench_get_all_10000/0}], Quick ), Update_suite = bench@bench:run_suite( <<"Update Operations"/utf8>>, [{<<"Single update"/utf8>>, fun bench_single_update/0}, {<<"Update all matching"/utf8>>, fun bench_update_all_matching/0}], Default ), Delete_suite = bench@bench:run_suite( <<"Delete Operations"/utf8>>, [{<<"Single delete"/utf8>>, fun bench_single_delete/0}, {<<"Delete matching"/utf8>>, fun bench_delete_all_matching/0}, {<<"Truncate (1000 rows)"/utf8>>, fun bench_truncate_table/0}], Default ), Transaction_suite = bench@bench:run_suite( <<"Transaction Operations"/utf8>>, [{<<"Transaction + commit"/utf8>>, fun bench_transaction_commit/0}, {<<"Transaction + rollback"/utf8>>, fun bench_transaction_rollback/0}, {<<"Nested transaction (savepoint)"/utf8>>, fun bench_nested_transaction/0}], Default ), Constraint_suite = bench@bench:run_suite( <<"Constraint Checking"/utf8>>, [{<<"Unique constraint check"/utf8>>, fun bench_unique_constraint_check/0}], Default ), bench@bench:print_suite_summary(Insert_suite), bench@bench:print_suite_summary(Batch_insert_suite), bench@bench:print_suite_summary(Query_suite), bench@bench:print_suite_summary(Large_query_suite), bench@bench:print_suite_summary(Update_suite), bench@bench:print_suite_summary(Delete_suite), bench@bench:print_suite_summary(Transaction_suite), bench@bench:print_suite_summary(Constraint_suite), gleam_stdlib:println(<<""/utf8>>), gleam_stdlib:println(<<"Markdown Output:"/utf8>>), gleam_stdlib:println( begin _pipe = <<"-"/utf8>>, gleam@string:repeat(_pipe, 60) end ), gleam_stdlib:println(bench@bench:to_markdown(Insert_suite)), gleam_stdlib:println(bench@bench:to_markdown(Query_suite)), gleam_stdlib:println(bench@bench:to_markdown(Update_suite)), gleam_stdlib:println(bench@bench:to_markdown(Delete_suite)), gleam_stdlib:println(bench@bench:to_markdown(Transaction_suite)).