Current section

Files

Jump to
dream_opensearch src dream_opensearch@query.erl
Raw

src/dream_opensearch@query.erl

-module(dream_opensearch@query).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/dream_opensearch/query.gleam").
-export([match_all/0, term/2, range/3, match/2]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" OpenSearch query builder helpers\n"
"\n"
" This module provides helper functions to build common OpenSearch query\n"
" types. These functions return JSON strings that can be passed to\n"
" `document.search()`.\n"
"\n"
" ## Quick Start\n"
"\n"
" ```gleam\n"
" import dream_opensearch/document\n"
" import dream_opensearch/query\n"
"\n"
" // Full-text search\n"
" let query = query.match(\"name\", \"Alice\")\n"
" document.search(client, \"users\", query)\n"
"\n"
" // Exact term match\n"
" let query = query.term(\"status\", \"active\")\n"
" document.search(client, \"users\", query)\n"
" ```\n"
"\n"
" ## Custom Queries\n"
"\n"
" For complex queries, build the JSON manually using `gleam/json`:\n"
"\n"
" ```gleam\n"
" import gleam/json\n"
"\n"
" let query = json.object([\n"
" #(\"query\", json.object([\n"
" #(\"bool\", json.object([\n"
" #(\"must\", json.array([\n"
" json.object([#(\"match\", json.object([#(\"name\", json.string(\"Alice\"))]))]),\n"
" ])),\n"
" ])),\n"
" ])),\n"
" ])\n"
" ```\n"
).
-file("src/dream_opensearch/query.gleam", 60).
?DOC(
" Build a match_all query\n"
"\n"
" Creates a query that matches all documents in the index. Useful for\n"
" retrieving all documents or as a base for filtering.\n"
"\n"
" ## Returns\n"
"\n"
" A JSON query string that matches all documents.\n"
"\n"
" ## Example\n"
"\n"
" ```gleam\n"
" import dream_opensearch/document\n"
" import dream_opensearch/query\n"
"\n"
" let query = query.match_all()\n"
" document.search(client, \"users\", query)\n"
" ```\n"
).
-spec match_all() -> binary().
match_all() ->
_pipe = gleam@json:object(
[{<<"query"/utf8>>,
gleam@json:object(
[{<<"match_all"/utf8>>, gleam@json:object([])}]
)}]
),
gleam@json:to_string(_pipe).
-file("src/dream_opensearch/query.gleam", 89).
?DOC(
" Build a simple term query\n"
"\n"
" Creates a query that matches documents where the specified field exactly\n"
" matches the given value. This is useful for exact matches on keyword fields.\n"
"\n"
" ## Parameters\n"
"\n"
" - `field`: The field name to match against\n"
" - `value`: The exact value to match\n"
"\n"
" ## Returns\n"
"\n"
" A JSON query string for the term query.\n"
"\n"
" ## Example\n"
"\n"
" ```gleam\n"
" import dream_opensearch/document\n"
" import dream_opensearch/query\n"
"\n"
" // Find all users with status \"active\"\n"
" let query = query.term(\"status\", \"active\")\n"
" document.search(client, \"users\", query)\n"
" ```\n"
).
-spec term(binary(), binary()) -> binary().
term(Field, Value) ->
_pipe = gleam@json:object(
[{<<"query"/utf8>>,
gleam@json:object(
[{<<"term"/utf8>>,
gleam@json:object(
[{Field, gleam@json:string(Value)}]
)}]
)}]
),
gleam@json:to_string(_pipe).
-file("src/dream_opensearch/query.gleam", 127).
?DOC(
" Build a range query\n"
"\n"
" Creates a query that matches documents where the specified field falls\n"
" within the given range (greater than or equal to `gte`, less than or\n"
" equal to `lte`).\n"
"\n"
" ## Parameters\n"
"\n"
" - `field`: The field name to filter on\n"
" - `gte`: The minimum value (greater than or equal)\n"
" - `lte`: The maximum value (less than or equal)\n"
"\n"
" ## Returns\n"
"\n"
" A JSON query string for the range query.\n"
"\n"
" ## Example\n"
"\n"
" ```gleam\n"
" import dream_opensearch/document\n"
" import dream_opensearch/query\n"
"\n"
" // Find products with price between 10 and 100\n"
" let query = query.range(\"price\", \"10\", \"100\")\n"
" document.search(client, \"products\", query)\n"
" ```\n"
).
-spec range(binary(), binary(), binary()) -> binary().
range(Field, Gte, Lte) ->
_pipe = gleam@json:object(
[{<<"query"/utf8>>,
gleam@json:object(
[{<<"range"/utf8>>,
gleam@json:object(
[{Field,
gleam@json:object(
[{<<"gte"/utf8>>,
gleam@json:string(Gte)},
{<<"lte"/utf8>>,
gleam@json:string(Lte)}]
)}]
)}]
)}]
),
gleam@json:to_string(_pipe).
-file("src/dream_opensearch/query.gleam", 175).
?DOC(
" Build a match query (full-text search)\n"
"\n"
" Creates a full-text search query that matches documents where the specified\n"
" field contains the given text. This performs text analysis and is suitable\n"
" for searching text fields.\n"
"\n"
" ## Parameters\n"
"\n"
" - `field`: The field name to search in\n"
" - `text`: The text to search for\n"
"\n"
" ## Returns\n"
"\n"
" A JSON query string for the match query.\n"
"\n"
" ## Example\n"
"\n"
" ```gleam\n"
" import dream_opensearch/document\n"
" import dream_opensearch/query\n"
"\n"
" // Search for users with \"Alice\" in the name field\n"
" let query = query.match(\"name\", \"Alice\")\n"
" document.search(client, \"users\", query)\n"
" ```\n"
).
-spec match(binary(), binary()) -> binary().
match(Field, Text) ->
_pipe = gleam@json:object(
[{<<"query"/utf8>>,
gleam@json:object(
[{<<"match"/utf8>>,
gleam@json:object(
[{Field, gleam@json:string(Text)}]
)}]
)}]
),
gleam@json:to_string(_pipe).