diff --git a/examples/official-site/extensions-to-sql.md b/examples/official-site/extensions-to-sql.md index f89f72a7..a2f89ee3 100644 --- a/examples/official-site/extensions-to-sql.md +++ b/examples/official-site/extensions-to-sql.md @@ -104,9 +104,9 @@ SET var = (SELECT * FROM t); -- now $var contains '1' ``` -Temporary table-valued results can be stored in two ways: +Temporary table-valued results can be stored in two ways. -1. Using temporary tables +## Storing large datasets in the database with temporary tables This is the most efficient method to store large values. ```sql @@ -122,12 +122,13 @@ INSERT INTO my_temp_table(a, b) VALUES (1, 2), (3, 4); ``` -2. Using JSON +## Storing rich structured data in memory using JSON This can be more convenient, but should only be used for small values, because data is copied from the database into SQLPage memory, and to the database again at each use. -You can use the [JSON functions from your database](/blog.sql?post=JSON in SQL%3A A Comprehensive Guide). +You can use the [JSON functions from your database](/blog.sql?post=JSON+in+SQL%3A+A+Comprehensive+Guide). + Here are some examples with SQLite: ```sql -- CREATE TABLE my_table(a, b); @@ -151,7 +152,7 @@ See the [functions page](/functions.sql) for more details. They're either executed before or after the query is run in the database. -### Execution functions *before* sending a query to the database +### Executing functions *before* sending a query to the database When they don't process results coming from the database: @@ -161,12 +162,13 @@ SELECT * FROM blog WHERE slug = sqlpage.path() `sqlpage.path()` will get replaced by the result of the function. -### Execution functions *after* receiving results from the database +### Executing functions *after* receiving results from the database When they process results coming from the database: ```sql -SELECT sqlpage.read_file_as_text(blog_post_file) AS title FROM blog; +SELECT sqlpage.read_file_as_text(blog_post_file) AS title +FROM blog; ``` The query executed will be: diff --git a/examples/official-site/extensions-to-sql.sql b/examples/official-site/extensions-to-sql.sql index 32fd194e..dc5e3125 100644 --- a/examples/official-site/extensions-to-sql.sql +++ b/examples/official-site/extensions-to-sql.sql @@ -6,4 +6,4 @@ select 'dynamic' as component, properties FROM example WHERE component = 'shell' -- Article by Matthew Larkin select 'text' as component, sqlpage.read_file_as_text('extensions-to-sql.md') as contents_md, - false as article; + true as article; diff --git a/examples/official-site/search.sql b/examples/official-site/search.sql new file mode 100644 index 00000000..31249d57 --- /dev/null +++ b/examples/official-site/search.sql @@ -0,0 +1,87 @@ +-- Check for exact matches and redirect if found +set redirect = CASE + WHEN EXISTS (SELECT 1 FROM component WHERE name = $search) THEN sqlpage.link('/component.sql', json_object('component', $search)) + WHEN EXISTS (SELECT 1 FROM sqlpage_functions WHERE name = $search) THEN sqlpage.link('/functions.sql', json_object('function', $search)) +END +SELECT 'redirect' as component, $redirect as link WHERE $redirect IS NOT NULL; + + +select 'dynamic' as component, properties FROM example WHERE component = 'shell' LIMIT 1; + +SELECT 'form' as component, + 'GET' as method, + true as auto_submit, + 'Search documentation' as title; + +SELECT 'text' as type, + 'search' as name, + '' as label, + true as autofocus, + 'Search for components, parameters, functions...' as placeholder, + $search as value; + +SELECT 'text' as component, + CASE + WHEN $search IS NULL THEN 'Enter a search term above to find documentation about components, parameters, functions, and blog posts.' + WHEN NOT EXISTS ( + SELECT 1 FROM documentation_fts + WHERE documentation_fts = $search + ) THEN 'No results found for "' || $search || '".' + ELSE NULL + END as contents; + +SELECT 'list' as component, + 'Search Results' as title, + 'No results found for "' || $search || '".' as empty_description +WHERE $search IS NOT NULL; + +WITH search_results AS ( + SELECT + CASE + WHEN parameter_name IS NOT NULL THEN component_name || ' component: parameter ' || parameter_name + WHEN component_name IS NOT NULL THEN component_name || ' component' + WHEN blog_title IS NOT NULL THEN 'blog: ' || blog_title + WHEN function_parameter_name IS NOT NULL THEN function_name || '(...' || function_parameter_name || '...)' + WHEN function_name IS NOT NULL THEN function_name || '(...)' + END as title, + CASE + WHEN component_description IS NOT NULL THEN component_description + WHEN parameter_description IS NOT NULL THEN parameter_description + WHEN blog_description IS NOT NULL THEN blog_description + WHEN function_description IS NOT NULL THEN function_description + WHEN function_parameter_description IS NOT NULL THEN function_parameter_description + END as description, + CASE + WHEN component_name IS NOT NULL THEN json_object('page', '/component.sql', 'parameters', json_object('component', component_name)) + WHEN parameter_name IS NOT NULL THEN json_object('page', '/component.sql', 'parameters', json_object('component', ( + SELECT component FROM parameter + WHERE name = parameter_name + LIMIT 1 + ))) + WHEN blog_title IS NOT NULL THEN json_object('page', '/blog.sql', 'parameters', json_object('post', blog_title)) + WHEN function_name IS NOT NULL THEN json_object('page', '/functions.sql', 'parameters', json_object('function', function_name)) + WHEN function_parameter_name IS NOT NULL THEN json_object('page', '/functions.sql', 'parameters', json_object('function', ( + SELECT function FROM sqlpage_function_parameters + WHERE name = function_parameter_name + LIMIT 1 + ))) + END as link_data, + rank + FROM documentation_fts + WHERE $search IS NOT NULL + AND documentation_fts = $search +) +SELECT + title, + description, + sqlpage.link(link_data->>'page', link_data->'parameters') as link +FROM search_results +ORDER BY + rank, + CASE + WHEN title LIKE 'component:%' THEN 1 + WHEN title LIKE 'parameter:%' THEN 2 + WHEN title LIKE 'blog:%' THEN 3 + WHEN title LIKE 'function:%' THEN 4 + END, + description; diff --git a/examples/official-site/sqlpage/migrations/01_documentation.sql b/examples/official-site/sqlpage/migrations/01_documentation.sql index f7dc35dc..ff73bcc5 100644 --- a/examples/official-site/sqlpage/migrations/01_documentation.sql +++ b/examples/official-site/sqlpage/migrations/01_documentation.sql @@ -1244,7 +1244,8 @@ You see the [page layouts demo](./examples/layouts.sql) for a live example of th {"link": "/extensions-to-sql", "title": "Extensions to SQL", "icon": "cube-plus"}, {"link": "/custom_components.sql", "title": "Custom Components", "icon": "puzzle"}, {"link": "//github.com/sqlpage/SQLPage/blob/main/configuration.md#configuring-sqlpage", "title": "Configuration", "icon": "settings"} - ]} + ]}, + {"title": "Search", "link": "/search"} ], "layout": "boxed", "language": "en-US", diff --git a/examples/official-site/sqlpage/migrations/999_fts_search_index.sql b/examples/official-site/sqlpage/migrations/999_fts_search_index.sql new file mode 100644 index 00000000..225ff429 --- /dev/null +++ b/examples/official-site/sqlpage/migrations/999_fts_search_index.sql @@ -0,0 +1,32 @@ +CREATE VIRTUAL TABLE documentation_fts USING fts5( + component_name, + component_description, + parameter_name, + parameter_description, + blog_title, + blog_description, + function_name, + function_description, + function_parameter_name, + function_parameter_description, + component_example_description, + component_example_json +); + +INSERT INTO documentation_fts(component_name, component_description) +SELECT name, description FROM component; + +INSERT INTO documentation_fts(component_name, parameter_name, parameter_description) +SELECT component, name, description FROM parameter; + +INSERT INTO documentation_fts(blog_title, blog_description) +SELECT title, description FROM blog_posts; + +INSERT INTO documentation_fts(function_name, function_description) +SELECT name, description_md FROM sqlpage_functions; + +INSERT INTO documentation_fts(function_name, function_parameter_name, function_parameter_description) +SELECT function, name, description_md FROM sqlpage_function_parameters; + +INSERT INTO documentation_fts(component_name, component_example_description, component_example_json) +SELECT component, description, properties FROM example; \ No newline at end of file