You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by pa...@apache.org on 2026/04/29 22:56:00 UTC
(phoenix-site) 01/01: Document partial indexes, PHOENIX_ROW_TIMESTAMP, and atomic-upsert with global indexes
This is an automated email from the ASF dual-hosted git repository.
palashc pushed a commit to branch feat/phoenix-website-addendum
in repository https://gitbox.apache.org/repos/asf/phoenix-site.git
commit c7ddf844432cc47f1f0358580929e939c76ca01b
Author: Palash Chauhan <p....@pchauha-ltmgv47.internal.salesforce.com>
AuthorDate: Wed Apr 29 15:55:36 2026 -0700
Document partial indexes, PHOENIX_ROW_TIMESTAMP, and atomic-upsert with global indexes
- features/secondary-indexes.mdx: add Partial Indexes section
(PHOENIX-7032) covering DDL, the implication of mutations crossing
the predicate, and the no-local-index restriction.
- features/phoenix-row-timestamp.mdx: new page documenting the
PHOENIX_ROW_TIMESTAMP() SQL function, including its use in
projections, predicates, and functional indexes.
- features/row-timestamp-column.mdx: add a See also pointing at the
new PHOENIX_ROW_TIMESTAMP page.
- features/atomic-upsert.mdx: drop the outdated "Global indexes on
columns being atomically updated are not supported" limitation.
PHOENIX-6387 lifted that restriction long ago.
- features/meta.json + single-page/index.mdx: register the new
PHOENIX_ROW_TIMESTAMP page.
Regenerate output/ via build.sh.
Made-with: Cursor
---
.../_mdx/(multi-page)/features/atomic-upsert.mdx | 1 -
.../docs/_mdx/(multi-page)/features/meta.json | 1 +
.../features/phoenix-row-timestamp.mdx | 95 ++++++
.../(multi-page)/features/row-timestamp-column.mdx | 4 +
.../(multi-page)/features/secondary-indexes.mdx | 68 ++++
app/pages/_docs/docs/_mdx/single-page/index.mdx | 6 +
output/404/index.html | 4 +-
output/__spa-fallback.html | 4 +-
output/api/search | 2 +-
output/api/search.data | 2 +-
...psert-BBnIIafE.js => atomic-upsert-CiKpDDHZ.js} | 4 +-
output/assets/docs-CUpgRa_K.js | 8 -
output/assets/docs-DPQsvOfn.js | 8 +
.../{index-B3FaPnK8.js => index-CG7EPeEI.js} | 349 ++++++++++++++++++++-
.../{manifest-e852c125.js => manifest-d1992ec0.js} | 2 +-
output/assets/meta-DvKVc6kl.js | 1 -
output/assets/meta-s4CV-3L_.js | 1 +
output/assets/phoenix-row-timestamp-DK9PDNUn.js | 171 ++++++++++
...ntRbWJ4.js => row-timestamp-column-Bmd_MBbx.js} | 6 +-
...s-C61N-twO.js => secondary-indexes-CF_OyXQc.js} | 145 ++++++++-
.../apache-phoenix-reference-guide-dark-mode.pdf | Bin 14762496 -> 14778374 bytes
output/books/apache-phoenix-reference-guide.pdf | Bin 14729475 -> 14745289 bytes
output/docs.data | 2 +-
.../addons/phoenix-omid-transaction-manager.data | 2 +-
.../phoenix-omid-transaction-manager/index.html | 8 +-
output/docs/addons/phoenix-orm-library.data | 2 +-
output/docs/addons/phoenix-orm-library/index.html | 8 +-
.../addons/phoenix-tephra-transaction-manager.data | 2 +-
.../phoenix-tephra-transaction-manager/index.html | 8 +-
output/docs/array-type.data | 2 +-
output/docs/array-type/index.html | 8 +-
output/docs/contributing.data | 2 +-
output/docs/contributing/building-website.data | 2 +-
.../docs/contributing/building-website/index.html | 8 +-
output/docs/contributing/develop.data | 2 +-
output/docs/contributing/develop/index.html | 8 +-
output/docs/contributing/how-to-release.data | 2 +-
output/docs/contributing/how-to-release/index.html | 8 +-
output/docs/contributing/index.html | 8 +-
output/docs/datatypes.data | 2 +-
output/docs/datatypes/index.html | 8 +-
output/docs/explain-plan.data | 2 +-
output/docs/explain-plan/index.html | 8 +-
output/docs/faq.data | 2 +-
output/docs/faq/index.html | 8 +-
output/docs/features/atomic-upsert.data | 2 +-
output/docs/features/atomic-upsert/index.html | 11 +-
output/docs/features/bson.data | 2 +-
output/docs/features/bson/index.html | 10 +-
output/docs/features/bulk-loading.data | 2 +-
output/docs/features/bulk-loading/index.html | 10 +-
output/docs/features/change-data-capture.data | 2 +-
.../docs/features/change-data-capture/index.html | 10 +-
output/docs/features/conditional-ttl.data | 2 +-
output/docs/features/conditional-ttl/index.html | 10 +-
output/docs/features/cursor.data | 2 +-
output/docs/features/cursor/index.html | 10 +-
output/docs/features/dynamic-columns.data | 2 +-
output/docs/features/dynamic-columns/index.html | 10 +-
output/docs/features/metrics.data | 2 +-
output/docs/features/metrics/index.html | 10 +-
output/docs/features/multi-tenancy.data | 2 +-
output/docs/features/multi-tenancy/index.html | 10 +-
output/docs/features/namespace-mapping.data | 2 +-
output/docs/features/namespace-mapping/index.html | 10 +-
output/docs/features/paged-queries.data | 2 +-
output/docs/features/paged-queries/index.html | 12 +-
output/docs/features/phoenix-row-timestamp.data | 1 +
.../docs/features/phoenix-row-timestamp/index.html | 103 ++++++
output/docs/features/query-server.data | 2 +-
output/docs/features/query-server/index.html | 10 +-
output/docs/features/row-timestamp-column.data | 2 +-
.../docs/features/row-timestamp-column/index.html | 14 +-
output/docs/features/salted-tables.data | 2 +-
output/docs/features/salted-tables/index.html | 10 +-
output/docs/features/secondary-indexes.data | 2 +-
output/docs/features/secondary-indexes/index.html | 66 +++-
output/docs/features/segment-scan.data | 2 +-
output/docs/features/segment-scan/index.html | 10 +-
output/docs/features/skip-scan.data | 2 +-
output/docs/features/skip-scan/index.html | 10 +-
output/docs/features/statistics-collection.data | 2 +-
.../docs/features/statistics-collection/index.html | 10 +-
output/docs/features/storage-formats.data | 2 +-
output/docs/features/storage-formats/index.html | 10 +-
output/docs/features/table-sampling.data | 2 +-
output/docs/features/table-sampling/index.html | 10 +-
output/docs/features/tracing.data | 2 +-
output/docs/features/tracing/index.html | 10 +-
output/docs/features/transactions.data | 2 +-
output/docs/features/transactions/index.html | 10 +-
output/docs/features/ttl.data | 2 +-
output/docs/features/ttl/index.html | 10 +-
output/docs/features/user-defined-functions.data | 2 +-
.../features/user-defined-functions/index.html | 10 +-
output/docs/features/varbinary-encoded.data | 2 +-
output/docs/features/varbinary-encoded/index.html | 10 +-
output/docs/features/view-ttl.data | 2 +-
output/docs/features/view-ttl/index.html | 10 +-
output/docs/features/views.data | 2 +-
output/docs/features/views/index.html | 10 +-
output/docs/functions.data | 2 +-
output/docs/functions/index.html | 8 +-
.../docs/fundamentals/backward-compatibility.data | 2 +-
.../fundamentals/backward-compatibility/index.html | 8 +-
output/docs/fundamentals/building.data | 2 +-
output/docs/fundamentals/building/index.html | 8 +-
.../client-classpath-and-jdbc-url.data | 2 +-
.../client-classpath-and-jdbc-url/index.html | 8 +-
output/docs/fundamentals/configuration.data | 2 +-
output/docs/fundamentals/configuration/index.html | 8 +-
output/docs/fundamentals/performance-testing.data | 2 +-
.../fundamentals/performance-testing/index.html | 8 +-
output/docs/fundamentals/performance.data | 2 +-
output/docs/fundamentals/performance/index.html | 8 +-
output/docs/fundamentals/tuning-guide.data | 2 +-
output/docs/fundamentals/tuning-guide/index.html | 8 +-
output/docs/grammar.data | 2 +-
output/docs/grammar/index.html | 8 +-
output/docs/index.html | 8 +-
output/docs/installation.data | 2 +-
output/docs/installation/index.html | 8 +-
output/docs/integrations/apache-hive.data | 2 +-
output/docs/integrations/apache-hive/index.html | 8 +-
output/docs/integrations/flume-plugin.data | 2 +-
output/docs/integrations/flume-plugin/index.html | 8 +-
output/docs/integrations/kafka-plugin.data | 2 +-
output/docs/integrations/kafka-plugin/index.html | 8 +-
.../docs/integrations/map-reduce-integration.data | 2 +-
.../integrations/map-reduce-integration/index.html | 8 +-
output/docs/integrations/phoenix-dynamodb.data | 2 +-
.../docs/integrations/phoenix-dynamodb/index.html | 8 +-
output/docs/integrations/pig-integration.data | 2 +-
.../docs/integrations/pig-integration/index.html | 8 +-
output/docs/integrations/python-driver.data | 2 +-
output/docs/integrations/python-driver/index.html | 8 +-
output/docs/integrations/spark-integration.data | 2 +-
.../docs/integrations/spark-integration/index.html | 8 +-
output/docs/joins.data | 2 +-
output/docs/joins/index.html | 8 +-
output/docs/quick-start.data | 2 +-
output/docs/quick-start/index.html | 8 +-
output/docs/sequences.data | 2 +-
output/docs/sequences/index.html | 8 +-
output/docs/single-page.data | 2 +-
output/docs/single-page/index.html | 136 +++++++-
output/docs/subqueries.data | 2 +-
output/docs/subqueries/index.html | 8 +-
output/downloads/index.html | 4 +-
output/index.html | 4 +-
output/issues-tracking/index.html | 4 +-
output/llms-full.txt | 334 +++++++++++++++++++-
output/llms-full.txt.data | 2 +-
output/mailing-lists/index.html | 4 +-
output/news/index.html | 4 +-
output/phoenixcon-2018/index.html | 4 +-
output/phoenixcon-archives/index.html | 4 +-
output/presentations/index.html | 4 +-
output/recent-improvements/index.html | 4 +-
output/release-notes/index.html | 4 +-
output/roadmap/index.html | 4 +-
output/sitemap.xml | 2 +-
output/source-repository/index.html | 4 +-
output/team/index.html | 4 +-
output/tech-talks/index.html | 4 +-
output/who-is-using/index.html | 4 +-
166 files changed, 1832 insertions(+), 417 deletions(-)
diff --git a/app/pages/_docs/docs/_mdx/(multi-page)/features/atomic-upsert.mdx b/app/pages/_docs/docs/_mdx/(multi-page)/features/atomic-upsert.mdx
index 409e0cb7..7f011e7b 100644
--- a/app/pages/_docs/docs/_mdx/(multi-page)/features/atomic-upsert.mdx
+++ b/app/pages/_docs/docs/_mdx/(multi-page)/features/atomic-upsert.mdx
@@ -133,4 +133,3 @@ The following limitations are enforced for the `ON DUPLICATE KEY` clause usage:
does not handle atomicity unless the latest value is being updated.
- The same column should not be updated more than once in the same statement.
- No aggregation or references to sequences are allowed within the clause.
-- Global indexes on columns being atomically updated are not supported, as potentially a separate RPC across the wire would be made while the row is under lock to maintain the secondary index.
diff --git a/app/pages/_docs/docs/_mdx/(multi-page)/features/meta.json b/app/pages/_docs/docs/_mdx/(multi-page)/features/meta.json
index 8c532d79..c2680852 100644
--- a/app/pages/_docs/docs/_mdx/(multi-page)/features/meta.json
+++ b/app/pages/_docs/docs/_mdx/(multi-page)/features/meta.json
@@ -9,6 +9,7 @@
"namespace-mapping",
"statistics-collection",
"row-timestamp-column",
+ "phoenix-row-timestamp",
"paged-queries",
"salted-tables",
"skip-scan",
diff --git a/app/pages/_docs/docs/_mdx/(multi-page)/features/phoenix-row-timestamp.mdx b/app/pages/_docs/docs/_mdx/(multi-page)/features/phoenix-row-timestamp.mdx
new file mode 100644
index 00000000..db08dc1f
--- /dev/null
+++ b/app/pages/_docs/docs/_mdx/(multi-page)/features/phoenix-row-timestamp.mdx
@@ -0,0 +1,95 @@
+---
+title: "PHOENIX_ROW_TIMESTAMP()"
+description: "Read the per-row last-modified timestamp Phoenix maintains automatically — usable in projections, predicates, and indexes for fast time-bounded reads."
+---
+
+`PHOENIX_ROW_TIMESTAMP()` is a built-in SQL function that returns the **timestamp
+of the row's empty column**, which Phoenix updates automatically on every write.
+It's effectively the row's **last-modified time**, available on any Phoenix table
+without you having to declare or manage a timestamp column yourself. The return
+type is `DATE`.
+
+It can be used in three places, and the third one is what makes it especially
+powerful:
+
+1. As a projection in `SELECT`.
+2. As a predicate in `WHERE` (and `JOIN`) clauses.
+3. As the indexed expression in a [functional index](/docs/features/secondary-indexes#functional-indexes), which makes time-bounded reads fast even when the table isn't ordered by time.
+
+## Reading the row timestamp [#phoenix-row-timestamp-read]
+
+Project it like any other column:
+
+```sql
+-- Last-modified time of every row.
+SELECT PHOENIX_ROW_TIMESTAMP(), id, payload FROM events;
+
+-- Combine with regular row data.
+SELECT id,
+ PHOENIX_ROW_TIMESTAMP() AS modified_at,
+ payload
+FROM events
+WHERE region = 'us-west-2';
+```
+
+The function takes no arguments and is evaluated server-side from the empty cell
+that Phoenix already maintains for every row.
+
+## In WHERE predicates [#phoenix-row-timestamp-where]
+
+Use it to bound queries by mutation time, including incremental "what changed
+since" patterns:
+
+```sql
+-- Rows modified in the last hour.
+SELECT * FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() > CURRENT_DATE() - 1.0 / 24;
+
+-- Pull a window for an incremental consumer.
+SELECT id, payload
+FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() >= ?
+ AND PHOENIX_ROW_TIMESTAMP() < ?
+ORDER BY PHOENIX_ROW_TIMESTAMP() ASC;
+```
+
+Without an index, these predicates require a scan of the table. The next section
+fixes that.
+
+## Indexing on PHOENIX_ROW_TIMESTAMP() [#phoenix-row-timestamp-index]
+
+Create a [functional index](/docs/features/secondary-indexes#functional-indexes)
+on the function to make time-bounded reads fast. Phoenix can then seek directly
+on the indexed timestamp instead of scanning the data table:
+
+```sql
+CREATE INDEX events_by_modified
+ ON events (PHOENIX_ROW_TIMESTAMP())
+ INCLUDE (payload);
+
+-- Phoenix uses the index for this query.
+SELECT id, payload
+FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() >= ?
+ AND PHOENIX_ROW_TIMESTAMP() < ?
+ORDER BY PHOENIX_ROW_TIMESTAMP() ASC;
+```
+
+This is the typical recipe for "scan rows changed in the last N minutes" type
+queries on a table whose primary key isn't time-ordered. Pair with
+[uncovered indexes](/docs/features/secondary-indexes#uncovered-indexes) when you
+don't want to duplicate payload columns into the index.
+
+## Relationship to ROW_TIMESTAMP column [#phoenix-row-timestamp-vs-row-timestamp]
+
+Two related concepts share the word "timestamp" — they are not the same:
+
+| Feature | Direction | What it does |
+| ------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------ |
+| [`ROW_TIMESTAMP` column](/docs/features/row-timestamp-column) | Write | Designate a primary-key column whose value is _written into_ the underlying HBase row timestamp. |
+| `PHOENIX_ROW_TIMESTAMP()` function | Read | Return the underlying HBase row timestamp Phoenix already maintains on every row's empty cell. |
+
+`PHOENIX_ROW_TIMESTAMP()` works on **any** Phoenix table, regardless of whether
+you've declared a `ROW_TIMESTAMP` column. If you have declared one, both
+mechanisms read/write the same underlying timestamp, so `PHOENIX_ROW_TIMESTAMP()`
+returns the value of the `ROW_TIMESTAMP` column for that row.
diff --git a/app/pages/_docs/docs/_mdx/(multi-page)/features/row-timestamp-column.mdx b/app/pages/_docs/docs/_mdx/(multi-page)/features/row-timestamp-column.mdx
index a5d741d9..1f13f920 100644
--- a/app/pages/_docs/docs/_mdx/(multi-page)/features/row-timestamp-column.mdx
+++ b/app/pages/_docs/docs/_mdx/(multi-page)/features/row-timestamp-column.mdx
@@ -54,3 +54,7 @@ SELECT METRICS_ID, METRIC_VALUE FROM SOURCE_METRICS_TABLE
This sets `CREATED_DATE` in the destination table to the server timestamp.
When querying with filters on the row timestamp column, Phoenix performs its usual row-key optimizations and can also set scan min/max time ranges appropriately. Using this time range information, HBase can skip store files that do not fall in the target time range, which significantly improves performance, especially for tail-end data queries.
+
+## See also
+
+The [`PHOENIX_ROW_TIMESTAMP()`](/docs/features/phoenix-row-timestamp) function lets you read the underlying HBase row timestamp on any Phoenix table — even one without a declared `ROW_TIMESTAMP` column — and is indexable for fast time-bounded queries.
diff --git a/app/pages/_docs/docs/_mdx/(multi-page)/features/secondary-indexes.mdx b/app/pages/_docs/docs/_mdx/(multi-page)/features/secondary-indexes.mdx
index 8912b500..a8a1f12b 100644
--- a/app/pages/_docs/docs/_mdx/(multi-page)/features/secondary-indexes.mdx
+++ b/app/pages/_docs/docs/_mdx/(multi-page)/features/secondary-indexes.mdx
@@ -106,6 +106,74 @@ FROM users
WHERE email = 'jane@example.com';
```
+## Partial Indexes [#partial-indexes]
+
+A **partial index** indexes only the rows of the data table that satisfy a SQL
+boolean predicate, supplied at `CREATE INDEX` time via a `WHERE` clause. The
+index is smaller, writes that don't affect the predicate are cheaper, and the
+planner only uses it for queries whose own predicate implies the index's. Added
+in [PHOENIX-7032](https://issues.apache.org/jira/browse/PHOENIX-7032).
+
+### When to choose a partial index [#partial-indexes-when]
+
+Reach for a partial index when the workload reads a small, well-defined slice of
+a much larger table — and that slice is identifiable by a SQL predicate. Common
+shapes:
+
+- _Open / active records_: `WHERE status IN ('OPEN', 'PENDING')` on a table that
+ also stores closed records.
+- _Recent rows_: `WHERE created_at > DATE '2024-01-01'`.
+- _Hot tier_: `WHERE priority >= 5` for paging / alerting workloads.
+- _Failure investigation_: `WHERE result = 'FAIL'` on a successful-most-of-the-time
+ table.
+
+### Creating a partial index [#partial-indexes-usage]
+
+The DDL is a regular `CREATE INDEX` with a trailing `WHERE` clause. Both
+**covered** and **uncovered** global indexes can be partial:
+
+```sql
+CREATE INDEX idx_open_orders
+ ON orders (customer_id, created_at)
+ INCLUDE (total_amount)
+ WHERE status IN ('OPEN', 'PENDING');
+
+CREATE UNCOVERED INDEX idx_failed_jobs
+ ON jobs (created_at)
+ WHERE result = 'FAIL';
+```
+
+The planner uses the index for any query whose `WHERE` clause implies the
+index's predicate:
+
+```sql
+-- Uses idx_open_orders (status IN ('OPEN','PENDING') is implied).
+SELECT customer_id, total_amount
+FROM orders
+WHERE status = 'OPEN' AND created_at >= ?;
+```
+
+### Mutations that cross the predicate [#partial-indexes-mutations]
+
+Partial indexes correctly maintain themselves when a mutation moves a row into
+or out of the predicate, including under `ON DUPLICATE KEY UPDATE`:
+
+- A row that **starts** satisfying the predicate after an update has its index
+ row created.
+- A row that **stops** satisfying the predicate after an update has its index
+ row removed.
+
+This means a partial index stays consistent for a workload like _"close an
+order"_ even though that operation flips the row out of the index's covered
+slice.
+
+### Limitations [#partial-indexes-limitations]
+
+- **Local partial indexes are not supported** — only global (covered or
+ uncovered) partial indexes work today.
+- The `WHERE` predicate is fixed at `CREATE INDEX` time. To change it, drop and
+ recreate the index.
+
## Index Population
By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the `ASYNC` keyword in the index creation DDL statement:
diff --git a/app/pages/_docs/docs/_mdx/single-page/index.mdx b/app/pages/_docs/docs/_mdx/single-page/index.mdx
index 80e333b2..fe47f50f 100644
--- a/app/pages/_docs/docs/_mdx/single-page/index.mdx
+++ b/app/pages/_docs/docs/_mdx/single-page/index.mdx
@@ -171,6 +171,12 @@ description: "Complete Apache Phoenix documentation in one continuous page."
---
+# PHOENIX_ROW_TIMESTAMP [#phoenix-row-timestamp]
+
+<include>../(multi-page)/features/phoenix-row-timestamp.mdx</include>
+
+---
+
# Paged Queries [#paged-queries]
<include>../(multi-page)/features/paged-queries.mdx</include>
diff --git a/output/404/index.html b/output/404/index.html
index 4081e8d2..5f7d23ca 100644
--- a/output/404/index.html
+++ b/output/404/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Page Not Found | Apache Phoenix</title><meta name="description" content="The page you are looking for does not exist. The website was updated recently, so the route you were trying to visit might have changed."/><meta name="robots" c [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Page Not Found | Apache Phoenix</title><meta name="description" content="The page you are looking for does not exist. The website was updated recently, so the route you were trying to visit might have changed."/><meta name="robots" c [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -27,7 +27,7 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/404-BAhoWCKG.js";
diff --git a/output/__spa-fallback.html b/output/__spa-fallback.html
index 1d5f0084..7622bd59 100644
--- a/output/__spa-fallback.html
+++ b/output/__spa-fallback.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="modulepreload" href="/assets/entry.client-_CVK9qYI.js" [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="modulepreload" href="/assets/entry.client-_CVK9qYI.js" [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -19,7 +19,7 @@
"functions. Check out https://reactrouter.com/start/framework/route-module#hydratefallback " +
"for more information."
);
- </script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":true};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeTh [...]
+ </script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":true};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeTh [...]
import * as route0 from "/assets/root-BHBAHx51.js";
window.__reactRouterRouteModules = {"root":route0};
diff --git a/output/api/search b/output/api/search
index 53698ae9..362ab5fd 100644
--- a/output/api/search
+++ b/output/api/search
@@ -1 +1 @@
-{"type":"advanced","internalDocumentIDStore":{"internalIdToId":["/docs/addons/phoenix-omid-transaction-manager","/docs/addons/phoenix-omid-transaction-manager-0","/docs/addons/phoenix-omid-transaction-manager-1","/docs/addons/phoenix-omid-transaction-manager-2","/docs/addons/phoenix-orm-library","/docs/addons/phoenix-orm-library-0","/docs/addons/phoenix-orm-library-1","/docs/addons/phoenix-orm-library-2","/docs/addons/phoenix-orm-library-3","/docs/addons/phoenix-orm-library-4","/docs/add [...]
\ No newline at end of file
+{"type":"advanced","internalDocumentIDStore":{"internalIdToId":["/docs/addons/phoenix-omid-transaction-manager","/docs/addons/phoenix-omid-transaction-manager-0","/docs/addons/phoenix-omid-transaction-manager-1","/docs/addons/phoenix-omid-transaction-manager-2","/docs/addons/phoenix-orm-library","/docs/addons/phoenix-orm-library-0","/docs/addons/phoenix-orm-library-1","/docs/addons/phoenix-orm-library-2","/docs/addons/phoenix-orm-library-3","/docs/addons/phoenix-orm-library-4","/docs/add [...]
\ No newline at end of file
diff --git a/output/api/search.data b/output/api/search.data
index 399528ad..397ddbd6 100644
--- a/output/api/search.data
+++ b/output/api/search.data
@@ -1 +1 @@
-[{"_1":2},"routes/_api/search",{"_3":4},"data",{"_5":6,"_7":8,"_7200":7201,"_31396":86699,"_20606":105530,"_134307":134308,"_37477":105531},"type","advanced","internalDocumentIDStore",{"_9":10},"internalIdToId",[11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,1 [...]
+[{"_1":2},"routes/_api/search",{"_3":4},"data",{"_5":6,"_7":8,"_7295":7296,"_31642":87579,"_20816":106670,"_135827":135828,"_37779":106671},"type","advanced","internalDocumentIDStore",{"_9":10},"internalIdToId",[11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,1 [...]
diff --git a/output/assets/atomic-upsert-BBnIIafE.js b/output/assets/atomic-upsert-CiKpDDHZ.js
similarity index 95%
rename from output/assets/atomic-upsert-BBnIIafE.js
rename to output/assets/atomic-upsert-CiKpDDHZ.js
index 552cabe9..486e4235 100644
--- a/output/assets/atomic-upsert-BBnIIafE.js
+++ b/output/assets/atomic-upsert-CiKpDDHZ.js
@@ -128,7 +128,6 @@ The following limitations are enforced for the \`ON DUPLICATE KEY\` clause usage
does not handle atomicity unless the latest value is being updated.
* The same column should not be updated more than once in the same statement.
* No aggregation or references to sequences are allowed within the clause.
-* Global indexes on columns being atomically updated are not supported, as potentially a separate RPC across the wire would be made while the row is under lock to maintain the secondary index.
`,h={title:"Atomic Upsert",description:"Use UPSERT ... ON DUPLICATE KEY for atomic row-level updates in Phoenix, with examples and limitations."},r=[{href:"/docs/grammar#upsert-values"},{href:"https://issues.apache.org/jira/browse/PHOENIX-7648"},{href:"https://issues.apache.org/jira/browse/PHOENIX-7651"}],l={contents:[{heading:void 0,content:`To support atomic upsert, an optional ON DUPLICATE KEY clause, similar to the MySQL syntax, has been
incorporated into the UPSERT VALUES command as of Phoenix 4.9. The general syntax is described
here. This feature provides a superset of the HBase Increment and
@@ -164,7 +163,7 @@ mutated and 0 for a no-op, so callers know the outcome without having to inspect
cell contents. Both require an auto-commit connection.`},{heading:"atomic-upsert-limitations",content:"The following limitations are enforced for the ON DUPLICATE KEY clause usage:"},{heading:"atomic-upsert-limitations",content:"Primary key columns may not be updated, since this would essentially be creating a new row."},{heading:"atomic-upsert-limitations",content:`Transactional tables may not use this clause as atomic upserts are already possible through
exception handling when a conflict occurs.`},{heading:"atomic-upsert-limitations",content:`Immutable tables may not use this clause as by definition there should be no updates to
existing rows.`},{heading:"atomic-upsert-limitations",content:`The CURRENT_SCN property may not be set on connection when this clause is used as HBase
-does not handle atomicity unless the latest value is being updated.`},{heading:"atomic-upsert-limitations",content:"The same column should not be updated more than once in the same statement."},{heading:"atomic-upsert-limitations",content:"No aggregation or references to sequences are allowed within the clause."},{heading:"atomic-upsert-limitations",content:"Global indexes on columns being atomically updated are not supported, as potentially a separate RPC across the wire would be made w [...]
+does not handle atomicity unless the latest value is being updated.`},{heading:"atomic-upsert-limitations",content:"The same column should not be updated more than once in the same statement."},{heading:"atomic-upsert-limitations",content:"No aggregation or references to sequences are allowed within the clause."}],headings:[{id:"atomic-upsert-examples",content:"Examples"},{id:"atomic-upsert-update-only",content:"ON DUPLICATE KEY UPDATE_ONLY"},{id:"atomic-upsert-returning",content:"Return [...]
incorporated into the `,e.jsx(i.code,{children:"UPSERT VALUES"}),` command as of Phoenix 4.9. The general syntax is described
`,e.jsx(i.a,{href:"/docs/grammar#upsert-values",children:"here"}),". This feature provides a superset of the HBase ",e.jsx(i.code,{children:"Increment"}),` and
`,e.jsx(i.code,{children:"CheckAndPut"}),` functionality to enable atomic upserts. On the server-side, when the commit
@@ -258,5 +257,4 @@ existing rows.`}),`
does not handle atomicity unless the latest value is being updated.`]}),`
`,e.jsx(i.li,{children:"The same column should not be updated more than once in the same statement."}),`
`,e.jsx(i.li,{children:"No aggregation or references to sequences are allowed within the clause."}),`
-`,e.jsx(i.li,{children:"Global indexes on columns being atomically updated are not supported, as potentially a separate RPC across the wire would be made while the row is under lock to maintain the secondary index."}),`
`]})]})}function o(s={}){const{wrapper:i}=s.components||{};return i?e.jsx(i,{...s,children:e.jsx(t,{...s})}):t(s)}export{a as _markdown,o as default,r as extractedReferences,h as frontmatter,l as structuredData,d as toc};
diff --git a/output/assets/docs-CUpgRa_K.js b/output/assets/docs-CUpgRa_K.js
deleted file mode 100644
index 093265b9..00000000
--- a/output/assets/docs-CUpgRa_K.js
+++ /dev/null
@@ -1,8 +0,0 @@
-const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/phoenix-omid-transaction-manager-D-GrrMV5.js","assets/chunk-EPOLDU6W-B5LwAila.js","assets/phoenix-orm-library-CKRZe-DX.js","assets/pho-BiacCdLr.js","assets/phoenix-tephra-transaction-manager-Bj1kaHTT.js","assets/array-type-DHEJ8on8.js","assets/building-website-DYipvpGO.js","assets/develop-C0-enlk9.js","assets/how-to-release-vcUD8HaJ.js","assets/index-DmTIWXRq.js","assets/datatypes-BVpCWIsu.js","assets/explain-plan-DNxd4hBm. [...]
-import{r as u,j as s,y as Tt,g as cr,B as lr,w as dr}from"./chunk-EPOLDU6W-B5LwAila.js";import{_ as w,u as _e,e as jt,c as Nt,a as Q,z as ur,b as fr}from"./index-C1Z6Xsj8.js";import{b as H,c as Ot}from"./button-CG5cUoV1.js";import{L as q,C as kt,a as It,d as hr}from"./mdx-DLDzmbRN.js";import{p as K,k as Ee,c as Dt}from"./index-DXIctz1v.js";import{u as J,f as Ne,P as ce,p as pr,a as mr,d as Z,b as Y,t as Lt,w as Mt,r as Ie,v as Ft,g as gr,o as vr,s as xr,h as br,i as wr,j as _r,k as Er,m [...]
- "sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr)`,"--fd-docs-row-1":"var(--fd-banner-height, 0px)","--fd-docs-row-2":"calc(var(--fd-docs-row-1) + var(--fd-header-height))","--fd-docs-row-3":"calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height))","--fd-sidebar-col":o?"0px":"var(--fd-sidebar-width)",...n},...r,children:t})}function Ws({options:e,...n [...]
-`),typeof this.children=="string"?f+=i.prototype.escapeString(this.children):this.children.forEach(function(R){f+=R}),f+="</"+this.tagName+`>
-`,f};function l(f,h){if(!(this instanceof l))return new l(f,h);i.call(this,"path"),this.attrs.d="M"+f+" "+h}t(l,i),l.prototype.m=function(f,h){return this.attrs.d+="m"+f+" "+h,this},l.prototype.h=function(f){return this.attrs.d+="h"+f,this},l.prototype.right=l.prototype.h,l.prototype.left=function(f){return this.h(-f)},l.prototype.v=function(f){return this.attrs.d+="v"+f,this},l.prototype.down=l.prototype.v,l.prototype.up=function(f){return this.v(-f)},l.prototype.arc=function(f){var h=d [...]
-`)}function Ri(e){const n=[];let t="",r=0;const o=e.split(`
-`).map(a=>a.trim()).filter(Boolean);for(let a=0;a<o.length;a++){const c=o[a];for(const d of c)d==="["||d==="{"||d==="("?r++:(d==="]"||d==="}"||d===")")&&r--;t=t?`${t} ${c}`:c;const l=(o[a+1]?.trim()??"").startsWith("|");r===0&&!l&&(n.push(t),t="")}return t&&n.push(t),n.filter(Boolean)}function Si(e,n){return e.replace(/(<rect\b(?![^>]*\brx\b)[^>]*><\/rect>)(\s*)(<text\b[^>]*>([a-z][a-zA-Z0-9]*)<\/text>)/g,(t,r,o,a,c)=>{const i=Ei(c,n);return i?`<a href="#${i}">${r}${o}${a}</a>`:`${r}${o} [...]
diff --git a/output/assets/docs-DPQsvOfn.js b/output/assets/docs-DPQsvOfn.js
new file mode 100644
index 00000000..69da0f89
--- /dev/null
+++ b/output/assets/docs-DPQsvOfn.js
@@ -0,0 +1,8 @@
+const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/phoenix-omid-transaction-manager-D-GrrMV5.js","assets/chunk-EPOLDU6W-B5LwAila.js","assets/phoenix-orm-library-CKRZe-DX.js","assets/pho-BiacCdLr.js","assets/phoenix-tephra-transaction-manager-Bj1kaHTT.js","assets/array-type-DHEJ8on8.js","assets/building-website-DYipvpGO.js","assets/develop-C0-enlk9.js","assets/how-to-release-vcUD8HaJ.js","assets/index-DmTIWXRq.js","assets/datatypes-BVpCWIsu.js","assets/explain-plan-DNxd4hBm. [...]
+import{r as u,j as s,y as Tt,g as cr,B as lr,w as dr}from"./chunk-EPOLDU6W-B5LwAila.js";import{_ as b,u as _e,e as jt,c as Ot,a as Q,z as ur,b as fr}from"./index-C1Z6Xsj8.js";import{b as H,c as Nt}from"./button-CG5cUoV1.js";import{L as q,C as kt,a as It,d as hr}from"./mdx-DLDzmbRN.js";import{p as K,k as Ee,c as Dt}from"./index-DXIctz1v.js";import{u as J,f as Oe,P as ce,p as pr,a as mr,d as Z,b as Y,t as Lt,w as Mt,r as Ie,v as Ft,g as gr,o as vr,s as xr,h as br,i as wr,j as _r,k as Er,m [...]
+ "sidebar toc-popover toc"
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr)`,"--fd-docs-row-1":"var(--fd-banner-height, 0px)","--fd-docs-row-2":"calc(var(--fd-docs-row-1) + var(--fd-header-height))","--fd-docs-row-3":"calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height))","--fd-sidebar-col":o?"0px":"var(--fd-sidebar-width)",...n},...r,children:t})}function Ws({options:e,...n [...]
+`),typeof this.children=="string"?f+=i.prototype.escapeString(this.children):this.children.forEach(function(R){f+=R}),f+="</"+this.tagName+`>
+`,f};function l(f,h){if(!(this instanceof l))return new l(f,h);i.call(this,"path"),this.attrs.d="M"+f+" "+h}t(l,i),l.prototype.m=function(f,h){return this.attrs.d+="m"+f+" "+h,this},l.prototype.h=function(f){return this.attrs.d+="h"+f,this},l.prototype.right=l.prototype.h,l.prototype.left=function(f){return this.h(-f)},l.prototype.v=function(f){return this.attrs.d+="v"+f,this},l.prototype.down=l.prototype.v,l.prototype.up=function(f){return this.v(-f)},l.prototype.arc=function(f){var h=d [...]
+`)}function Ri(e){const n=[];let t="",r=0;const o=e.split(`
+`).map(a=>a.trim()).filter(Boolean);for(let a=0;a<o.length;a++){const c=o[a];for(const d of c)d==="["||d==="{"||d==="("?r++:(d==="]"||d==="}"||d===")")&&r--;t=t?`${t} ${c}`:c;const l=(o[a+1]?.trim()??"").startsWith("|");r===0&&!l&&(n.push(t),t="")}return t&&n.push(t),n.filter(Boolean)}function Si(e,n){return e.replace(/(<rect\b(?![^>]*\brx\b)[^>]*><\/rect>)(\s*)(<text\b[^>]*>([a-z][a-zA-Z0-9]*)<\/text>)/g,(t,r,o,a,c)=>{const i=Ei(c,n);return i?`<a href="#${i}">${r}${o}${a}</a>`:`${r}${o} [...]
diff --git a/output/assets/index-B3FaPnK8.js b/output/assets/index-CG7EPeEI.js
similarity index 94%
rename from output/assets/index-B3FaPnK8.js
rename to output/assets/index-CG7EPeEI.js
index 39cad6ee..4a4a7a10 100644
--- a/output/assets/index-B3FaPnK8.js
+++ b/output/assets/index-CG7EPeEI.js
@@ -1,4 +1,4 @@
-import{j as e}from"./chunk-EPOLDU6W-B5LwAila.js";import{_ as g,a as u}from"./squirrel-CO237F3w.js";import{_ as x,a as m,b as E,c as y,d as j,e as f,f as b}from"./perf-topn-C8Xi2q9P.js";import{_ as v}from"./pherf-oyANWIFY.js";import{_ as w}from"./producer_consumer-C3WRDQ2y.js";import{_ as A}from"./pho-BiacCdLr.js";import{_ as F}from"./skip-scan-BZ_hZsa7.js";import{_ as C}from"./sampling_accuracy_perf-AxknImt6.js";import{_ as T,a as N,b as D,c as S,d as I}from"./trace-time-line-71kJ9bDU.js [...]
+import{j as e}from"./chunk-EPOLDU6W-B5LwAila.js";import{_ as g,a as u}from"./squirrel-CO237F3w.js";import{_ as x,a as m,b as E,c as y,d as j,e as f,f as b}from"./perf-topn-C8Xi2q9P.js";import{_ as v}from"./pherf-oyANWIFY.js";import{_ as w}from"./producer_consumer-C3WRDQ2y.js";import{_ as A}from"./pho-BiacCdLr.js";import{_ as F}from"./skip-scan-BZ_hZsa7.js";import{_ as T}from"./sampling_accuracy_perf-AxknImt6.js";import{_ as C,a as N,b as D,c as I,d as S}from"./trace-time-line-71kJ9bDU.js [...]
@@ -3549,6 +3549,74 @@ FROM users
WHERE email = 'jane@example.com';
\`\`\`
+## Partial Indexes
+
+A **partial index** indexes only the rows of the data table that satisfy a SQL
+boolean predicate, supplied at \`CREATE INDEX\` time via a \`WHERE\` clause. The
+index is smaller, writes that don't affect the predicate are cheaper, and the
+planner only uses it for queries whose own predicate implies the index's. Added
+in [PHOENIX-7032](https://issues.apache.org/jira/browse/PHOENIX-7032).
+
+### When to choose a partial index
+
+Reach for a partial index when the workload reads a small, well-defined slice of
+a much larger table — and that slice is identifiable by a SQL predicate. Common
+shapes:
+
+* *Open / active records*: \`WHERE status IN ('OPEN', 'PENDING')\` on a table that
+ also stores closed records.
+* *Recent rows*: \`WHERE created_at > DATE '2024-01-01'\`.
+* *Hot tier*: \`WHERE priority >= 5\` for paging / alerting workloads.
+* *Failure investigation*: \`WHERE result = 'FAIL'\` on a successful-most-of-the-time
+ table.
+
+### Creating a partial index
+
+The DDL is a regular \`CREATE INDEX\` with a trailing \`WHERE\` clause. Both
+**covered** and **uncovered** global indexes can be partial:
+
+\`\`\`sql
+CREATE INDEX idx_open_orders
+ ON orders (customer_id, created_at)
+ INCLUDE (total_amount)
+ WHERE status IN ('OPEN', 'PENDING');
+
+CREATE UNCOVERED INDEX idx_failed_jobs
+ ON jobs (created_at)
+ WHERE result = 'FAIL';
+\`\`\`
+
+The planner uses the index for any query whose \`WHERE\` clause implies the
+index's predicate:
+
+\`\`\`sql
+-- Uses idx_open_orders (status IN ('OPEN','PENDING') is implied).
+SELECT customer_id, total_amount
+FROM orders
+WHERE status = 'OPEN' AND created_at >= ?;
+\`\`\`
+
+### Mutations that cross the predicate
+
+Partial indexes correctly maintain themselves when a mutation moves a row into
+or out of the predicate, including under \`ON DUPLICATE KEY UPDATE\`:
+
+* A row that **starts** satisfying the predicate after an update has its index
+ row created.
+* A row that **stops** satisfying the predicate after an update has its index
+ row removed.
+
+This means a partial index stays consistent for a workload like *"close an
+order"* even though that operation flips the row out of the index's covered
+slice.
+
+### Limitations
+
+* **Local partial indexes are not supported** — only global (covered or
+ uncovered) partial indexes work today.
+* The \`WHERE\` predicate is fixed at \`CREATE INDEX\` time. To change it, drop and
+ recreate the index.
+
## Index Population
By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the \`ASYNC\` keyword in the index creation DDL statement:
@@ -4246,7 +4314,6 @@ The following limitations are enforced for the \`ON DUPLICATE KEY\` clause usage
does not handle atomicity unless the latest value is being updated.
* The same column should not be updated more than once in the same statement.
* No aggregation or references to sequences are allowed within the clause.
-* Global indexes on columns being atomically updated are not supported, as potentially a separate RPC across the wire would be made while the row is under lock to maintain the secondary index.
***
@@ -4496,6 +4563,105 @@ This sets \`CREATED_DATE\` in the destination table to the server timestamp.
When querying with filters on the row timestamp column, Phoenix performs its usual row-key optimizations and can also set scan min/max time ranges appropriately. Using this time range information, HBase can skip store files that do not fall in the target time range, which significantly improves performance, especially for tail-end data queries.
+## See also
+
+The [\`PHOENIX_ROW_TIMESTAMP()\`](/docs/features/phoenix-row-timestamp) function lets you read the underlying HBase row timestamp on any Phoenix table — even one without a declared \`ROW_TIMESTAMP\` column — and is indexable for fast time-bounded queries.
+
+***
+
+# PHOENIX\\_ROW\\_TIMESTAMP
+
+\`PHOENIX_ROW_TIMESTAMP()\` is a built-in SQL function that returns the **timestamp
+of the row's empty column**, which Phoenix updates automatically on every write.
+It's effectively the row's **last-modified time**, available on any Phoenix table
+without you having to declare or manage a timestamp column yourself. The return
+type is \`DATE\`.
+
+It can be used in three places, and the third one is what makes it especially
+powerful:
+
+1. As a projection in \`SELECT\`.
+2. As a predicate in \`WHERE\` (and \`JOIN\`) clauses.
+3. As the indexed expression in a [functional index](/docs/features/secondary-indexes#functional-indexes), which makes time-bounded reads fast even when the table isn't ordered by time.
+
+## Reading the row timestamp
+
+Project it like any other column:
+
+\`\`\`sql
+-- Last-modified time of every row.
+SELECT PHOENIX_ROW_TIMESTAMP(), id, payload FROM events;
+
+-- Combine with regular row data.
+SELECT id,
+ PHOENIX_ROW_TIMESTAMP() AS modified_at,
+ payload
+FROM events
+WHERE region = 'us-west-2';
+\`\`\`
+
+The function takes no arguments and is evaluated server-side from the empty cell
+that Phoenix already maintains for every row.
+
+## In WHERE predicates
+
+Use it to bound queries by mutation time, including incremental "what changed
+since" patterns:
+
+\`\`\`sql
+-- Rows modified in the last hour.
+SELECT * FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() > CURRENT_DATE() - 1.0 / 24;
+
+-- Pull a window for an incremental consumer.
+SELECT id, payload
+FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() >= ?
+ AND PHOENIX_ROW_TIMESTAMP() < ?
+ORDER BY PHOENIX_ROW_TIMESTAMP() ASC;
+\`\`\`
+
+Without an index, these predicates require a scan of the table. The next section
+fixes that.
+
+## Indexing on PHOENIX\\_ROW\\_TIMESTAMP()
+
+Create a [functional index](/docs/features/secondary-indexes#functional-indexes)
+on the function to make time-bounded reads fast. Phoenix can then seek directly
+on the indexed timestamp instead of scanning the data table:
+
+\`\`\`sql
+CREATE INDEX events_by_modified
+ ON events (PHOENIX_ROW_TIMESTAMP())
+ INCLUDE (payload);
+
+-- Phoenix uses the index for this query.
+SELECT id, payload
+FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() >= ?
+ AND PHOENIX_ROW_TIMESTAMP() < ?
+ORDER BY PHOENIX_ROW_TIMESTAMP() ASC;
+\`\`\`
+
+This is the typical recipe for "scan rows changed in the last N minutes" type
+queries on a table whose primary key isn't time-ordered. Pair with
+[uncovered indexes](/docs/features/secondary-indexes#uncovered-indexes) when you
+don't want to duplicate payload columns into the index.
+
+## Relationship to ROW\\_TIMESTAMP column
+
+Two related concepts share the word "timestamp" — they are not the same:
+
+| Feature | Direction | What it does |
+| ------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------ |
+| [\`ROW_TIMESTAMP\` column](/docs/features/row-timestamp-column) | Write | Designate a primary-key column whose value is *written into* the underlying HBase row timestamp. |
+| \`PHOENIX_ROW_TIMESTAMP()\` function | Read | Return the underlying HBase row timestamp Phoenix already maintains on every row's empty cell. |
+
+\`PHOENIX_ROW_TIMESTAMP()\` works on **any** Phoenix table, regardless of whether
+you've declared a \`ROW_TIMESTAMP\` column. If you have declared one, both
+mechanisms read/write the same underlying timestamp, so \`PHOENIX_ROW_TIMESTAMP()\`
+returns the value of the \`ROW_TIMESTAMP\` column for that row.
+
***
# Paged Queries
@@ -11174,7 +11340,7 @@ To avoid this, [close](https://central.sonatype.org/publish/release/#locate-and-
11. Bulk close JIRAs that were marked for the release fixVersion.
**Congratulations!**
-`,X={title:"Apache Phoenix Documentation",description:"Complete Apache Phoenix documentation in one continuous page."},K=[{href:"/news"},{href:"/downloads"},{href:"https://twitter.com/ApachePhoenix"},{href:"/who-is-using"},{href:"/docs/faq"},{href:"https://www.youtube.com/watch?v=XGa0SyJMH94"},{href:"/presentations/OC-HUG-2014-10-4x3.pdf"},{href:"/docs/quick-start"},{href:"/docs/fundamentals/performance"},{href:"/docs/grammar"},{href:"http://phoenix-hbase.blogspot.com/2013/04/how-to-add- [...]
+`,Z={title:"Apache Phoenix Documentation",description:"Complete Apache Phoenix documentation in one continuous page."},K=[{href:"/news"},{href:"/downloads"},{href:"https://twitter.com/ApachePhoenix"},{href:"/who-is-using"},{href:"/docs/faq"},{href:"https://www.youtube.com/watch?v=XGa0SyJMH94"},{href:"/presentations/OC-HUG-2014-10-4x3.pdf"},{href:"/docs/quick-start"},{href:"/docs/fundamentals/performance"},{href:"/docs/grammar"},{href:"http://phoenix-hbase.blogspot.com/2013/04/how-to-add- [...]
download here. Follow Apache Phoenix on
X/Twitter.`},{heading:"overview",content:"Apache Phoenix enables OLTP and operational analytics in Hadoop for low-latency applications by combining:"},{heading:"overview",content:"the power of standard SQL and JDBC APIs, with full ACID transaction capabilities"},{heading:"overview",content:"the flexibility of late-bound, schema-on-read capabilities from the NoSQL world by leveraging HBase as its backing store"},{heading:"overview",content:"Apache Phoenix is fully integrated with other Ha [...]
HBase root ZNode, the ZooKeeper port must also be specified.`},{heading:"thick-driver",content:"See also Connection String."},{heading:"thin-driver",content:"The Phoenix Thin Driver (used with the Phoenix Query Server) JDBC URL syntax is as follows:"},{heading:"thin-driver",content:`There are a number of keys exposed for client-use. The most commonly-used keys are: url and serialization. The url
@@ -11372,7 +11538,24 @@ that wants the payload.`},{heading:"uncovered-indexes-usage",content:`Declare an
UNCOVERED is global-only (cannot be combined with LOCAL) and cannot be combined
with INCLUDE — the whole point is to skip duplicating columns:`},{heading:"uncovered-indexes-usage",content:`The planner picks an uncovered index automatically when it's the best plan; no
hint is required. If you want to force it (e.g. to compare plans), use the
-standard index hint:`},{heading:"index-population",content:"By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the ASYNC keyword in the index creation DDL statement:"},{heading:"index-population",content:"The map reduce job that populates the index table must be kicked off separately th [...]
+standard index hint:`},{heading:"partial-indexes",content:`A partial index indexes only the rows of the data table that satisfy a SQL
+boolean predicate, supplied at CREATE INDEX time via a WHERE clause. The
+index is smaller, writes that don't affect the predicate are cheaper, and the
+planner only uses it for queries whose own predicate implies the index's. Added
+in PHOENIX-7032.`},{heading:"partial-indexes-when",content:`Reach for a partial index when the workload reads a small, well-defined slice of
+a much larger table — and that slice is identifiable by a SQL predicate. Common
+shapes:`},{heading:"partial-indexes-when",content:`Open / active records: WHERE status IN ('OPEN', 'PENDING') on a table that
+also stores closed records.`},{heading:"partial-indexes-when",content:"Recent rows: WHERE created_at > DATE '2024-01-01'."},{heading:"partial-indexes-when",content:"Hot tier: WHERE priority >= 5 for paging / alerting workloads."},{heading:"partial-indexes-when",content:`Failure investigation: WHERE result = 'FAIL' on a successful-most-of-the-time
+table.`},{heading:"partial-indexes-usage",content:`The DDL is a regular CREATE INDEX with a trailing WHERE clause. Both
+covered and uncovered global indexes can be partial:`},{heading:"partial-indexes-usage",content:`The planner uses the index for any query whose WHERE clause implies the
+index's predicate:`},{heading:"partial-indexes-mutations",content:`Partial indexes correctly maintain themselves when a mutation moves a row into
+or out of the predicate, including under ON DUPLICATE KEY UPDATE:`},{heading:"partial-indexes-mutations",content:`A row that starts satisfying the predicate after an update has its index
+row created.`},{heading:"partial-indexes-mutations",content:`A row that stops satisfying the predicate after an update has its index
+row removed.`},{heading:"partial-indexes-mutations",content:`This means a partial index stays consistent for a workload like "close an
+order" even though that operation flips the row out of the index's covered
+slice.`},{heading:"partial-indexes-limitations",content:`Local partial indexes are not supported — only global (covered or
+uncovered) partial indexes work today.`},{heading:"partial-indexes-limitations",content:`The WHERE predicate is fixed at CREATE INDEX time. To change it, drop and
+recreate the index.`},{heading:"index-population",content:"By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the ASYNC keyword in the index creation DDL statement:"},{heading:"index-population",content:"The map reduce job that populates the index table must be kicked off separately thr [...]
primary table. In other words, index updates are synchronous with the same strong consistency guarantees provided by HBase.`},{heading:"consistency-guarantees",content:`However, since indexes are stored in separate tables than the data table, depending on the properties of the table and the
type of index, the consistency between your table and index varies in the event that a commit fails due to a server-side
crash. This is an important design consideration driven by your requirements and use case.`},{heading:"consistency-guarantees",content:"Outlined below are the different options with various levels of consistency guarantees."},{heading:"local-indexes-1",content:"Since Phoenix 4.8 local indexes are always guaranteed to be consistent."},{heading:"global-indexes-on-transactional-tables",content:`By declaring your table as transactional, you achieve the highest level of consistency guarantee
@@ -11464,7 +11647,7 @@ mutated and 0 for a no-op, so callers know the outcome without having to inspect
cell contents. Both require an auto-commit connection.`},{heading:"atomic-upsert-limitations",content:"The following limitations are enforced for the ON DUPLICATE KEY clause usage:"},{heading:"atomic-upsert-limitations",content:"Primary key columns may not be updated, since this would essentially be creating a new row."},{heading:"atomic-upsert-limitations",content:`Transactional tables may not use this clause as atomic upserts are already possible through
exception handling when a conflict occurs.`},{heading:"atomic-upsert-limitations",content:`Immutable tables may not use this clause as by definition there should be no updates to
existing rows.`},{heading:"atomic-upsert-limitations",content:`The CURRENT_SCN property may not be set on connection when this clause is used as HBase
-does not handle atomicity unless the latest value is being updated.`},{heading:"atomic-upsert-limitations",content:"The same column should not be updated more than once in the same statement."},{heading:"atomic-upsert-limitations",content:"No aggregation or references to sequences are allowed within the clause."},{heading:"atomic-upsert-limitations",content:"Global indexes on columns being atomically updated are not supported, as potentially a separate RPC across the wire would be made w [...]
+does not handle atomicity unless the latest value is being updated.`},{heading:"atomic-upsert-limitations",content:"The same column should not be updated more than once in the same statement."},{heading:"atomic-upsert-limitations",content:"No aggregation or references to sequences are allowed within the clause."},{heading:"namespace-mapping",content:"From v4.8.0 onward, users can map Phoenix schemas to HBase namespaces so that any table created with a schema is created in the correspondi [...]
This command collects a set of keys per region per column family that
are equal byte distanced from each other. These collected keys are called guideposts
and they act as hints/guides to improve the parallelization of queries on a given
@@ -11494,7 +11677,23 @@ compactions or splits occur. If false, then the max timestamp found while traver
table over which statistics are being collected is used as the timestamp. Unless your
client is controlling the timestamps while reading and writing data, this parameter
should be left alone.`},{heading:"statistics-collection-configuration",content:"The default value is true."},{heading:"statistics-collection-configuration",content:"phoenix.use.stats.parallelization"},{heading:"statistics-collection-configuration",content:`This configuration is available starting in Phoenix 4.12. It controls whether statistical information
-on the data should be used to drive query parallelization.`},{heading:"statistics-collection-configuration",content:"The default value is true."},{heading:"row-timestamp-column",content:"Phoenix 4.6 provides a way to map HBase’s native row timestamp to a Phoenix column. This helps you take advantage of HBase optimizations for time ranges in store files, along with query optimizations built into Phoenix."},{heading:"row-timestamp-column",content:"For a column to be designated as ROW_TIMES [...]
+on the data should be used to drive query parallelization.`},{heading:"statistics-collection-configuration",content:"The default value is true."},{heading:"row-timestamp-column",content:"Phoenix 4.6 provides a way to map HBase’s native row timestamp to a Phoenix column. This helps you take advantage of HBase optimizations for time ranges in store files, along with query optimizations built into Phoenix."},{heading:"row-timestamp-column",content:"For a column to be designated as ROW_TIMES [...]
+of the row's empty column, which Phoenix updates automatically on every write.
+It's effectively the row's last-modified time, available on any Phoenix table
+without you having to declare or manage a timestamp column yourself. The return
+type is DATE.`},{heading:"phoenix-row-timestamp",content:`It can be used in three places, and the third one is what makes it especially
+powerful:`},{heading:"phoenix-row-timestamp",content:"As a projection in SELECT."},{heading:"phoenix-row-timestamp",content:"As a predicate in WHERE (and JOIN) clauses."},{heading:"phoenix-row-timestamp",content:"As the indexed expression in a functional index, which makes time-bounded reads fast even when the table isn't ordered by time."},{heading:"phoenix-row-timestamp-read",content:"Project it like any other column:"},{heading:"phoenix-row-timestamp-read",content:`The function takes [...]
+that Phoenix already maintains for every row.`},{heading:"phoenix-row-timestamp-where",content:`Use it to bound queries by mutation time, including incremental "what changed
+since" patterns:`},{heading:"phoenix-row-timestamp-where",content:`Without an index, these predicates require a scan of the table. The next section
+fixes that.`},{heading:"phoenix-row-timestamp-index",content:`Create a functional index
+on the function to make time-bounded reads fast. Phoenix can then seek directly
+on the indexed timestamp instead of scanning the data table:`},{heading:"phoenix-row-timestamp-index",content:`This is the typical recipe for "scan rows changed in the last N minutes" type
+queries on a table whose primary key isn't time-ordered. Pair with
+uncovered indexes when you
+don't want to duplicate payload columns into the index.`},{heading:"phoenix-row-timestamp-vs-row-timestamp",content:'Two related concepts share the word "timestamp" — they are not the same:'},{heading:"phoenix-row-timestamp-vs-row-timestamp",content:"Feature"},{heading:"phoenix-row-timestamp-vs-row-timestamp",content:"Direction"},{heading:"phoenix-row-timestamp-vs-row-timestamp",content:"What it does"},{heading:"phoenix-row-timestamp-vs-row-timestamp",content:"ROW_TIMESTAMP column"},{hea [...]
+you've declared a ROW_TIMESTAMP column. If you have declared one, both
+mechanisms read/write the same underlying timestamp, so PHOENIX_ROW_TIMESTAMP()
+returns the value of the ROW_TIMESTAMP column for that row.`},{heading:"paged-queries",content:"Phoenix supports standard SQL constructs to enable paged queries:"},{heading:"paged-queries",content:"Row Value Constructors (RVC)"},{heading:"paged-queries",content:"OFFSET with LIMIT"},{heading:"row-value-constructors-rvc",content:"A row value constructor is an ordered sequence of values delimited by parentheses. For example:"},{heading:"row-value-constructors-rvc",content:"Just like regular [...]
that you can hand out to a pool of workers to drive a parallel full-table scan. It is
the natural primitive for ETL exports, table validation/repair tools, bulk
re-encoding, and anything else that needs to walk every row as fast as the cluster
@@ -11791,7 +11990,7 @@ The script will also deploy the Maven artifacts to https://repository.apache.org
Check that these are present.`},{heading:"close-the-staging-repository",content:`The published staging repository is in the "open" state. Open staging repositories
are aggressively cleaned up, and may be removed by the time the vote passes.
To avoid this, close
-(but DO NOT release) the staging repository immediately after deployment.`},{heading:"voting",content:"Initiate the vote email. See example here, or use the <workdir>/output/vote.txt template generated by the script."},{heading:"voting",content:"In case the RC (Release Candidate) is rejected via the vote, you will have to repeat the above process and re-initiate the vote for the next RC (RC0, RC1, etc.)."},{heading:"release",content:"Once voting is successful (say for RC1), copy artifact [...]
+(but DO NOT release) the staging repository immediately after deployment.`},{heading:"voting",content:"Initiate the vote email. See example here, or use the <workdir>/output/vote.txt template generated by the script."},{heading:"voting",content:"In case the RC (Release Candidate) is rejected via the vote, you will have to repeat the above process and re-initiate the vote for the next RC (RC0, RC1, etc.)."},{heading:"release",content:"Once voting is successful (say for RC1), copy artifact [...]
`,e.jsxs(e.Fragment,{children:[e.jsx(i.img,{src:"/images/logo.svg",alt:"Apache Phoenix logo",className:"w-1/2 dark:hidden"}),`
`,e.jsx(i.img,{src:"/images/dark-theme-logo.svg",alt:"Apache Phoenix logo",className:"hidden w-1/2 dark:block"}),`
`,e.jsx(i.p,{children:e.jsx(i.strong,{children:"OLTP and operational analytics for Apache Hadoop"})}),`
@@ -14122,6 +14321,60 @@ standard index hint:`}),`
`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" users"})]}),`
`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" email "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"="}),e.jsx(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" 'jane@example.com'"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4 [...]
+`,e.jsx(i.h2,{id:"partial-indexes",children:"Partial Indexes"}),`
+`,e.jsxs(i.p,{children:["A ",e.jsx(i.strong,{children:"partial index"}),` indexes only the rows of the data table that satisfy a SQL
+boolean predicate, supplied at `,e.jsx(i.code,{children:"CREATE INDEX"})," time via a ",e.jsx(i.code,{children:"WHERE"}),` clause. The
+index is smaller, writes that don't affect the predicate are cheaper, and the
+planner only uses it for queries whose own predicate implies the index's. Added
+in `,e.jsx(i.a,{href:"https://issues.apache.org/jira/browse/PHOENIX-7032",children:"PHOENIX-7032"}),"."]}),`
+`,e.jsx(i.h3,{id:"partial-indexes-when",children:"When to choose a partial index"}),`
+`,e.jsx(i.p,{children:`Reach for a partial index when the workload reads a small, well-defined slice of
+a much larger table — and that slice is identifiable by a SQL predicate. Common
+shapes:`}),`
+`,e.jsxs(i.ul,{children:[`
+`,e.jsxs(i.li,{children:[e.jsx(i.em,{children:"Open / active records"}),": ",e.jsx(i.code,{children:"WHERE status IN ('OPEN', 'PENDING')"}),` on a table that
+also stores closed records.`]}),`
+`,e.jsxs(i.li,{children:[e.jsx(i.em,{children:"Recent rows"}),": ",e.jsx(i.code,{children:"WHERE created_at > DATE '2024-01-01'"}),"."]}),`
+`,e.jsxs(i.li,{children:[e.jsx(i.em,{children:"Hot tier"}),": ",e.jsx(i.code,{children:"WHERE priority >= 5"})," for paging / alerting workloads."]}),`
+`,e.jsxs(i.li,{children:[e.jsx(i.em,{children:"Failure investigation"}),": ",e.jsx(i.code,{children:"WHERE result = 'FAIL'"}),` on a successful-most-of-the-time
+table.`]}),`
+`]}),`
+`,e.jsx(i.h3,{id:"partial-indexes-usage",children:"Creating a partial index"}),`
+`,e.jsxs(i.p,{children:["The DDL is a regular ",e.jsx(i.code,{children:"CREATE INDEX"})," with a trailing ",e.jsx(i.code,{children:"WHERE"}),` clause. Both
+`,e.jsx(i.strong,{children:"covered"})," and ",e.jsx(i.strong,{children:"uncovered"})," global indexes can be partial:"]}),`
+`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ON"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" orders (customer_id, created_at)"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" INCLUDE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" (total_amount)"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" status"}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" IN"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" ("}),e.jsx(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},childr [...]
+`,e.jsx(i.span,{className:"line"}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"CREATE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" UNCOVERED "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"INDEX"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" idx_failed_jobs"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ON"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" jobs (created_at)"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" result "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"="}),e.jsx(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" 'FAIL'"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},ch [...]
+`,e.jsxs(i.p,{children:["The planner uses the index for any query whose ",e.jsx(i.code,{children:"WHERE"}),` clause implies the
+index's predicate:`]}),`
+`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" customer_id, total_amount"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" orders"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" status"}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ="}),e.jsx(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" 'OPEN'"}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},childr [...]
+`,e.jsx(i.h3,{id:"partial-indexes-mutations",children:"Mutations that cross the predicate"}),`
+`,e.jsxs(i.p,{children:[`Partial indexes correctly maintain themselves when a mutation moves a row into
+or out of the predicate, including under `,e.jsx(i.code,{children:"ON DUPLICATE KEY UPDATE"}),":"]}),`
+`,e.jsxs(i.ul,{children:[`
+`,e.jsxs(i.li,{children:["A row that ",e.jsx(i.strong,{children:"starts"}),` satisfying the predicate after an update has its index
+row created.`]}),`
+`,e.jsxs(i.li,{children:["A row that ",e.jsx(i.strong,{children:"stops"}),` satisfying the predicate after an update has its index
+row removed.`]}),`
+`]}),`
+`,e.jsxs(i.p,{children:["This means a partial index stays consistent for a workload like ",e.jsx(i.em,{children:`"close an
+order"`}),` even though that operation flips the row out of the index's covered
+slice.`]}),`
+`,e.jsx(i.h3,{id:"partial-indexes-limitations",children:"Limitations"}),`
+`,e.jsxs(i.ul,{children:[`
+`,e.jsxs(i.li,{children:[e.jsx(i.strong,{children:"Local partial indexes are not supported"}),` — only global (covered or
+uncovered) partial indexes work today.`]}),`
+`,e.jsxs(i.li,{children:["The ",e.jsx(i.code,{children:"WHERE"})," predicate is fixed at ",e.jsx(i.code,{children:"CREATE INDEX"}),` time. To change it, drop and
+recreate the index.`]}),`
+`]}),`
`,e.jsx(i.h2,{id:"index-population",children:"Index Population"}),`
`,e.jsxs(i.p,{children:["By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the ",e.jsx(i.code,{children:"ASYNC"})," keyword in the index creation DDL statement:"]}),`
`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
@@ -14625,7 +14878,6 @@ existing rows.`}),`
does not handle atomicity unless the latest value is being updated.`]}),`
`,e.jsx(i.li,{children:"The same column should not be updated more than once in the same statement."}),`
`,e.jsx(i.li,{children:"No aggregation or references to sequences are allowed within the clause."}),`
-`,e.jsx(i.li,{children:"Global indexes on columns being atomically updated are not supported, as potentially a separate RPC across the wire would be made while the row is under lock to maintain the secondary index."}),`
`]})]}),`
`,e.jsx(i.hr,{}),`
`,e.jsx(i.h1,{id:"namespace-mapping",children:"Namespace Mapping"}),`
@@ -14787,7 +15039,76 @@ on the data should be used to drive query parallelization.`}),`
`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" METRICS_ID, METRIC_VALUE "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" SOURCE_METRICS_TABLE"})]})]})})}),`
`,e.jsxs(i.p,{children:["This sets ",e.jsx(i.code,{children:"CREATED_DATE"})," in the destination table to the server timestamp."]}),`
-`,e.jsx(i.p,{children:"When querying with filters on the row timestamp column, Phoenix performs its usual row-key optimizations and can also set scan min/max time ranges appropriately. Using this time range information, HBase can skip store files that do not fall in the target time range, which significantly improves performance, especially for tail-end data queries."})]}),`
+`,e.jsx(i.p,{children:"When querying with filters on the row timestamp column, Phoenix performs its usual row-key optimizations and can also set scan min/max time ranges appropriately. Using this time range information, HBase can skip store files that do not fall in the target time range, which significantly improves performance, especially for tail-end data queries."}),`
+`,e.jsx(i.h2,{id:"see-also",children:"See also"}),`
+`,e.jsxs(i.p,{children:["The ",e.jsx(i.a,{href:"/docs/features/phoenix-row-timestamp",children:e.jsx(i.code,{children:"PHOENIX_ROW_TIMESTAMP()"})})," function lets you read the underlying HBase row timestamp on any Phoenix table — even one without a declared ",e.jsx(i.code,{children:"ROW_TIMESTAMP"})," column — and is indexable for fast time-bounded queries."]})]}),`
+`,e.jsx(i.hr,{}),`
+`,e.jsx(i.h1,{id:"phoenix-row-timestamp",children:"PHOENIX_ROW_TIMESTAMP"}),`
+`,e.jsxs(e.Fragment,{children:[e.jsxs(i.p,{children:[e.jsx(i.code,{children:"PHOENIX_ROW_TIMESTAMP()"})," is a built-in SQL function that returns the ",e.jsx(i.strong,{children:`timestamp
+of the row's empty column`}),`, which Phoenix updates automatically on every write.
+It's effectively the row's `,e.jsx(i.strong,{children:"last-modified time"}),`, available on any Phoenix table
+without you having to declare or manage a timestamp column yourself. The return
+type is `,e.jsx(i.code,{children:"DATE"}),"."]}),`
+`,e.jsx(i.p,{children:`It can be used in three places, and the third one is what makes it especially
+powerful:`}),`
+`,e.jsxs(i.ol,{children:[`
+`,e.jsxs(i.li,{children:["As a projection in ",e.jsx(i.code,{children:"SELECT"}),"."]}),`
+`,e.jsxs(i.li,{children:["As a predicate in ",e.jsx(i.code,{children:"WHERE"})," (and ",e.jsx(i.code,{children:"JOIN"}),") clauses."]}),`
+`,e.jsxs(i.li,{children:["As the indexed expression in a ",e.jsx(i.a,{href:"/docs/features/secondary-indexes#functional-indexes",children:"functional index"}),", which makes time-bounded reads fast even when the table isn't ordered by time."]}),`
+`]}),`
+`,e.jsx(i.h2,{id:"phoenix-row-timestamp-read",children:"Reading the row timestamp"}),`
+`,e.jsx(i.p,{children:"Project it like any other column:"}),`
+`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP(), id, payload "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events;"})]}),`
+`,e.jsx(i.span,{className:"line"}),`
+`,e.jsx(i.span,{className:"line",children:e.jsx(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:"-- Combine with regular row data."})}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" id,"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"AS"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" modified_at,"})]}),`
+`,e.jsx(i.span,{className:"line",children:e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" payload"})}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" region "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"="}),e.jsx(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" 'us-west-2'"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},c [...]
+`,e.jsx(i.p,{children:`The function takes no arguments and is evaluated server-side from the empty cell
+that Phoenix already maintains for every row.`}),`
+`,e.jsx(i.h2,{id:"phoenix-row-timestamp-where",children:"In WHERE predicates"}),`
+`,e.jsx(i.p,{children:`Use it to bound queries by mutation time, including incremental "what changed
+since" patterns:`}),`
+`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" *"}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" CURRENT_DATE() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shi [...]
+`,e.jsx(i.span,{className:"line"}),`
+`,e.jsx(i.span,{className:"line",children:e.jsx(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:"-- Pull a window for an incremental consumer."})}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" id, payload"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">="}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" ?"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" AND"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"<"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" ?"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"ORDER BY"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"ASC"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]})]})})}),`
+`,e.jsx(i.p,{children:`Without an index, these predicates require a scan of the table. The next section
+fixes that.`}),`
+`,e.jsx(i.h2,{id:"phoenix-row-timestamp-index",children:"Indexing on PHOENIX_ROW_TIMESTAMP()"}),`
+`,e.jsxs(i.p,{children:["Create a ",e.jsx(i.a,{href:"/docs/features/secondary-indexes#functional-indexes",children:"functional index"}),`
+on the function to make time-bounded reads fast. Phoenix can then seek directly
+on the indexed timestamp instead of scanning the data table:`]}),`
+`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ON"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events (PHOENIX_ROW_TIMESTAMP())"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" INCLUDE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" (payload);"})]}),`
+`,e.jsx(i.span,{className:"line"}),`
+`,e.jsx(i.span,{className:"line",children:e.jsx(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:"-- Phoenix uses the index for this query."})}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" id, payload"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">="}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" ?"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" AND"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"<"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" ?"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"ORDER BY"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"ASC"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]})]})})}),`
+`,e.jsxs(i.p,{children:[`This is the typical recipe for "scan rows changed in the last N minutes" type
+queries on a table whose primary key isn't time-ordered. Pair with
+`,e.jsx(i.a,{href:"/docs/features/secondary-indexes#uncovered-indexes",children:"uncovered indexes"}),` when you
+don't want to duplicate payload columns into the index.`]}),`
+`,e.jsx(i.h2,{id:"phoenix-row-timestamp-vs-row-timestamp",children:"Relationship to ROW_TIMESTAMP column"}),`
+`,e.jsx(i.p,{children:'Two related concepts share the word "timestamp" — they are not the same:'}),`
+`,e.jsxs(i.table,{children:[e.jsx(i.thead,{children:e.jsxs(i.tr,{children:[e.jsx(i.th,{children:"Feature"}),e.jsx(i.th,{children:"Direction"}),e.jsx(i.th,{children:"What it does"})]})}),e.jsxs(i.tbody,{children:[e.jsxs(i.tr,{children:[e.jsx(i.td,{children:e.jsxs(i.a,{href:"/docs/features/row-timestamp-column",children:[e.jsx(i.code,{children:"ROW_TIMESTAMP"})," column"]})}),e.jsx(i.td,{children:"Write"}),e.jsxs(i.td,{children:["Designate a primary-key column whose value is ",e.jsx(i.em,{ [...]
+`,e.jsxs(i.p,{children:[e.jsx(i.code,{children:"PHOENIX_ROW_TIMESTAMP()"})," works on ",e.jsx(i.strong,{children:"any"}),` Phoenix table, regardless of whether
+you've declared a `,e.jsx(i.code,{children:"ROW_TIMESTAMP"}),` column. If you have declared one, both
+mechanisms read/write the same underlying timestamp, so `,e.jsx(i.code,{children:"PHOENIX_ROW_TIMESTAMP()"}),`
+returns the value of the `,e.jsx(i.code,{children:"ROW_TIMESTAMP"})," column for that row."]})]}),`
`,e.jsx(i.hr,{}),`
`,e.jsx(i.h1,{id:"paged-queries",children:"Paged Queries"}),`
`,e.jsxs(e.Fragment,{children:[e.jsx(i.p,{children:"Phoenix supports standard SQL constructs to enable paged queries:"}),`
@@ -14978,7 +15299,7 @@ Resource consumption drops quickly as sampling rate decreases. In general, the a
`,e.jsxs(i.ul,{children:[`
`,e.jsx(i.li,{children:"A denser guidepost setting improves sampling accuracy, but may reduce performance. A comparison is shown below."}),`
`]}),`
-`,e.jsx(i.p,{children:e.jsx(i.img,{alt:"Table sampling performance",src:C,placeholder:"blur"})})]}),`
+`,e.jsx(i.p,{children:e.jsx(i.img,{alt:"Table sampling performance",src:T,placeholder:"blur"})})]}),`
`,e.jsx(i.hr,{}),`
`,e.jsx(i.h1,{id:"views",children:"Views"}),`
`,e.jsxs(e.Fragment,{children:[e.jsx(i.p,{children:"The standard SQL view syntax (with some limitations) is now supported by Phoenix to enable multiple virtual tables to all share the same underlying physical HBase table. This is important in HBase as there are limits to the number of regions which HBase can manage. Limiting the number of tables can help limit the number of regions in a cluster."}),`
@@ -16119,7 +16440,7 @@ Enabling one of these properties only turns on trace collection. Trace data stil
`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="m 4,4 a 1,1 0 0 0 -0.7070312,0.2929687 1,1 0 0 0 0,1.4140625 L 8.5859375,11 3.2929688,16.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140624,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.414062 L 4.7070312,4.2929687 A 1,1 0 0 0 4,4 [...]
`,e.jsx(i.h2,{id:"feature-list",children:"Feature list"}),`
`,e.jsx(i.p,{children:"The tracing web app for Apache Phoenix includes: feature list, dependency tree, trace count, trace distribution, and timeline."}),`
-`,e.jsx(i.p,{children:e.jsx(i.img,{alt:"trace-web-app-dashboard",src:T,placeholder:"blur"})}),`
+`,e.jsx(i.p,{children:e.jsx(i.img,{alt:"trace-web-app-dashboard",src:C,placeholder:"blur"})}),`
`,e.jsx(i.h3,{id:"list",children:"List"}),`
`,e.jsx(i.p,{children:"The most recent traces are listed down. The limiting value entered on the textbox is used to determine the trace count displayed. With each trace, there is a link to view either the dependency tree or the timeline."}),`
`,e.jsx(i.p,{children:e.jsx(i.img,{alt:"trace-list",src:N,placeholder:"blur"})}),`
@@ -16128,12 +16449,12 @@ Enabling one of these properties only turns on trace collection. Trace data stil
`,e.jsx(i.p,{children:e.jsx(i.img,{alt:"trace-dependency-tree",src:D,placeholder:"blur"})}),`
`,e.jsx(i.h3,{id:"trace-count",children:"Trace count"}),`
`,e.jsx(i.p,{children:"The trace list is categorized by description. The trace count chart can be viewed as pie, line, bar, or area chart. The chart selector is collapsible and can be hidden."}),`
-`,e.jsx(i.p,{children:e.jsx(i.img,{alt:"trace-count-chart",src:S,placeholder:"blur"})}),`
+`,e.jsx(i.p,{children:e.jsx(i.img,{alt:"trace-count-chart",src:I,placeholder:"blur"})}),`
`,e.jsx(i.h3,{id:"trace-distribution",children:"Trace distribution"}),`
`,e.jsx(i.p,{children:"The trace distribution chart shows traces across Phoenix hosts on which they are running. Chart types include pie, line, bar, and area. The chart selector is collapsible and can be hidden."}),`
`,e.jsx(i.h3,{id:"timeline",children:"Timeline"}),`
`,e.jsx(i.p,{children:"The traces can be viewed along the time axis for a given trace id. Traces can be added or cleared from the timeline. There should be a minimum of two traces starting at two different times for the system to draw its timeline. This feature helps the user to easily compare execution times between traces and within the same trace."}),`
-`,e.jsx(i.p,{children:e.jsx(i.img,{alt:"trace-time-line",src:I,placeholder:"blur"})})]}),`
+`,e.jsx(i.p,{children:e.jsx(i.img,{alt:"trace-time-line",src:S,placeholder:"blur"})})]}),`
`,e.jsx(i.hr,{}),`
`,e.jsx(i.h1,{id:"cursor",children:"Cursor"}),`
`,e.jsxs(e.Fragment,{children:[e.jsxs(i.p,{children:["To work on a subset of rows from a query, Phoenix supports a ",e.jsx(i.code,{children:"CURSOR"})," control structure. The sequence below shows how to use a cursor."]}),`
@@ -18351,4 +18672,4 @@ To avoid this, `,e.jsx(i.a,{href:"https://central.sonatype.org/publish/release/#
`,e.jsx(i.p,{children:"Bulk close JIRAs that were marked for the release fixVersion."}),`
`]}),`
`]}),`
-`,e.jsx(i.p,{children:e.jsx(i.strong,{children:"Congratulations!"})})]})]})}function $(h={}){const{wrapper:i}=h.components||{};return i?e.jsx(i,{...h,children:e.jsx(k,{...h})}):k(h)}function o(h,i){throw new Error("Expected component `"+h+"` to be defined: you likely forgot to import, pass, or provide it.")}export{Z as _markdown,r as datatypesTopicIndex,$ as default,K as extractedReferences,X as frontmatter,t as functionsTopicIndex,n as grammarTopicIndex,J as structuredData,Q as toc};
+`,e.jsx(i.p,{children:e.jsx(i.strong,{children:"Congratulations!"})})]})]})}function $(h={}){const{wrapper:i}=h.components||{};return i?e.jsx(i,{...h,children:e.jsx(k,{...h})}):k(h)}function o(h,i){throw new Error("Expected component `"+h+"` to be defined: you likely forgot to import, pass, or provide it.")}export{X as _markdown,r as datatypesTopicIndex,$ as default,K as extractedReferences,Z as frontmatter,t as functionsTopicIndex,n as grammarTopicIndex,J as structuredData,Q as toc};
diff --git a/output/assets/manifest-e852c125.js b/output/assets/manifest-d1992ec0.js
similarity index 98%
rename from output/assets/manifest-e852c125.js
rename to output/assets/manifest-d1992ec0.js
index eb17c575..8ff679b2 100644
--- a/output/assets/manifest-e852c125.js
+++ b/output/assets/manifest-d1992ec0.js
@@ -1 +1 @@
-window.__reactRouterManifest={"entry":{"module":"/assets/entry.client-_CVK9qYI.js","imports":["/assets/chunk-EPOLDU6W-B5LwAila.js","/assets/index-FCA4GwU0.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/root-BHBAHx51.js","imports":["/assets/chunk-EPOLDU6W-B5LwAila.js","/assets/index-FCA4GwU0.js","/assets/theme-provider-BI6ghFmW.j [...]
\ No newline at end of file
+window.__reactRouterManifest={"entry":{"module":"/assets/entry.client-_CVK9qYI.js","imports":["/assets/chunk-EPOLDU6W-B5LwAila.js","/assets/index-FCA4GwU0.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/root-BHBAHx51.js","imports":["/assets/chunk-EPOLDU6W-B5LwAila.js","/assets/index-FCA4GwU0.js","/assets/theme-provider-BI6ghFmW.j [...]
\ No newline at end of file
diff --git a/output/assets/meta-DvKVc6kl.js b/output/assets/meta-DvKVc6kl.js
deleted file mode 100644
index b1a74752..00000000
--- a/output/assets/meta-DvKVc6kl.js
+++ /dev/null
@@ -1 +0,0 @@
-const t="Features",e=["transactions","user-defined-functions","secondary-indexes","storage-formats","atomic-upsert","namespace-mapping","statistics-collection","row-timestamp-column","paged-queries","salted-tables","skip-scan","segment-scan","table-sampling","views","ttl","view-ttl","conditional-ttl","multi-tenancy","dynamic-columns","varbinary-encoded","bson","change-data-capture","bulk-loading","query-server","metrics","tracing","cursor"],a={title:t,pages:e};export{a as default,e as pa [...]
diff --git a/output/assets/meta-s4CV-3L_.js b/output/assets/meta-s4CV-3L_.js
new file mode 100644
index 00000000..3212e88d
--- /dev/null
+++ b/output/assets/meta-s4CV-3L_.js
@@ -0,0 +1 @@
+const t="Features",e=["transactions","user-defined-functions","secondary-indexes","storage-formats","atomic-upsert","namespace-mapping","statistics-collection","row-timestamp-column","phoenix-row-timestamp","paged-queries","salted-tables","skip-scan","segment-scan","table-sampling","views","ttl","view-ttl","conditional-ttl","multi-tenancy","dynamic-columns","varbinary-encoded","bson","change-data-capture","bulk-loading","query-server","metrics","tracing","cursor"],a={title:t,pages:e};exp [...]
diff --git a/output/assets/phoenix-row-timestamp-DK9PDNUn.js b/output/assets/phoenix-row-timestamp-DK9PDNUn.js
new file mode 100644
index 00000000..9af8f2de
--- /dev/null
+++ b/output/assets/phoenix-row-timestamp-DK9PDNUn.js
@@ -0,0 +1,171 @@
+import{j as e}from"./chunk-EPOLDU6W-B5LwAila.js";let a=`\`PHOENIX_ROW_TIMESTAMP()\` is a built-in SQL function that returns the **timestamp
+of the row's empty column**, which Phoenix updates automatically on every write.
+It's effectively the row's **last-modified time**, available on any Phoenix table
+without you having to declare or manage a timestamp column yourself. The return
+type is \`DATE\`.
+
+It can be used in three places, and the third one is what makes it especially
+powerful:
+
+1. As a projection in \`SELECT\`.
+2. As a predicate in \`WHERE\` (and \`JOIN\`) clauses.
+3. As the indexed expression in a [functional index](/docs/features/secondary-indexes#functional-indexes), which makes time-bounded reads fast even when the table isn't ordered by time.
+
+## Reading the row timestamp
+
+Project it like any other column:
+
+\`\`\`sql
+-- Last-modified time of every row.
+SELECT PHOENIX_ROW_TIMESTAMP(), id, payload FROM events;
+
+-- Combine with regular row data.
+SELECT id,
+ PHOENIX_ROW_TIMESTAMP() AS modified_at,
+ payload
+FROM events
+WHERE region = 'us-west-2';
+\`\`\`
+
+The function takes no arguments and is evaluated server-side from the empty cell
+that Phoenix already maintains for every row.
+
+## In WHERE predicates
+
+Use it to bound queries by mutation time, including incremental "what changed
+since" patterns:
+
+\`\`\`sql
+-- Rows modified in the last hour.
+SELECT * FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() > CURRENT_DATE() - 1.0 / 24;
+
+-- Pull a window for an incremental consumer.
+SELECT id, payload
+FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() >= ?
+ AND PHOENIX_ROW_TIMESTAMP() < ?
+ORDER BY PHOENIX_ROW_TIMESTAMP() ASC;
+\`\`\`
+
+Without an index, these predicates require a scan of the table. The next section
+fixes that.
+
+## Indexing on PHOENIX\\_ROW\\_TIMESTAMP()
+
+Create a [functional index](/docs/features/secondary-indexes#functional-indexes)
+on the function to make time-bounded reads fast. Phoenix can then seek directly
+on the indexed timestamp instead of scanning the data table:
+
+\`\`\`sql
+CREATE INDEX events_by_modified
+ ON events (PHOENIX_ROW_TIMESTAMP())
+ INCLUDE (payload);
+
+-- Phoenix uses the index for this query.
+SELECT id, payload
+FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() >= ?
+ AND PHOENIX_ROW_TIMESTAMP() < ?
+ORDER BY PHOENIX_ROW_TIMESTAMP() ASC;
+\`\`\`
+
+This is the typical recipe for "scan rows changed in the last N minutes" type
+queries on a table whose primary key isn't time-ordered. Pair with
+[uncovered indexes](/docs/features/secondary-indexes#uncovered-indexes) when you
+don't want to duplicate payload columns into the index.
+
+## Relationship to ROW\\_TIMESTAMP column
+
+Two related concepts share the word "timestamp" — they are not the same:
+
+| Feature | Direction | What it does |
+| ------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------ |
+| [\`ROW_TIMESTAMP\` column](/docs/features/row-timestamp-column) | Write | Designate a primary-key column whose value is *written into* the underlying HBase row timestamp. |
+| \`PHOENIX_ROW_TIMESTAMP()\` function | Read | Return the underlying HBase row timestamp Phoenix already maintains on every row's empty cell. |
+
+\`PHOENIX_ROW_TIMESTAMP()\` works on **any** Phoenix table, regardless of whether
+you've declared a \`ROW_TIMESTAMP\` column. If you have declared one, both
+mechanisms read/write the same underlying timestamp, so \`PHOENIX_ROW_TIMESTAMP()\`
+returns the value of the \`ROW_TIMESTAMP\` column for that row.
+`,h={title:"PHOENIX_ROW_TIMESTAMP()",description:"Read the per-row last-modified timestamp Phoenix maintains automatically — usable in projections, predicates, and indexes for fast time-bounded reads."},r=[{href:"/docs/features/secondary-indexes#functional-indexes"},{href:"/docs/features/secondary-indexes#functional-indexes"},{href:"/docs/features/secondary-indexes#uncovered-indexes"},{href:"/docs/features/row-timestamp-column"}],l={contents:[{heading:void 0,content:`PHOENIX_ROW_TIMESTAM [...]
+of the row's empty column, which Phoenix updates automatically on every write.
+It's effectively the row's last-modified time, available on any Phoenix table
+without you having to declare or manage a timestamp column yourself. The return
+type is DATE.`},{heading:void 0,content:`It can be used in three places, and the third one is what makes it especially
+powerful:`},{heading:void 0,content:"As a projection in SELECT."},{heading:void 0,content:"As a predicate in WHERE (and JOIN) clauses."},{heading:void 0,content:"As the indexed expression in a functional index, which makes time-bounded reads fast even when the table isn't ordered by time."},{heading:"phoenix-row-timestamp-read",content:"Project it like any other column:"},{heading:"phoenix-row-timestamp-read",content:`The function takes no arguments and is evaluated server-side from the [...]
+that Phoenix already maintains for every row.`},{heading:"phoenix-row-timestamp-where",content:`Use it to bound queries by mutation time, including incremental "what changed
+since" patterns:`},{heading:"phoenix-row-timestamp-where",content:`Without an index, these predicates require a scan of the table. The next section
+fixes that.`},{heading:"phoenix-row-timestamp-index",content:`Create a functional index
+on the function to make time-bounded reads fast. Phoenix can then seek directly
+on the indexed timestamp instead of scanning the data table:`},{heading:"phoenix-row-timestamp-index",content:`This is the typical recipe for "scan rows changed in the last N minutes" type
+queries on a table whose primary key isn't time-ordered. Pair with
+uncovered indexes when you
+don't want to duplicate payload columns into the index.`},{heading:"phoenix-row-timestamp-vs-row-timestamp",content:'Two related concepts share the word "timestamp" — they are not the same:'},{heading:"phoenix-row-timestamp-vs-row-timestamp",content:"Feature"},{heading:"phoenix-row-timestamp-vs-row-timestamp",content:"Direction"},{heading:"phoenix-row-timestamp-vs-row-timestamp",content:"What it does"},{heading:"phoenix-row-timestamp-vs-row-timestamp",content:"ROW_TIMESTAMP column"},{hea [...]
+you've declared a ROW_TIMESTAMP column. If you have declared one, both
+mechanisms read/write the same underlying timestamp, so PHOENIX_ROW_TIMESTAMP()
+returns the value of the ROW_TIMESTAMP column for that row.`}],headings:[{id:"phoenix-row-timestamp-read",content:"Reading the row timestamp"},{id:"phoenix-row-timestamp-where",content:"In WHERE predicates"},{id:"phoenix-row-timestamp-index",content:"Indexing on PHOENIX_ROW_TIMESTAMP()"},{id:"phoenix-row-timestamp-vs-row-timestamp",content:"Relationship to ROW_TIMESTAMP column"}]};const d=[{depth:2,url:"#phoenix-row-timestamp-read",title:e.jsx(e.Fragment,{children:"Reading the row timest [...]
+of the row's empty column`}),`, which Phoenix updates automatically on every write.
+It's effectively the row's `,e.jsx(i.strong,{children:"last-modified time"}),`, available on any Phoenix table
+without you having to declare or manage a timestamp column yourself. The return
+type is `,e.jsx(i.code,{children:"DATE"}),"."]}),`
+`,e.jsx(i.p,{children:`It can be used in three places, and the third one is what makes it especially
+powerful:`}),`
+`,e.jsxs(i.ol,{children:[`
+`,e.jsxs(i.li,{children:["As a projection in ",e.jsx(i.code,{children:"SELECT"}),"."]}),`
+`,e.jsxs(i.li,{children:["As a predicate in ",e.jsx(i.code,{children:"WHERE"})," (and ",e.jsx(i.code,{children:"JOIN"}),") clauses."]}),`
+`,e.jsxs(i.li,{children:["As the indexed expression in a ",e.jsx(i.a,{href:"/docs/features/secondary-indexes#functional-indexes",children:"functional index"}),", which makes time-bounded reads fast even when the table isn't ordered by time."]}),`
+`]}),`
+`,e.jsx(i.h2,{id:"phoenix-row-timestamp-read",children:"Reading the row timestamp"}),`
+`,e.jsx(i.p,{children:"Project it like any other column:"}),`
+`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP(), id, payload "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events;"})]}),`
+`,e.jsx(i.span,{className:"line"}),`
+`,e.jsx(i.span,{className:"line",children:e.jsx(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:"-- Combine with regular row data."})}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" id,"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"AS"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" modified_at,"})]}),`
+`,e.jsx(i.span,{className:"line",children:e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" payload"})}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" region "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"="}),e.jsx(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" 'us-west-2'"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},c [...]
+`,e.jsx(i.p,{children:`The function takes no arguments and is evaluated server-side from the empty cell
+that Phoenix already maintains for every row.`}),`
+`,e.jsx(i.h2,{id:"phoenix-row-timestamp-where",children:"In WHERE predicates"}),`
+`,e.jsx(i.p,{children:`Use it to bound queries by mutation time, including incremental "what changed
+since" patterns:`}),`
+`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" *"}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" CURRENT_DATE() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shi [...]
+`,e.jsx(i.span,{className:"line"}),`
+`,e.jsx(i.span,{className:"line",children:e.jsx(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:"-- Pull a window for an incremental consumer."})}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" id, payload"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">="}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" ?"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" AND"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"<"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" ?"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"ORDER BY"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"ASC"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]})]})})}),`
+`,e.jsx(i.p,{children:`Without an index, these predicates require a scan of the table. The next section
+fixes that.`}),`
+`,e.jsx(i.h2,{id:"phoenix-row-timestamp-index",children:"Indexing on PHOENIX_ROW_TIMESTAMP()"}),`
+`,e.jsxs(i.p,{children:["Create a ",e.jsx(i.a,{href:"/docs/features/secondary-indexes#functional-indexes",children:"functional index"}),`
+on the function to make time-bounded reads fast. Phoenix can then seek directly
+on the indexed timestamp instead of scanning the data table:`]}),`
+`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ON"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events (PHOENIX_ROW_TIMESTAMP())"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" INCLUDE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" (payload);"})]}),`
+`,e.jsx(i.span,{className:"line"}),`
+`,e.jsx(i.span,{className:"line",children:e.jsx(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:"-- Phoenix uses the index for this query."})}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" id, payload"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" events"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">="}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" ?"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" AND"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"<"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" ?"})]}),`
+`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"ORDER BY"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" PHOENIX_ROW_TIMESTAMP() "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"ASC"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]})]})})}),`
+`,e.jsxs(i.p,{children:[`This is the typical recipe for "scan rows changed in the last N minutes" type
+queries on a table whose primary key isn't time-ordered. Pair with
+`,e.jsx(i.a,{href:"/docs/features/secondary-indexes#uncovered-indexes",children:"uncovered indexes"}),` when you
+don't want to duplicate payload columns into the index.`]}),`
+`,e.jsx(i.h2,{id:"phoenix-row-timestamp-vs-row-timestamp",children:"Relationship to ROW_TIMESTAMP column"}),`
+`,e.jsx(i.p,{children:'Two related concepts share the word "timestamp" — they are not the same:'}),`
+`,e.jsxs(i.table,{children:[e.jsx(i.thead,{children:e.jsxs(i.tr,{children:[e.jsx(i.th,{children:"Feature"}),e.jsx(i.th,{children:"Direction"}),e.jsx(i.th,{children:"What it does"})]})}),e.jsxs(i.tbody,{children:[e.jsxs(i.tr,{children:[e.jsx(i.td,{children:e.jsxs(i.a,{href:"/docs/features/row-timestamp-column",children:[e.jsx(i.code,{children:"ROW_TIMESTAMP"})," column"]})}),e.jsx(i.td,{children:"Write"}),e.jsxs(i.td,{children:["Designate a primary-key column whose value is ",e.jsx(i.em,{ [...]
+`,e.jsxs(i.p,{children:[e.jsx(i.code,{children:"PHOENIX_ROW_TIMESTAMP()"})," works on ",e.jsx(i.strong,{children:"any"}),` Phoenix table, regardless of whether
+you've declared a `,e.jsx(i.code,{children:"ROW_TIMESTAMP"}),` column. If you have declared one, both
+mechanisms read/write the same underlying timestamp, so `,e.jsx(i.code,{children:"PHOENIX_ROW_TIMESTAMP()"}),`
+returns the value of the `,e.jsx(i.code,{children:"ROW_TIMESTAMP"})," column for that row."]})]})}function o(n={}){const{wrapper:i}=n.components||{};return i?e.jsx(i,{...n,children:e.jsx(s,{...n})}):s(n)}export{a as _markdown,o as default,r as extractedReferences,h as frontmatter,l as structuredData,d as toc};
diff --git a/output/assets/row-timestamp-column-DntRbWJ4.js b/output/assets/row-timestamp-column-Bmd_MBbx.js
similarity index 78%
rename from output/assets/row-timestamp-column-DntRbWJ4.js
rename to output/assets/row-timestamp-column-Bmd_MBbx.js
index dae6fa96..ce096a15 100644
--- a/output/assets/row-timestamp-column-DntRbWJ4.js
+++ b/output/assets/row-timestamp-column-Bmd_MBbx.js
@@ -1,4 +1,4 @@
-import{j as e}from"./chunk-EPOLDU6W-B5LwAila.js";let a="Phoenix 4.6 provides a way to map HBase’s native row timestamp to a Phoenix column. This helps you take advantage of HBase optimizations for time ranges in store files, along with query optimizations built into Phoenix.\n\nFor a column to be designated as ROW\\_TIMESTAMP, certain constraints need to be followed:\n\n* Only a primary key column of type `TIME`, `DATE`, `TIMESTAMP`, `BIGINT`, or `UNSIGNED_LONG` can be designated as `ROW [...]
+import{j as e}from"./chunk-EPOLDU6W-B5LwAila.js";let a="Phoenix 4.6 provides a way to map HBase’s native row timestamp to a Phoenix column. This helps you take advantage of HBase optimizations for time ranges in store files, along with query optimizations built into Phoenix.\n\nFor a column to be designated as ROW\\_TIMESTAMP, certain constraints need to be followed:\n\n* Only a primary key column of type `TIME`, `DATE`, `TIMESTAMP`, `BIGINT`, or `UNSIGNED_LONG` can be designated as `ROW [...]
`,e.jsx(i.p,{children:"For a column to be designated as ROW_TIMESTAMP, certain constraints need to be followed:"}),`
`,e.jsxs(i.ul,{children:[`
`,e.jsxs(i.li,{children:["Only a primary key column of type ",e.jsx(i.code,{children:"TIME"}),", ",e.jsx(i.code,{children:"DATE"}),", ",e.jsx(i.code,{children:"TIMESTAMP"}),", ",e.jsx(i.code,{children:"BIGINT"}),", or ",e.jsx(i.code,{children:"UNSIGNED_LONG"})," can be designated as ",e.jsx(i.code,{children:"ROW_TIMESTAMP"}),"."]}),`
@@ -26,4 +26,6 @@ import{j as e}from"./chunk-EPOLDU6W-B5LwAila.js";let a="Phoenix 4.6 provides a w
`,e.jsx(e.Fragment,{children:e.jsx(i.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
`,e.jsxs(i.span,{className:"line",children:[e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" METRICS_ID, METRIC_VALUE "}),e.jsx(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" SOURCE_METRICS_TABLE"})]})]})})}),`
`,e.jsxs(i.p,{children:["This sets ",e.jsx(i.code,{children:"CREATED_DATE"})," in the destination table to the server timestamp."]}),`
-`,e.jsx(i.p,{children:"When querying with filters on the row timestamp column, Phoenix performs its usual row-key optimizations and can also set scan min/max time ranges appropriately. Using this time range information, HBase can skip store files that do not fall in the target time range, which significantly improves performance, especially for tail-end data queries."})]})}function c(s={}){const{wrapper:i}=s.components||{};return i?e.jsx(i,{...s,children:e.jsx(n,{...s})}):n(s)}export{a a [...]
+`,e.jsx(i.p,{children:"When querying with filters on the row timestamp column, Phoenix performs its usual row-key optimizations and can also set scan min/max time ranges appropriately. Using this time range information, HBase can skip store files that do not fall in the target time range, which significantly improves performance, especially for tail-end data queries."}),`
+`,e.jsx(i.h2,{id:"see-also",children:"See also"}),`
+`,e.jsxs(i.p,{children:["The ",e.jsx(i.a,{href:"/docs/features/phoenix-row-timestamp",children:e.jsx(i.code,{children:"PHOENIX_ROW_TIMESTAMP()"})})," function lets you read the underlying HBase row timestamp on any Phoenix table — even one without a declared ",e.jsx(i.code,{children:"ROW_TIMESTAMP"})," column — and is indexable for fast time-bounded queries."]})]})}function d(s={}){const{wrapper:i}=s.components||{};return i?e.jsx(i,{...s,children:e.jsx(n,{...s})}):n(s)}export{a as _markd [...]
diff --git a/output/assets/secondary-indexes-C61N-twO.js b/output/assets/secondary-indexes-CF_OyXQc.js
similarity index 86%
rename from output/assets/secondary-indexes-C61N-twO.js
rename to output/assets/secondary-indexes-CF_OyXQc.js
index 72f111e5..b7cd7887 100644
--- a/output/assets/secondary-indexes-C61N-twO.js
+++ b/output/assets/secondary-indexes-CF_OyXQc.js
@@ -101,6 +101,74 @@ FROM users
WHERE email = 'jane@example.com';
\`\`\`
+## Partial Indexes
+
+A **partial index** indexes only the rows of the data table that satisfy a SQL
+boolean predicate, supplied at \`CREATE INDEX\` time via a \`WHERE\` clause. The
+index is smaller, writes that don't affect the predicate are cheaper, and the
+planner only uses it for queries whose own predicate implies the index's. Added
+in [PHOENIX-7032](https://issues.apache.org/jira/browse/PHOENIX-7032).
+
+### When to choose a partial index
+
+Reach for a partial index when the workload reads a small, well-defined slice of
+a much larger table — and that slice is identifiable by a SQL predicate. Common
+shapes:
+
+* *Open / active records*: \`WHERE status IN ('OPEN', 'PENDING')\` on a table that
+ also stores closed records.
+* *Recent rows*: \`WHERE created_at > DATE '2024-01-01'\`.
+* *Hot tier*: \`WHERE priority >= 5\` for paging / alerting workloads.
+* *Failure investigation*: \`WHERE result = 'FAIL'\` on a successful-most-of-the-time
+ table.
+
+### Creating a partial index
+
+The DDL is a regular \`CREATE INDEX\` with a trailing \`WHERE\` clause. Both
+**covered** and **uncovered** global indexes can be partial:
+
+\`\`\`sql
+CREATE INDEX idx_open_orders
+ ON orders (customer_id, created_at)
+ INCLUDE (total_amount)
+ WHERE status IN ('OPEN', 'PENDING');
+
+CREATE UNCOVERED INDEX idx_failed_jobs
+ ON jobs (created_at)
+ WHERE result = 'FAIL';
+\`\`\`
+
+The planner uses the index for any query whose \`WHERE\` clause implies the
+index's predicate:
+
+\`\`\`sql
+-- Uses idx_open_orders (status IN ('OPEN','PENDING') is implied).
+SELECT customer_id, total_amount
+FROM orders
+WHERE status = 'OPEN' AND created_at >= ?;
+\`\`\`
+
+### Mutations that cross the predicate
+
+Partial indexes correctly maintain themselves when a mutation moves a row into
+or out of the predicate, including under \`ON DUPLICATE KEY UPDATE\`:
+
+* A row that **starts** satisfying the predicate after an update has its index
+ row created.
+* A row that **stops** satisfying the predicate after an update has its index
+ row removed.
+
+This means a partial index stays consistent for a workload like *"close an
+order"* even though that operation flips the row out of the index's covered
+slice.
+
+### Limitations
+
+* **Local partial indexes are not supported** — only global (covered or
+ uncovered) partial indexes work today.
+* The \`WHERE\` predicate is fixed at \`CREATE INDEX\` time. To change it, drop and
+ recreate the index.
+
## Index Population
By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the \`ASYNC\` keyword in the index creation DDL statement:
@@ -575,7 +643,7 @@ These older resources refer to obsolete implementations in some cases
* [Local Indexes](https://github.com/Huawei-Hadoop/hindex/blob/master/README.md#how-it-works) by Huawei
* [PHOENIX-938](https://issues.apache.org/jira/browse/PHOENIX-938) and [HBASE-11513](https://issues.apache.org/jira/browse/HBASE-11513) for deadlock prevention during global index maintenance.
* [PHOENIX-1112: Atomically rebuild index partially when index update fails](https://issues.apache.org/jira/browse/PHOENIX-1112)
-`,r={title:"Secondary Indexes",description:"Concepts, setup, consistency guarantees, and tooling for Phoenix secondary indexes."},o=[{href:"/docs/grammar#delete"},{href:"/docs/grammar#upsert-values"},{href:"/docs/grammar#upsert-select"},{href:"https://issues.apache.org/jira/browse/PHOENIX-6458"},{href:"#local-indexes"},{href:"/docs/features/salted-tables"},{href:"/docs/features/transactions"},{href:"https://en.wikipedia.org/wiki/ACID"},{href:"/docs/features/secondary-indexes#secondary-in [...]
+`,r={title:"Secondary Indexes",description:"Concepts, setup, consistency guarantees, and tooling for Phoenix secondary indexes."},o=[{href:"/docs/grammar#delete"},{href:"/docs/grammar#upsert-values"},{href:"/docs/grammar#upsert-select"},{href:"https://issues.apache.org/jira/browse/PHOENIX-6458"},{href:"#local-indexes"},{href:"https://issues.apache.org/jira/browse/PHOENIX-7032"},{href:"/docs/features/salted-tables"},{href:"/docs/features/transactions"},{href:"https://en.wikipedia.org/wiki [...]
index that is lexicographically sorted on the primary row key. Access to records in any way other than through
the primary row requires scanning over potentially all the rows in the table to test them against your filter.
With secondary indexing, the columns or expressions you index form an alternate row key to allow point lookups
@@ -601,7 +669,24 @@ that wants the payload.`},{heading:"uncovered-indexes-usage",content:`Declare an
UNCOVERED is global-only (cannot be combined with LOCAL) and cannot be combined
with INCLUDE — the whole point is to skip duplicating columns:`},{heading:"uncovered-indexes-usage",content:`The planner picks an uncovered index automatically when it's the best plan; no
hint is required. If you want to force it (e.g. to compare plans), use the
-standard index hint:`},{heading:"index-population",content:"By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the ASYNC keyword in the index creation DDL statement:"},{heading:"index-population",content:"The map reduce job that populates the index table must be kicked off separately th [...]
+standard index hint:`},{heading:"partial-indexes",content:`A partial index indexes only the rows of the data table that satisfy a SQL
+boolean predicate, supplied at CREATE INDEX time via a WHERE clause. The
+index is smaller, writes that don't affect the predicate are cheaper, and the
+planner only uses it for queries whose own predicate implies the index's. Added
+in PHOENIX-7032.`},{heading:"partial-indexes-when",content:`Reach for a partial index when the workload reads a small, well-defined slice of
+a much larger table — and that slice is identifiable by a SQL predicate. Common
+shapes:`},{heading:"partial-indexes-when",content:`Open / active records: WHERE status IN ('OPEN', 'PENDING') on a table that
+also stores closed records.`},{heading:"partial-indexes-when",content:"Recent rows: WHERE created_at > DATE '2024-01-01'."},{heading:"partial-indexes-when",content:"Hot tier: WHERE priority >= 5 for paging / alerting workloads."},{heading:"partial-indexes-when",content:`Failure investigation: WHERE result = 'FAIL' on a successful-most-of-the-time
+table.`},{heading:"partial-indexes-usage",content:`The DDL is a regular CREATE INDEX with a trailing WHERE clause. Both
+covered and uncovered global indexes can be partial:`},{heading:"partial-indexes-usage",content:`The planner uses the index for any query whose WHERE clause implies the
+index's predicate:`},{heading:"partial-indexes-mutations",content:`Partial indexes correctly maintain themselves when a mutation moves a row into
+or out of the predicate, including under ON DUPLICATE KEY UPDATE:`},{heading:"partial-indexes-mutations",content:`A row that starts satisfying the predicate after an update has its index
+row created.`},{heading:"partial-indexes-mutations",content:`A row that stops satisfying the predicate after an update has its index
+row removed.`},{heading:"partial-indexes-mutations",content:`This means a partial index stays consistent for a workload like "close an
+order" even though that operation flips the row out of the index's covered
+slice.`},{heading:"partial-indexes-limitations",content:`Local partial indexes are not supported — only global (covered or
+uncovered) partial indexes work today.`},{heading:"partial-indexes-limitations",content:`The WHERE predicate is fixed at CREATE INDEX time. To change it, drop and
+recreate the index.`},{heading:"index-population",content:"By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the ASYNC keyword in the index creation DDL statement:"},{heading:"index-population",content:"The map reduce job that populates the index table must be kicked off separately thr [...]
primary table. In other words, index updates are synchronous with the same strong consistency guarantees provided by HBase.`},{heading:"consistency-guarantees",content:`However, since indexes are stored in separate tables than the data table, depending on the properties of the table and the
type of index, the consistency between your table and index varies in the event that a commit fails due to a server-side
crash. This is an important design consideration driven by your requirements and use case.`},{heading:"consistency-guarantees",content:"Outlined below are the different options with various levels of consistency guarantees."},{heading:"local-indexes-1",content:"Since Phoenix 4.8 local indexes are always guaranteed to be consistent."},{heading:"global-indexes-on-transactional-tables",content:`By declaring your table as transactional, you achieve the highest level of consistency guarantee
@@ -658,7 +743,7 @@ query results from that index table.`},{heading:"bulkload-tool-limitation",conte
drop and re-create all index tables after the data table is loaded. Re-creating the index with the ASYNC option and
using IndexTool to populate and enable that index is likely a must for tables of non-trivial size.`},{heading:"bulkload-tool-limitation",content:`To perform incremental loading of CSV datasets that do not require any manual index intervention, the psql tool can
be used in place of the BulkLoadTools. Additionally, a MapReduce job could be written to parse CSV/JSON data and write
-it directly to Phoenix; although, such a tool is not currently provided by Phoenix for users.`},{heading:"setup",content:"Non transactional, mutable indexing requires special configuration options on the region server and master to run - Phoenix ensures that they are setup correctly when you enable mutable indexing on the table; if the correct properties are not set, you will not be able to use secondary indexing. After adding these settings to your hbase-site.xml, you'll need to do a ro [...]
+it directly to Phoenix; although, such a tool is not currently provided by Phoenix for users.`},{heading:"setup",content:"Non transactional, mutable indexing requires special configuration options on the region server and master to run - Phoenix ensures that they are setup correctly when you enable mutable indexing on the table; if the correct properties are not set, you will not be able to use secondary indexing. After adding these settings to your hbase-site.xml, you'll need to do a ro [...]
index that is lexicographically sorted on the primary row key. Access to records in any way other than through
the primary row requires scanning over potentially all the rows in the table to test them against your filter.
With secondary indexing, the columns or expressions you index form an alternate row key to allow point lookups
@@ -720,6 +805,60 @@ standard index hint:`}),`
`,e.jsx(e.Fragment,{children:e.jsx(n.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
`,e.jsxs(n.span,{className:"line",children:[e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" users"})]}),`
`,e.jsxs(n.span,{className:"line",children:[e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" email "}),e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"="}),e.jsx(n.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" 'jane@example.com'"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4 [...]
+`,e.jsx(n.h2,{id:"partial-indexes",children:"Partial Indexes"}),`
+`,e.jsxs(n.p,{children:["A ",e.jsx(n.strong,{children:"partial index"}),` indexes only the rows of the data table that satisfy a SQL
+boolean predicate, supplied at `,e.jsx(n.code,{children:"CREATE INDEX"})," time via a ",e.jsx(n.code,{children:"WHERE"}),` clause. The
+index is smaller, writes that don't affect the predicate are cheaper, and the
+planner only uses it for queries whose own predicate implies the index's. Added
+in `,e.jsx(n.a,{href:"https://issues.apache.org/jira/browse/PHOENIX-7032",children:"PHOENIX-7032"}),"."]}),`
+`,e.jsx(n.h3,{id:"partial-indexes-when",children:"When to choose a partial index"}),`
+`,e.jsx(n.p,{children:`Reach for a partial index when the workload reads a small, well-defined slice of
+a much larger table — and that slice is identifiable by a SQL predicate. Common
+shapes:`}),`
+`,e.jsxs(n.ul,{children:[`
+`,e.jsxs(n.li,{children:[e.jsx(n.em,{children:"Open / active records"}),": ",e.jsx(n.code,{children:"WHERE status IN ('OPEN', 'PENDING')"}),` on a table that
+also stores closed records.`]}),`
+`,e.jsxs(n.li,{children:[e.jsx(n.em,{children:"Recent rows"}),": ",e.jsx(n.code,{children:"WHERE created_at > DATE '2024-01-01'"}),"."]}),`
+`,e.jsxs(n.li,{children:[e.jsx(n.em,{children:"Hot tier"}),": ",e.jsx(n.code,{children:"WHERE priority >= 5"})," for paging / alerting workloads."]}),`
+`,e.jsxs(n.li,{children:[e.jsx(n.em,{children:"Failure investigation"}),": ",e.jsx(n.code,{children:"WHERE result = 'FAIL'"}),` on a successful-most-of-the-time
+table.`]}),`
+`]}),`
+`,e.jsx(n.h3,{id:"partial-indexes-usage",children:"Creating a partial index"}),`
+`,e.jsxs(n.p,{children:["The DDL is a regular ",e.jsx(n.code,{children:"CREATE INDEX"})," with a trailing ",e.jsx(n.code,{children:"WHERE"}),` clause. Both
+`,e.jsx(n.strong,{children:"covered"})," and ",e.jsx(n.strong,{children:"uncovered"})," global indexes can be partial:"]}),`
+`,e.jsx(e.Fragment,{children:e.jsx(n.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
+`,e.jsxs(n.span,{className:"line",children:[e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ON"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" orders (customer_id, created_at)"})]}),`
+`,e.jsxs(n.span,{className:"line",children:[e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" INCLUDE"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" (total_amount)"})]}),`
+`,e.jsxs(n.span,{className:"line",children:[e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" WHERE"}),e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" status"}),e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" IN"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" ("}),e.jsx(n.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},childr [...]
+`,e.jsx(n.span,{className:"line"}),`
+`,e.jsxs(n.span,{className:"line",children:[e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"CREATE"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" UNCOVERED "}),e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"INDEX"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" idx_failed_jobs"})]}),`
+`,e.jsxs(n.span,{className:"line",children:[e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ON"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" jobs (created_at)"})]}),`
+`,e.jsxs(n.span,{className:"line",children:[e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" WHERE"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" result "}),e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"="}),e.jsx(n.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" 'FAIL'"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},ch [...]
+`,e.jsxs(n.p,{children:["The planner uses the index for any query whose ",e.jsx(n.code,{children:"WHERE"}),` clause implies the
+index's predicate:`]}),`
+`,e.jsx(e.Fragment,{children:e.jsx(n.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
+`,e.jsxs(n.span,{className:"line",children:[e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SELECT"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" customer_id, total_amount"})]}),`
+`,e.jsxs(n.span,{className:"line",children:[e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"FROM"}),e.jsx(n.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" orders"})]}),`
+`,e.jsxs(n.span,{className:"line",children:[e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WHERE"}),e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" status"}),e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" ="}),e.jsx(n.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" 'OPEN'"}),e.jsx(n.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},childr [...]
+`,e.jsx(n.h3,{id:"partial-indexes-mutations",children:"Mutations that cross the predicate"}),`
+`,e.jsxs(n.p,{children:[`Partial indexes correctly maintain themselves when a mutation moves a row into
+or out of the predicate, including under `,e.jsx(n.code,{children:"ON DUPLICATE KEY UPDATE"}),":"]}),`
+`,e.jsxs(n.ul,{children:[`
+`,e.jsxs(n.li,{children:["A row that ",e.jsx(n.strong,{children:"starts"}),` satisfying the predicate after an update has its index
+row created.`]}),`
+`,e.jsxs(n.li,{children:["A row that ",e.jsx(n.strong,{children:"stops"}),` satisfying the predicate after an update has its index
+row removed.`]}),`
+`]}),`
+`,e.jsxs(n.p,{children:["This means a partial index stays consistent for a workload like ",e.jsx(n.em,{children:`"close an
+order"`}),` even though that operation flips the row out of the index's covered
+slice.`]}),`
+`,e.jsx(n.h3,{id:"partial-indexes-limitations",children:"Limitations"}),`
+`,e.jsxs(n.ul,{children:[`
+`,e.jsxs(n.li,{children:[e.jsx(n.strong,{children:"Local partial indexes are not supported"}),` — only global (covered or
+uncovered) partial indexes work today.`]}),`
+`,e.jsxs(n.li,{children:["The ",e.jsx(n.code,{children:"WHERE"})," predicate is fixed at ",e.jsx(n.code,{children:"CREATE INDEX"}),` time. To change it, drop and
+recreate the index.`]}),`
+`]}),`
`,e.jsx(n.h2,{id:"index-population",children:"Index Population"}),`
`,e.jsxs(n.p,{children:["By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the ",e.jsx(n.code,{children:"ASYNC"})," keyword in the index creation DDL statement:"]}),`
`,e.jsx(e.Fragment,{children:e.jsx(n.pre,{className:"shiki shiki-themes github-light github-dark",style:{"--shiki-light":"#24292e","--shiki-dark":"#e1e4e8","--shiki-light-bg":"#fff","--shiki-dark-bg":"#24292e"},tabIndex:"0",icon:'<svg viewBox="0 0 24 24"><path d="M 6,1 C 4.354992,1 3,2.354992 3,4 v 16 c 0,1.645008 1.354992,3 3,3 h 12 c 1.645008,0 3,-1.354992 3,-3 V 8 7 A 1.0001,1.0001 0 0 0 20.707031,6.2929687 l -5,-5 A 1.0001,1.0001 0 0 0 15,1 h -1 z m 0,2 h 7 v 3 c 0,1.645008 1.354992, [...]
diff --git a/output/books/apache-phoenix-reference-guide-dark-mode.pdf b/output/books/apache-phoenix-reference-guide-dark-mode.pdf
index 9ca215c5..6f7faf54 100644
Binary files a/output/books/apache-phoenix-reference-guide-dark-mode.pdf and b/output/books/apache-phoenix-reference-guide-dark-mode.pdf differ
diff --git a/output/books/apache-phoenix-reference-guide.pdf b/output/books/apache-phoenix-reference-guide.pdf
index cdca37c8..62cf86cc 100644
Binary files a/output/books/apache-phoenix-reference-guide.pdf and b/output/books/apache-phoenix-reference-guide.pdf differ
diff --git a/output/docs.data b/output/docs.data
index 5a0e7b63..1ee89f51 100644
--- a/output/docs.data
+++ b/output/docs.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/index.mdx","url","/docs","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_37":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,40,47,54,61,64,113,281,335,369,398,401,407,413,419,425,431,437,443,449, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/index.mdx","url","/docs","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_37":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,40,47,54,61,64,113,287,341,375,404,407,413,419,425,431,437,443,449,455, [...]
diff --git a/output/docs/addons/phoenix-omid-transaction-manager.data b/output/docs/addons/phoenix-omid-transaction-manager.data
index ead02ed2..ef1aa7a7 100644
--- a/output/docs/addons/phoenix-omid-transaction-manager.data
+++ b/output/docs/addons/phoenix-omid-transaction-manager.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/addons/phoenix-omid-transaction-manager.mdx","url","/docs/addons/phoenix-omid-transaction-manager","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/addons/phoenix-omid-transaction-manager.mdx","url","/docs/addons/phoenix-omid-transaction-manager","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28, [...]
diff --git a/output/docs/addons/phoenix-omid-transaction-manager/index.html b/output/docs/addons/phoenix-omid-transaction-manager/index.html
index fdad2632..3279371b 100644
--- a/output/docs/addons/phoenix-omid-transaction-manager/index.html
+++ b/output/docs/addons/phoenix-omid-transaction-manager/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -31,11 +31,11 @@ for more information about this effort.</p></div><a href="https://github.com/apa
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/addons/phoenix-omid-transaction-manager.mdx\",\"url\",\"/docs/addons/phoenix-omid-transaction-manager\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_2 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/addons/phoenix-omid-transaction-manager.mdx\",\"url\",\"/docs/addons/phoenix-omid-transaction-manager\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_2 [...]
\ No newline at end of file
diff --git a/output/docs/addons/phoenix-orm-library.data b/output/docs/addons/phoenix-orm-library.data
index c8f30000..a78a09c7 100644
--- a/output/docs/addons/phoenix-orm-library.data
+++ b/output/docs/addons/phoenix-orm-library.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/addons/phoenix-orm-library.mdx","url","/docs/addons/phoenix-orm-library","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/addons/phoenix-orm-library.mdx","url","/docs/addons/phoenix-orm-library","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289, [...]
diff --git a/output/docs/addons/phoenix-orm-library/index.html b/output/docs/addons/phoenix-orm-library/index.html
index 53f08625..d9c24eef 100644
--- a/output/docs/addons/phoenix-orm-library/index.html
+++ b/output/docs/addons/phoenix-orm-library/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/pho-CUhmhcBP.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/ [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/pho-CUhmhcBP.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/ [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -191,11 +191,11 @@ Custom <code>EntityResolvers</code> and <code>PropertyResolvers</code> are strai
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/addons/phoenix-orm-library.mdx\",\"url\",\"/docs/addons/phoenix-orm-library\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/addons/phoenix-orm-library.mdx\",\"url\",\"/docs/addons/phoenix-orm-library\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
diff --git a/output/docs/addons/phoenix-tephra-transaction-manager.data b/output/docs/addons/phoenix-tephra-transaction-manager.data
index b83d8d46..eb491615 100644
--- a/output/docs/addons/phoenix-tephra-transaction-manager.data
+++ b/output/docs/addons/phoenix-tephra-transaction-manager.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/addons/phoenix-tephra-transaction-manager.mdx","url","/docs/addons/phoenix-tephra-transaction-manager","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index", [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/addons/phoenix-tephra-transaction-manager.mdx","url","/docs/addons/phoenix-tephra-transaction-manager","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index", [...]
diff --git a/output/docs/addons/phoenix-tephra-transaction-manager/index.html b/output/docs/addons/phoenix-tephra-transaction-manager/index.html
index 174cdaba..b21e97b0 100644
--- a/output/docs/addons/phoenix-tephra-transaction-manager/index.html
+++ b/output/docs/addons/phoenix-tephra-transaction-manager/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -31,11 +31,11 @@ for more information about this effort.</p></div><a href="https://github.com/apa
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/addons/phoenix-tephra-transaction-manager.mdx\",\"url\",\"/docs/addons/phoenix-tephra-transaction-manager\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20, [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/addons/phoenix-tephra-transaction-manager.mdx\",\"url\",\"/docs/addons/phoenix-tephra-transaction-manager\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20, [...]
\ No newline at end of file
diff --git a/output/docs/array-type.data b/output/docs/array-type.data
index cb3ea95d..a75c763a 100644
--- a/output/docs/array-type.data
+++ b/output/docs/array-type.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/array-type.mdx","url","/docs/array-type","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,337,371,400,403,409,415,421,425, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/array-type.mdx","url","/docs/array-type","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,343,377,406,409,415,421,427,431, [...]
diff --git a/output/docs/array-type/index.html b/output/docs/array-type/index.html
index 81035540..af098ed8 100644
--- a/output/docs/array-type/index.html
+++ b/output/docs/array-type/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -72,11 +72,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/array-type.mdx\",\"url\",\"/docs/array-type\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/array-type.mdx\",\"url\",\"/docs/array-type\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\" [...]
\ No newline at end of file
diff --git a/output/docs/contributing.data b/output/docs/contributing.data
index c5ba85e6..6112cd4f 100644
--- a/output/docs/contributing.data
+++ b/output/docs/contributing.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/contributing/index.mdx","url","/docs/contributing","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,337,371,398,401,407,41 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/contributing/index.mdx","url","/docs/contributing","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,343,377,404,407,413,41 [...]
diff --git a/output/docs/contributing/building-website.data b/output/docs/contributing/building-website.data
index caecd45f..df01923a 100644
--- a/output/docs/contributing/building-website.data
+++ b/output/docs/contributing/building-website.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/contributing/building-website.mdx","url","/docs/contributing/building-website","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,11 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/contributing/building-website.mdx","url","/docs/contributing/building-website","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,11 [...]
diff --git a/output/docs/contributing/building-website/index.html b/output/docs/contributing/building-website/index.html
index 3aee1789..98cc3a6d 100644
--- a/output/docs/contributing/building-website/index.html
+++ b/output/docs/contributing/building-website/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -74,11 +74,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/contributing/building-website.mdx\",\"url\",\"/docs/contributing/building-website\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/contributing/building-website.mdx\",\"url\",\"/docs/contributing/building-website\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\" [...]
\ No newline at end of file
diff --git a/output/docs/contributing/develop.data b/output/docs/contributing/develop.data
index 29699ae8..4ac25b84 100644
--- a/output/docs/contributing/develop.data
+++ b/output/docs/contributing/develop.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/contributing/develop.mdx","url","/docs/contributing/develop","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,337,371,398, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/contributing/develop.mdx","url","/docs/contributing/develop","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,343,377,404, [...]
diff --git a/output/docs/contributing/develop/index.html b/output/docs/contributing/develop/index.html
index 20000880..59c0b6d5 100644
--- a/output/docs/contributing/develop/index.html
+++ b/output/docs/contributing/develop/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -286,11 +286,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/contributing/develop.mdx\",\"url\",\"/docs/contributing/develop\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":2 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/contributing/develop.mdx\",\"url\",\"/docs/contributing/develop\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":2 [...]
\ No newline at end of file
diff --git a/output/docs/contributing/how-to-release.data b/output/docs/contributing/how-to-release.data
index 75a3fe39..b9cbcaf3 100644
--- a/output/docs/contributing/how-to-release.data
+++ b/output/docs/contributing/how-to-release.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/contributing/how-to-release.mdx","url","/docs/contributing/how-to-release","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,28 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/contributing/how-to-release.mdx","url","/docs/contributing/how-to-release","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,28 [...]
diff --git a/output/docs/contributing/how-to-release/index.html b/output/docs/contributing/how-to-release/index.html
index 72751848..34f32152 100644
--- a/output/docs/contributing/how-to-release/index.html
+++ b/output/docs/contributing/how-to-release/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -149,11 +149,11 @@ To avoid this, <a href="https://central.sonatype.org/publish/release/#locate-and
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/contributing/how-to-release.mdx\",\"url\",\"/docs/contributing/how-to-release\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/contributing/how-to-release.mdx\",\"url\",\"/docs/contributing/how-to-release\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\ [...]
\ No newline at end of file
diff --git a/output/docs/contributing/index.html b/output/docs/contributing/index.html
index 44a5ab09..0d2fd4b3 100644
--- a/output/docs/contributing/index.html
+++ b/output/docs/contributing/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -86,11 +86,11 @@ Tephra and Omid also have their own <a href="/issues-tracking" data-discover="tr
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/contributing/index.mdx\",\"url\",\"/docs/contributing\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\": [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/contributing/index.mdx\",\"url\",\"/docs/contributing\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\": [...]
\ No newline at end of file
diff --git a/output/docs/datatypes.data b/output/docs/datatypes.data
index df4800c8..8ad526df 100644
--- a/output/docs/datatypes.data
+++ b/output/docs/datatypes.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/datatypes.mdx","url","/docs/datatypes","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,337,371,400,403,409,415,419,425,43 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/datatypes.mdx","url","/docs/datatypes","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,343,377,406,409,415,421,425,431,43 [...]
diff --git a/output/docs/datatypes/index.html b/output/docs/datatypes/index.html
index d90f576f..624fd0dd 100644
--- a/output/docs/datatypes/index.html
+++ b/output/docs/datatypes/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -773,11 +773,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/datatypes.mdx\",\"url\",\"/docs/datatypes\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":2 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/datatypes.mdx\",\"url\",\"/docs/datatypes\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":2 [...]
\ No newline at end of file
diff --git a/output/docs/explain-plan.data b/output/docs/explain-plan.data
index 7c523f1a..79835871 100644
--- a/output/docs/explain-plan.data
+++ b/output/docs/explain-plan.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/explain-plan.mdx","url","/docs/explain-plan","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,337,371,400,403,409,415,421, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/explain-plan.mdx","url","/docs/explain-plan","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,343,377,406,409,415,421,427, [...]
diff --git a/output/docs/explain-plan/index.html b/output/docs/explain-plan/index.html
index e65adc45..f265510d 100644
--- a/output/docs/explain-plan/index.html
+++ b/output/docs/explain-plan/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -104,11 +104,11 @@ Phoenix cannot provide the estimate information, the columns return null. Below
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/explain-plan.mdx\",\"url\",\"/docs/explain-plan\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/explain-plan.mdx\",\"url\",\"/docs/explain-plan\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_ [...]
\ No newline at end of file
diff --git a/output/docs/faq.data b/output/docs/faq.data
index 825763b0..1d922041 100644
--- a/output/docs/faq.data
+++ b/output/docs/faq.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/faq.mdx","url","/docs/faq","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,61,64,113,281,335,369,398,401,407,413,419,425,431,437,443,44 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/faq.mdx","url","/docs/faq","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,61,64,113,287,341,375,404,407,413,419,425,431,437,443,449,45 [...]
diff --git a/output/docs/faq/index.html b/output/docs/faq/index.html
index 4d7a1fbc..adc5bab3 100644
--- a/output/docs/faq/index.html
+++ b/output/docs/faq/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -271,11 +271,11 @@ for all non-key columns) will be included in a scan result.</p></div><a href="ht
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/faq.mdx\",\"url\",\"/docs/faq\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":27,\"_11\":45 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/faq.mdx\",\"url\",\"/docs/faq\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":27,\"_11\":46 [...]
\ No newline at end of file
diff --git a/output/docs/features/atomic-upsert.data b/output/docs/features/atomic-upsert.data
index 3706bd31..39de361b 100644
--- a/output/docs/features/atomic-upsert.data
+++ b/output/docs/features/atomic-upsert.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/atomic-upsert.mdx","url","/docs/features/atomic-upsert","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/atomic-upsert.mdx","url","/docs/features/atomic-upsert","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375, [...]
diff --git a/output/docs/features/atomic-upsert/index.html b/output/docs/features/atomic-upsert/index.html
index 7d20a5eb..1e418636 100644
--- a/output/docs/features/atomic-upsert/index.html
+++ b/output/docs/features/atomic-upsert/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
incorporated into the <code>UPSERT VALUES</code> command as of Phoenix 4.9. The general syntax is described
<a href="/docs/grammar#upsert-values" data-discover="true">here</a>. This feature provides a superset of the HBase <code>Increment</code> and
<code>CheckAndPut</code> functionality to enable atomic upserts. On the server-side, when the commit
@@ -108,7 +108,6 @@ existing rows.</li>
does not handle atomicity unless the latest value is being updated.</li>
<li>The same column should not be updated more than once in the same statement.</li>
<li>No aggregation or references to sequences are allowed within the clause.</li>
-<li>Global indexes on columns being atomically updated are not supported, as potentially a separate RPC across the wire would be made while the row is under lock to maintain the secondary index.</li>
</ul></div><a href="https://github.com/apache/phoenix-site/edit/asf-site//app/pages/_docs/docs/_mdx/(multi-page)/features/atomic-upsert.mdx" rel="noreferrer noopener" target="_blank" class="no-print text-fd-secondary-foreground bg-fd-secondary hover:text-fd-accent-foreground hover:bg-fd-accent w-fit rounded-xl border p-2 text-sm font-medium transition-colors">Edit on GitHub</a><div class="@container grid gap-4 grid-cols-2"><a class="hover:bg-fd-accent/80 hover:text-fd-accent-foreground f [...]
if (!window.history.state || !window.history.state.key) {
let key = Math.random().toString(32).slice(2);
@@ -124,11 +123,11 @@ does not handle atomicity unless the latest value is being updated.</li>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/atomic-upsert.mdx\",\"url\",\"/docs/features/atomic-upsert\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/atomic-upsert.mdx\",\"url\",\"/docs/features/atomic-upsert\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24 [...]
\ No newline at end of file
diff --git a/output/docs/features/bson.data b/output/docs/features/bson.data
index 21fe0dc1..ab40c9fd 100644
--- a/output/docs/features/bson.data
+++ b/output/docs/features/bson.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/bson.mdx","url","/docs/features/bson","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,398,401,407,413,41 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/bson.mdx","url","/docs/features/bson","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,404,407,413,419,42 [...]
diff --git a/output/docs/features/bson/index.html b/output/docs/features/bson/index.html
index 19aa5ef8..4edfab24 100644
--- a/output/docs/features/bson/index.html
+++ b/output/docs/features/bson/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
relational columns. Documents are stored in <a href="https://bsonspec.org/">Binary JSON</a> — a
compact, length-prefixed format that is cheap to parse server-side and supports the
full set of value types (strings, numbers, dates, binary, booleans, nulls, arrays,
@@ -200,11 +200,11 @@ you'll typically want an index per hot field rather than a generic "BS
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/bson.mdx\",\"url\",\"/docs/features/bson\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/bson.mdx\",\"url\",\"/docs/features/bson\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\ [...]
\ No newline at end of file
diff --git a/output/docs/features/bulk-loading.data b/output/docs/features/bulk-loading.data
index 95f2040a..f34d8db9 100644
--- a/output/docs/features/bulk-loading.data
+++ b/output/docs/features/bulk-loading.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/bulk-loading.mdx","url","/docs/features/bulk-loading","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,39 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/bulk-loading.mdx","url","/docs/features/bulk-loading","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,40 [...]
diff --git a/output/docs/features/bulk-loading/index.html b/output/docs/features/bulk-loading/index.html
index 9aae4f3a..b08128e8 100644
--- a/output/docs/features/bulk-loading/index.html
+++ b/output/docs/features/bulk-loading/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<ul>
<li>Single-threaded client loading tool for CSV-formatted data via the <a href="/docs/installation#loading-data" data-discover="true">psql</a> command</li>
<li>MapReduce-based bulk load tool for CSV and JSON-formatted data</li>
@@ -100,11 +100,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/bulk-loading.mdx\",\"url\",\"/docs/features/bulk-loading\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/bulk-loading.mdx\",\"url\",\"/docs/features/bulk-loading\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\" [...]
\ No newline at end of file
diff --git a/output/docs/features/change-data-capture.data b/output/docs/features/change-data-capture.data
index f424abe7..fa4fab54 100644
--- a/output/docs/features/change-data-capture.data
+++ b/output/docs/features/change-data-capture.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/change-data-capture.mdx","url","/docs/features/change-data-capture","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/change-data-capture.mdx","url","/docs/features/change-data-capture","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115, [...]
diff --git a/output/docs/features/change-data-capture/index.html b/output/docs/features/change-data-capture/index.html
index 205aae43..dd2f7d7f 100644
--- a/output/docs/features/change-data-capture/index.html
+++ b/output/docs/features/change-data-capture/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
downstream consumers can read using regular SQL. Once enabled, a CDC object behaves
like a queryable Phoenix table: every insert, update, and delete on the underlying
data table produces a row containing the affected primary key, an event timestamp,
@@ -185,11 +185,11 @@ their offsets cleanly.</li>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/change-data-capture.mdx\",\"url\",\"/docs/features/change-data-capture\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_2 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/change-data-capture.mdx\",\"url\",\"/docs/features/change-data-capture\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_2 [...]
\ No newline at end of file
diff --git a/output/docs/features/conditional-ttl.data b/output/docs/features/conditional-ttl.data
index a0a1a3ab..ae6043f9 100644
--- a/output/docs/features/conditional-ttl.data
+++ b/output/docs/features/conditional-ttl.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/conditional-ttl.mdx","url","/docs/features/conditional-ttl","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/conditional-ttl.mdx","url","/docs/features/conditional-ttl","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341, [...]
diff --git a/output/docs/features/conditional-ttl/index.html b/output/docs/features/conditional-ttl/index.html
index 1af24623..b8d403f4 100644
--- a/output/docs/features/conditional-ttl/index.html
+++ b/output/docs/features/conditional-ttl/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
evaluated against the row's own column values</strong>, instead of a fixed time-since-write
number. A row is considered expired the moment the expression evaluates to <code>TRUE</code> for
that row. Available in Phoenix 5.3.0
@@ -87,11 +87,11 @@ at once.</li>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/conditional-ttl.mdx\",\"url\",\"/docs/features/conditional-ttl\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/conditional-ttl.mdx\",\"url\",\"/docs/features/conditional-ttl\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\ [...]
\ No newline at end of file
diff --git a/output/docs/features/cursor.data b/output/docs/features/cursor.data
index e4a00546..a103fcb6 100644
--- a/output/docs/features/cursor.data
+++ b/output/docs/features/cursor.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/cursor.mdx","url","/docs/features/cursor","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,398,401,407,41 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/cursor.mdx","url","/docs/features/cursor","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,404,407,413,41 [...]
diff --git a/output/docs/features/cursor/index.html b/output/docs/features/cursor/index.html
index bf77b251..53f93f4e 100644
--- a/output/docs/features/cursor/index.html
+++ b/output/docs/features/cursor/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="using-a-cursor"><a data-card="" href="#using-a-cursor" class="peer">Using a cursor</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3 [...]
<ol>
<li>
@@ -60,11 +60,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/cursor.mdx\",\"url\",\"/docs/features/cursor\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\": [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/cursor.mdx\",\"url\",\"/docs/features/cursor\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\": [...]
\ No newline at end of file
diff --git a/output/docs/features/dynamic-columns.data b/output/docs/features/dynamic-columns.data
index e5d2193a..ff7b8bb8 100644
--- a/output/docs/features/dynamic-columns.data
+++ b/output/docs/features/dynamic-columns.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/dynamic-columns.mdx","url","/docs/features/dynamic-columns","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/dynamic-columns.mdx","url","/docs/features/dynamic-columns","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341, [...]
diff --git a/output/docs/features/dynamic-columns/index.html b/output/docs/features/dynamic-columns/index.html
index d17878fc..5aacf69e 100644
--- a/output/docs/features/dynamic-columns/index.html
+++ b/output/docs/features/dynamic-columns/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<p class="wrap-anywhere">For example:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> EventLog(lastGCTime </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">TIME</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, usedMemory </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">BIGINT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, maxMemory </span><span style="--shiki-light:#D [...]
@@ -50,11 +50,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/dynamic-columns.mdx\",\"url\",\"/docs/features/dynamic-columns\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/dynamic-columns.mdx\",\"url\",\"/docs/features/dynamic-columns\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\ [...]
\ No newline at end of file
diff --git a/output/docs/features/metrics.data b/output/docs/features/metrics.data
index 97c6a63e..c0543c6e 100644
--- a/output/docs/features/metrics.data
+++ b/output/docs/features/metrics.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/metrics.mdx","url","/docs/features/metrics","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,398,401,407, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/metrics.mdx","url","/docs/features/metrics","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,404,407,413, [...]
diff --git a/output/docs/features/metrics/index.html b/output/docs/features/metrics/index.html
index 041cbeff..01b14f01 100644
--- a/output/docs/features/metrics/index.html
+++ b/output/docs/features/metrics/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<ul>
<li><strong>Request level metrics</strong> - collected at an individual SQL statement level</li>
<li><strong>Global metrics</strong> - collected at the client JVM level</li>
@@ -124,11 +124,11 @@ Below is a code snippet showing how to log/report global metrics by using a sche
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/metrics.mdx\",\"url\",\"/docs/features/metrics\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/metrics.mdx\",\"url\",\"/docs/features/metrics\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\ [...]
\ No newline at end of file
diff --git a/output/docs/features/multi-tenancy.data b/output/docs/features/multi-tenancy.data
index 90031d6b..f831ed5c 100644
--- a/output/docs/features/multi-tenancy.data
+++ b/output/docs/features/multi-tenancy.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/multi-tenancy.mdx","url","/docs/features/multi-tenancy","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/multi-tenancy.mdx","url","/docs/features/multi-tenancy","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375, [...]
diff --git a/output/docs/features/multi-tenancy/index.html b/output/docs/features/multi-tenancy/index.html
index 93b6198a..d47a26a0 100644
--- a/output/docs/features/multi-tenancy/index.html
+++ b/output/docs/features/multi-tenancy/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<ul>
<li>Multi-tenancy in Phoenix works via a combination of multi-tenant tables and tenant-specific connections (detailed below).</li>
<li>Tenants open tenant-specific connections to Phoenix. These connections can only access data that belongs to the tenant.</li>
@@ -65,11 +65,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/multi-tenancy.mdx\",\"url\",\"/docs/features/multi-tenancy\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/multi-tenancy.mdx\",\"url\",\"/docs/features/multi-tenancy\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24 [...]
\ No newline at end of file
diff --git a/output/docs/features/namespace-mapping.data b/output/docs/features/namespace-mapping.data
index cd7546e3..1ecd5fad 100644
--- a/output/docs/features/namespace-mapping.data
+++ b/output/docs/features/namespace-mapping.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/namespace-mapping.mdx","url","/docs/features/namespace-mapping","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/namespace-mapping.mdx","url","/docs/features/namespace-mapping","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287, [...]
diff --git a/output/docs/features/namespace-mapping/index.html b/output/docs/features/namespace-mapping/index.html
index 3385659a..265870d5 100644
--- a/output/docs/features/namespace-mapping/index.html
+++ b/output/docs/features/namespace-mapping/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<p class="wrap-anywhere">Earlier, every table (with or without schema) was created in the default namespace.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="namespace-mapping-configuration"><a data-card="" href="#namespace-mapping-configuration" class="peer">Configuration</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><p [...]
<p class="wrap-anywhere">Parameters to enable namespace mapping:</p>
@@ -75,11 +75,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/namespace-mapping.mdx\",\"url\",\"/docs/features/namespace-mapping\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/namespace-mapping.mdx\",\"url\",\"/docs/features/namespace-mapping\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
diff --git a/output/docs/features/paged-queries.data b/output/docs/features/paged-queries.data
index 0818c6c4..a49632a2 100644
--- a/output/docs/features/paged-queries.data
+++ b/output/docs/features/paged-queries.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/paged-queries.mdx","url","/docs/features/paged-queries","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/paged-queries.mdx","url","/docs/features/paged-queries","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375, [...]
diff --git a/output/docs/features/paged-queries/index.html b/output/docs/features/paged-queries/index.html
index ea353232..f98d96b9 100644
--- a/output/docs/features/paged-queries/index.html
+++ b/output/docs/features/paged-queries/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<ul>
<li>Row Value Constructors (RVC)</li>
<li><code>OFFSET</code> with <code>LIMIT</code></li>
@@ -49,7 +49,7 @@
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> published_date </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2010</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ORDER BY</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> title, author, isbn</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">LIMIT</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> OFFSET </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span></span></code></pre></div></figure>
-<p class="wrap-anywhere"><code>OFFSET</code> reads and skips rows on either the server or client depending on query type, whereas RVC is more effective for queries on the primary key axis because it can start directly from the provided key.</p></div><a href="https://github.com/apache/phoenix-site/edit/asf-site//app/pages/_docs/docs/_mdx/(multi-page)/features/paged-queries.mdx" rel="noreferrer noopener" target="_blank" class="no-print text-fd-secondary-foreground bg-fd-secondary hover:tex [...]
+<p class="wrap-anywhere"><code>OFFSET</code> reads and skips rows on either the server or client depending on query type, whereas RVC is more effective for queries on the primary key axis because it can start directly from the provided key.</p></div><a href="https://github.com/apache/phoenix-site/edit/asf-site//app/pages/_docs/docs/_mdx/(multi-page)/features/paged-queries.mdx" rel="noreferrer noopener" target="_blank" class="no-print text-fd-secondary-foreground bg-fd-secondary hover:tex [...]
if (!window.history.state || !window.history.state.key) {
let key = Math.random().toString(32).slice(2);
window.history.replaceState({ key }, "");
@@ -64,11 +64,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/paged-queries.mdx\",\"url\",\"/docs/features/paged-queries\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/paged-queries.mdx\",\"url\",\"/docs/features/paged-queries\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24 [...]
\ No newline at end of file
diff --git a/output/docs/features/phoenix-row-timestamp.data b/output/docs/features/phoenix-row-timestamp.data
new file mode 100644
index 00000000..ebeebcc4
--- /dev/null
+++ b/output/docs/features/phoenix-row-timestamp.data
@@ -0,0 +1 @@
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/phoenix-row-timestamp.mdx","url","/docs/features/phoenix-row-timestamp","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66, [...]
diff --git a/output/docs/features/phoenix-row-timestamp/index.html b/output/docs/features/phoenix-row-timestamp/index.html
new file mode 100644
index 00000000..96589611
--- /dev/null
+++ b/output/docs/features/phoenix-row-timestamp/index.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
+ (function() {
+ const theme = localStorage.getItem('theme');
+ const root = document.documentElement;
+ root.classList.remove('light', 'dark');
+
+ if (theme && ['light', 'dark'].includes(theme)) {
+ root.classList.add(theme);
+ } else {
+ const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
+ root.classList.add(systemTheme);
+ localStorage.setItem('theme', systemTheme);
+ }
+ })();
+ </script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
+ "sidebar toc-popover toc"
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+of the row's empty column</strong>, which Phoenix updates automatically on every write.
+It's effectively the row's <strong>last-modified time</strong>, available on any Phoenix table
+without you having to declare or manage a timestamp column yourself. The return
+type is <code>DATE</code>.</p>
+<p class="wrap-anywhere">It can be used in three places, and the third one is what makes it especially
+powerful:</p>
+<ol>
+<li>As a projection in <code>SELECT</code>.</li>
+<li>As a predicate in <code>WHERE</code> (and <code>JOIN</code>) clauses.</li>
+<li>As the indexed expression in a <a href="/docs/features/secondary-indexes#functional-indexes" data-discover="true">functional index</a>, which makes time-bounded reads fast even when the table isn't ordered by time.</li>
+</ol>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="phoenix-row-timestamp-read"><a data-card="" href="#phoenix-row-timestamp-read" class="peer">Reading the row timestamp</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"> [...]
+<p class="wrap-anywhere">Project it like any other column:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP(), id, payload </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events;</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">-- Combine with regular row data.</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">AS</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> modified_at,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> payload</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> region </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'us-west-2'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre></div></figure>
+<p class="wrap-anywhere">The function takes no arguments and is evaluated server-side from the empty cell
+that Phoenix already maintains for every row.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="phoenix-row-timestamp-where"><a data-card="" href="#phoenix-row-timestamp-where" class="peer">In WHERE predicates</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><pat [...]
+<p class="wrap-anywhere">Use it to bound queries by mutation time, including incremental "what changed
+since" patterns:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> CURRENT_DATE() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span><span style="--shiki-light:#24292E;- [...]
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">-- Pull a window for an incremental consumer.</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id, payload</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ?</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> AND</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"><</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ?</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ORDER BY</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ASC</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre></div></figure>
+<p class="wrap-anywhere">Without an index, these predicates require a scan of the table. The next section
+fixes that.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="phoenix-row-timestamp-index"><a data-card="" href="#phoenix-row-timestamp-index" class="peer">Indexing on PHOENIX_ROW_TIMESTAMP()</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hi [...]
+<p class="wrap-anywhere">Create a <a href="/docs/features/secondary-indexes#functional-indexes" data-discover="true">functional index</a>
+on the function to make time-bounded reads fast. Phoenix can then seek directly
+on the indexed timestamp instead of scanning the data table:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ON</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events (PHOENIX_ROW_TIMESTAMP())</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> INCLUDE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (payload);</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">-- Phoenix uses the index for this query.</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id, payload</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ?</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> AND</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"><</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ?</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ORDER BY</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ASC</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre></div></figure>
+<p class="wrap-anywhere">This is the typical recipe for "scan rows changed in the last N minutes" type
+queries on a table whose primary key isn't time-ordered. Pair with
+<a href="/docs/features/secondary-indexes#uncovered-indexes" data-discover="true">uncovered indexes</a> when you
+don't want to duplicate payload columns into the index.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="phoenix-row-timestamp-vs-row-timestamp"><a data-card="" href="#phoenix-row-timestamp-vs-row-timestamp" class="peer">Relationship to ROW_TIMESTAMP column</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hov [...]
+<p class="wrap-anywhere">Two related concepts share the word "timestamp" — they are not the same:</p>
+<div class="relative overflow-auto prose-no-margin my-6"><table><thead><tr><th>Feature</th><th>Direction</th><th>What it does</th></tr></thead><tbody><tr><td><a href="/docs/features/row-timestamp-column" data-discover="true"><code>ROW_TIMESTAMP</code> column</a></td><td>Write</td><td>Designate a primary-key column whose value is <em>written into</em> the underlying HBase row timestamp.</td></tr><tr><td><code>PHOENIX_ROW_TIMESTAMP()</code> function</td><td>Read</td><td>Return the underlyi [...]
+<p class="wrap-anywhere"><code>PHOENIX_ROW_TIMESTAMP()</code> works on <strong>any</strong> Phoenix table, regardless of whether
+you've declared a <code>ROW_TIMESTAMP</code> column. If you have declared one, both
+mechanisms read/write the same underlying timestamp, so <code>PHOENIX_ROW_TIMESTAMP()</code>
+returns the value of the <code>ROW_TIMESTAMP</code> column for that row.</p></div><a href="https://github.com/apache/phoenix-site/edit/asf-site//app/pages/_docs/docs/_mdx/(multi-page)/features/phoenix-row-timestamp.mdx" rel="noreferrer noopener" target="_blank" class="no-print text-fd-secondary-foreground bg-fd-secondary hover:text-fd-accent-foreground hover:bg-fd-accent w-fit rounded-xl border p-2 text-sm font-medium transition-colors">Edit on GitHub</a><div class="@container grid gap-4 [...]
+ if (!window.history.state || !window.history.state.key) {
+ let key = Math.random().toString(32).slice(2);
+ window.history.replaceState({ key }, "");
+ }
+ try {
+ let positions = JSON.parse(sessionStorage.getItem(storageKey2) || "{}");
+ let storedY = positions[restoreKey || window.history.state.key];
+ if (typeof storedY === "number") {
+ window.scrollTo(0, storedY);
+ }
+ } catch (error) {
+ console.error(error);
+ sessionStorage.removeItem(storageKey2);
+ }
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+import * as route0 from "/assets/root-BHBAHx51.js";
+import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
+
+ window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
+
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/phoenix-row-timestamp.mdx\",\"url\",\"/docs/features/phoenix-row-timestamp\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22, [...]
\ No newline at end of file
diff --git a/output/docs/features/query-server.data b/output/docs/features/query-server.data
index 4a12e3f5..ffec8ef5 100644
--- a/output/docs/features/query-server.data
+++ b/output/docs/features/query-server.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/query-server.mdx","url","/docs/features/query-server","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,39 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/query-server.mdx","url","/docs/features/query-server","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,40 [...]
diff --git a/output/docs/features/query-server/index.html b/output/docs/features/query-server/index.html
index 78b749d9..bc542272 100644
--- a/output/docs/features/query-server/index.html
+++ b/output/docs/features/query-server/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
Phoenix and HBase.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="query-server-overview"><a data-card="" href="#query-server-overview" class="peer">Overview</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7 [...]
<p class="wrap-anywhere">Phoenix 4.4 introduces a stand-alone server that exposes Phoenix to "thin"
@@ -172,11 +172,11 @@ ZooKeeper (see <a href="https://issues.apache.org/jira/browse/PHOENIX-4085">PHOE
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/query-server.mdx\",\"url\",\"/docs/features/query-server\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/query-server.mdx\",\"url\",\"/docs/features/query-server\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\" [...]
\ No newline at end of file
diff --git a/output/docs/features/row-timestamp-column.data b/output/docs/features/row-timestamp-column.data
index 81a7e128..91a5c67a 100644
--- a/output/docs/features/row-timestamp-column.data
+++ b/output/docs/features/row-timestamp-column.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/row-timestamp-column.mdx","url","/docs/features/row-timestamp-column","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,11 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/row-timestamp-column.mdx","url","/docs/features/row-timestamp-column","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,11 [...]
diff --git a/output/docs/features/row-timestamp-column/index.html b/output/docs/features/row-timestamp-column/index.html
index 187e356c..90f2aa1d 100644
--- a/output/docs/features/row-timestamp-column/index.html
+++ b/output/docs/features/row-timestamp-column/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<p class="wrap-anywhere">For a column to be designated as ROW_TIMESTAMP, certain constraints need to be followed:</p>
<ul>
<li>Only a primary key column of type <code>TIME</code>, <code>DATE</code>, <code>TIMESTAMP</code>, <code>BIGINT</code>, or <code>UNSIGNED_LONG</code> can be designated as <code>ROW_TIMESTAMP</code>.</li>
@@ -42,7 +42,9 @@
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> METRICS_ID, METRIC_VALUE </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> SOURCE_METRICS_TABLE</span></span></code></pre></div></figure>
<p class="wrap-anywhere">This sets <code>CREATED_DATE</code> in the destination table to the server timestamp.</p>
-<p class="wrap-anywhere">When querying with filters on the row timestamp column, Phoenix performs its usual row-key optimizations and can also set scan min/max time ranges appropriately. Using this time range information, HBase can skip store files that do not fall in the target time range, which significantly improves performance, especially for tail-end data queries.</p></div><a href="https://github.com/apache/phoenix-site/edit/asf-site//app/pages/_docs/docs/_mdx/(multi-page)/features/ [...]
+<p class="wrap-anywhere">When querying with filters on the row timestamp column, Phoenix performs its usual row-key optimizations and can also set scan min/max time ranges appropriately. Using this time range information, HBase can skip store files that do not fall in the target time range, which significantly improves performance, especially for tail-end data queries.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="see-also"><a data-card="" href="#see-also" class="peer">See also</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07- [...]
+<p class="wrap-anywhere">The <a href="/docs/features/phoenix-row-timestamp" data-discover="true"><code>PHOENIX_ROW_TIMESTAMP()</code></a> function lets you read the underlying HBase row timestamp on any Phoenix table — even one without a declared <code>ROW_TIMESTAMP</code> column — and is indexable for fast time-bounded queries.</p></div><a href="https://github.com/apache/phoenix-site/edit/asf-site//app/pages/_docs/docs/_mdx/(multi-page)/features/row-timestamp-column.mdx" rel="noreferrer [...]
if (!window.history.state || !window.history.state.key) {
let key = Math.random().toString(32).slice(2);
window.history.replaceState({ key }, "");
@@ -57,11 +59,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/row-timestamp-column.mdx\",\"url\",\"/docs/features/row-timestamp-column\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/row-timestamp-column.mdx\",\"url\",\"/docs/features/row-timestamp-column\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\" [...]
\ No newline at end of file
diff --git a/output/docs/features/salted-tables.data b/output/docs/features/salted-tables.data
index 5d5b8e0d..480315fa 100644
--- a/output/docs/features/salted-tables.data
+++ b/output/docs/features/salted-tables.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/salted-tables.mdx","url","/docs/features/salted-tables","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/salted-tables.mdx","url","/docs/features/salted-tables","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375, [...]
diff --git a/output/docs/features/salted-tables/index.html b/output/docs/features/salted-tables/index.html
index 390bc507..99de4245 100644
--- a/output/docs/features/salted-tables/index.html
+++ b/output/docs/features/salted-tables/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<p class="wrap-anywhere">Phoenix provides a way to transparently salt the row key with a salting byte for a table. Specify this at table creation time with the <code>SALT_BUCKETS</code> table property, using a value from 1 to 256:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
<p class="wrap-anywhere">There are some behavior differences and cautions to be aware of when using a salted table.</p>
@@ -42,11 +42,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/salted-tables.mdx\",\"url\",\"/docs/features/salted-tables\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/salted-tables.mdx\",\"url\",\"/docs/features/salted-tables\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24 [...]
\ No newline at end of file
diff --git a/output/docs/features/secondary-indexes.data b/output/docs/features/secondary-indexes.data
index 4257756f..d8762025 100644
--- a/output/docs/features/secondary-indexes.data
+++ b/output/docs/features/secondary-indexes.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/secondary-indexes.mdx","url","/docs/features/secondary-indexes","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/secondary-indexes.mdx","url","/docs/features/secondary-indexes","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287, [...]
diff --git a/output/docs/features/secondary-indexes/index.html b/output/docs/features/secondary-indexes/index.html
index 5fee15b5..ce044c45 100644
--- a/output/docs/features/secondary-indexes/index.html
+++ b/output/docs/features/secondary-indexes/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
index that is lexicographically sorted on the primary row key. Access to records in any way other than through
the primary row requires scanning over potentially all the rows in the table to test them against your filter.
With secondary indexing, the columns or expressions you index form an alternate row key to allow point lookups
@@ -76,6 +76,60 @@ standard index hint:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> users</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> email </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'jane@example.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre></div></figure>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="partial-indexes"><a data-card="" href="#partial-indexes" class="peer">Partial Indexes</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.5 [...]
+<p class="wrap-anywhere">A <strong>partial index</strong> indexes only the rows of the data table that satisfy a SQL
+boolean predicate, supplied at <code>CREATE INDEX</code> time via a <code>WHERE</code> clause. The
+index is smaller, writes that don't affect the predicate are cheaper, and the
+planner only uses it for queries whose own predicate implies the index's. Added
+in <a href="https://issues.apache.org/jira/browse/PHOENIX-7032">PHOENIX-7032</a>.</p>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="partial-indexes-when"><a data-card="" href="#partial-indexes-when" class="peer">When to choose a partial index</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d [...]
+<p class="wrap-anywhere">Reach for a partial index when the workload reads a small, well-defined slice of
+a much larger table — and that slice is identifiable by a SQL predicate. Common
+shapes:</p>
+<ul>
+<li><em>Open / active records</em>: <code>WHERE status IN ('OPEN', 'PENDING')</code> on a table that
+also stores closed records.</li>
+<li><em>Recent rows</em>: <code>WHERE created_at > DATE '2024-01-01'</code>.</li>
+<li><em>Hot tier</em>: <code>WHERE priority >= 5</code> for paging / alerting workloads.</li>
+<li><em>Failure investigation</em>: <code>WHERE result = 'FAIL'</code> on a successful-most-of-the-time
+table.</li>
+</ul>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="partial-indexes-usage"><a data-card="" href="#partial-indexes-usage" class="peer">Creating a partial index</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M1 [...]
+<p class="wrap-anywhere">The DDL is a regular <code>CREATE INDEX</code> with a trailing <code>WHERE</code> clause. Both
+<strong>covered</strong> and <strong>uncovered</strong> global indexes can be partial:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ON</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> orders (customer_id, created_at)</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> INCLUDE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (total_amount)</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> WHERE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> status</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> IN</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'OPEN'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9 [...]
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">CREATE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> UNCOVERED </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">INDEX</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> idx_failed_jobs</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ON</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> jobs (created_at)</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'FAIL'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre></div></figure>
+<p class="wrap-anywhere">The planner uses the index for any query whose <code>WHERE</code> clause implies the
+index's predicate:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> customer_id, total_amount</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> orders</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> status</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'OPEN'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> AND</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> created_at </span><span style="--shiki-light:#D73A49;--shiki [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="partial-indexes-mutations"><a data-card="" href="#partial-indexes-mutations" class="peer">Mutations that cross the predicate</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden= [...]
+<p class="wrap-anywhere">Partial indexes correctly maintain themselves when a mutation moves a row into
+or out of the predicate, including under <code>ON DUPLICATE KEY UPDATE</code>:</p>
+<ul>
+<li>A row that <strong>starts</strong> satisfying the predicate after an update has its index
+row created.</li>
+<li>A row that <strong>stops</strong> satisfying the predicate after an update has its index
+row removed.</li>
+</ul>
+<p class="wrap-anywhere">This means a partial index stays consistent for a workload like <em>"close an
+order"</em> even though that operation flips the row out of the index's covered
+slice.</p>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="partial-indexes-limitations"><a data-card="" href="#partial-indexes-limitations" class="peer">Limitations</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 [...]
+<ul>
+<li><strong>Local partial indexes are not supported</strong> — only global (covered or
+uncovered) partial indexes work today.</li>
+<li>The <code>WHERE</code> predicate is fixed at <code>CREATE INDEX</code> time. To change it, drop and
+recreate the index.</li>
+</ul>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="index-population"><a data-card="" href="#index-population" class="peer">Index Population</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.5 [...]
<p class="wrap-anywhere">By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the <code>ASYNC</code> keyword in the index creation DDL statement:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
@@ -431,7 +485,7 @@ it directly to Phoenix; although, such a tool is not currently provided by Phoen
<li><a href="https://github.com/Huawei-Hadoop/hindex/blob/master/README.md#how-it-works">Local Indexes</a> by Huawei</li>
<li><a href="https://issues.apache.org/jira/browse/PHOENIX-938">PHOENIX-938</a> and <a href="https://issues.apache.org/jira/browse/HBASE-11513">HBASE-11513</a> for deadlock prevention during global index maintenance.</li>
<li><a href="https://issues.apache.org/jira/browse/PHOENIX-1112">PHOENIX-1112: Atomically rebuild index partially when index update fails</a></li>
-</ul></div><a href="https://github.com/apache/phoenix-site/edit/asf-site//app/pages/_docs/docs/_mdx/(multi-page)/features/secondary-indexes.mdx" rel="noreferrer noopener" target="_blank" class="no-print text-fd-secondary-foreground bg-fd-secondary hover:text-fd-accent-foreground hover:bg-fd-accent w-fit rounded-xl border p-2 text-sm font-medium transition-colors">Edit on GitHub</a><div class="@container grid gap-4 grid-cols-2"><a class="hover:bg-fd-accent/80 hover:text-fd-accent-foregrou [...]
+</ul></div><a href="https://github.com/apache/phoenix-site/edit/asf-site//app/pages/_docs/docs/_mdx/(multi-page)/features/secondary-indexes.mdx" rel="noreferrer noopener" target="_blank" class="no-print text-fd-secondary-foreground bg-fd-secondary hover:text-fd-accent-foreground hover:bg-fd-accent w-fit rounded-xl border p-2 text-sm font-medium transition-colors">Edit on GitHub</a><div class="@container grid gap-4 grid-cols-2"><a class="hover:bg-fd-accent/80 hover:text-fd-accent-foregrou [...]
if (!window.history.state || !window.history.state.key) {
let key = Math.random().toString(32).slice(2);
window.history.replaceState({ key }, "");
@@ -446,11 +500,11 @@ it directly to Phoenix; although, such a tool is not currently provided by Phoen
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/secondary-indexes.mdx\",\"url\",\"/docs/features/secondary-indexes\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/secondary-indexes.mdx\",\"url\",\"/docs/features/secondary-indexes\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
diff --git a/output/docs/features/segment-scan.data b/output/docs/features/segment-scan.data
index 8cf56e1a..0b1ab69d 100644
--- a/output/docs/features/segment-scan.data
+++ b/output/docs/features/segment-scan.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/segment-scan.mdx","url","/docs/features/segment-scan","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,39 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/segment-scan.mdx","url","/docs/features/segment-scan","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,40 [...]
diff --git a/output/docs/features/segment-scan/index.html b/output/docs/features/segment-scan/index.html
index 648bf221..b0b193e7 100644
--- a/output/docs/features/segment-scan/index.html
+++ b/output/docs/features/segment-scan/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
that you can hand out to a pool of workers to drive a parallel full-table scan. It is
the natural primitive for ETL exports, table validation/repair tools, bulk
re-encoding, and anything else that needs to walk every row as fast as the cluster
@@ -107,11 +107,11 @@ runs a regular Phoenix query bounded with <code>SCAN_START_KEY() = ? AND SCAN_EN
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/segment-scan.mdx\",\"url\",\"/docs/features/segment-scan\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/segment-scan.mdx\",\"url\",\"/docs/features/segment-scan\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\" [...]
\ No newline at end of file
diff --git a/output/docs/features/skip-scan.data b/output/docs/features/skip-scan.data
index 70726e8f..e0642574 100644
--- a/output/docs/features/skip-scan.data
+++ b/output/docs/features/skip-scan.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/skip-scan.mdx","url","/docs/features/skip-scan","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,398,401, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/skip-scan.mdx","url","/docs/features/skip-scan","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,404,407, [...]
diff --git a/output/docs/features/skip-scan/index.html b/output/docs/features/skip-scan/index.html
index 0f56f032..35e5d2d7 100644
--- a/output/docs/features/skip-scan/index.html
+++ b/output/docs/features/skip-scan/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/skip-scan-Bnrmt1Cn.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" h [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/skip-scan-Bnrmt1Cn.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" h [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<p class="wrap-anywhere">Skip Scan leverages <code>SEEK_NEXT_USING_HINT</code> in HBase filters. It stores information about which key sets or key ranges are being searched for in each column. During filter evaluation, it checks whether a key is in one of the valid combinations or ranges. If not, it computes the next highest key to jump to.</p>
<p class="wrap-anywhere">Input to <code>SkipScanFilter</code> is a <code>List<List<KeyRange>></code> where the top-level list represents each row-key column (that is, each primary key part), and the inner list represents OR-ed byte-array boundaries.</p>
<p class="wrap-anywhere">Consider the following query:</p>
@@ -40,11 +40,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/skip-scan.mdx\",\"url\",\"/docs/features/skip-scan\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/skip-scan.mdx\",\"url\",\"/docs/features/skip-scan\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\" [...]
\ No newline at end of file
diff --git a/output/docs/features/statistics-collection.data b/output/docs/features/statistics-collection.data
index c1fa8ff6..8d679dcf 100644
--- a/output/docs/features/statistics-collection.data
+++ b/output/docs/features/statistics-collection.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/statistics-collection.mdx","url","/docs/features/statistics-collection","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/statistics-collection.mdx","url","/docs/features/statistics-collection","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66, [...]
diff --git a/output/docs/features/statistics-collection/index.html b/output/docs/features/statistics-collection/index.html
index 998da3f8..b3b64a42 100644
--- a/output/docs/features/statistics-collection/index.html
+++ b/output/docs/features/statistics-collection/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
This command collects a set of keys per region per column family that
are equal byte distanced from each other. These collected keys are called <em>guideposts</em>
and they act as <em>hints/guides</em> to improve the parallelization of queries on a given
@@ -107,11 +107,11 @@ on the data should be used to drive query parallelization.</li>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/statistics-collection.mdx\",\"url\",\"/docs/features/statistics-collection\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22, [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/statistics-collection.mdx\",\"url\",\"/docs/features/statistics-collection\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22, [...]
\ No newline at end of file
diff --git a/output/docs/features/storage-formats.data b/output/docs/features/storage-formats.data
index 27d3042c..9107ad30 100644
--- a/output/docs/features/storage-formats.data
+++ b/output/docs/features/storage-formats.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/storage-formats.mdx","url","/docs/features/storage-formats","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/storage-formats.mdx","url","/docs/features/storage-formats","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341, [...]
diff --git a/output/docs/features/storage-formats/index.html b/output/docs/features/storage-formats/index.html
index 8a5539de..11287402 100644
--- a/output/docs/features/storage-formats/index.html
+++ b/output/docs/features/storage-formats/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<ul>
<li>Introduce a layer of indirection between Phoenix column names and the corresponding HBase column qualifiers.</li>
<li>Support a new encoding scheme for immutable tables that packs all values into a single cell per column family.</li>
@@ -77,11 +77,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/storage-formats.mdx\",\"url\",\"/docs/features/storage-formats\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/storage-formats.mdx\",\"url\",\"/docs/features/storage-formats\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\ [...]
\ No newline at end of file
diff --git a/output/docs/features/table-sampling.data b/output/docs/features/table-sampling.data
index 2d662c6b..47f7cb68 100644
--- a/output/docs/features/table-sampling.data
+++ b/output/docs/features/table-sampling.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/table-sampling.mdx","url","/docs/features/table-sampling","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,36 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/table-sampling.mdx","url","/docs/features/table-sampling","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,37 [...]
diff --git a/output/docs/features/table-sampling/index.html b/output/docs/features/table-sampling/index.html
index 73ebfe90..4fe54a96 100644
--- a/output/docs/features/table-sampling/index.html
+++ b/output/docs/features/table-sampling/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/sampling_accuracy_perf-D6G8Z0nV.jpg" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/sampling_accuracy_perf-D6G8Z0nV.jpg" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<p class="wrap-anywhere">This feature is implemented with a Bernoulli trial and a consistent-hashing-based table sampler to achieve Bernoulli sampling on a given row population. Given a sampling rate, it leverages Phoenix statistics and HBase region distribution to perform table sampling.</p>
<p class="wrap-anywhere">As part of <a href="/docs/features/statistics-collection" data-discover="true">statistics collection</a>, a guidepost (a row reference) is created at equidistant byte intervals. When sampling is required, a Bernoulli trial process is applied repeatedly on each guidepost in each region with a probability proportional to the sampling rate. An included guidepost results in all rows between it and the next guidepost being included in the sample population.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="table-sampling-performance"><a data-card="" href="#table-sampling-performance" class="peer">Performance</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 1 [...]
@@ -68,11 +68,11 @@ Resource consumption drops quickly as sampling rate decreases. In general, the a
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/table-sampling.mdx\",\"url\",\"/docs/features/table-sampling\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/table-sampling.mdx\",\"url\",\"/docs/features/table-sampling\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_ [...]
\ No newline at end of file
diff --git a/output/docs/features/tracing.data b/output/docs/features/tracing.data
index 90a5086c..435ac67c 100644
--- a/output/docs/features/tracing.data
+++ b/output/docs/features/tracing.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/tracing.mdx","url","/docs/features/tracing","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,398,401,407, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/tracing.mdx","url","/docs/features/tracing","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,404,407,413, [...]
diff --git a/output/docs/features/tracing/index.html b/output/docs/features/tracing/index.html
index 843cab6b..23df4367 100644
--- a/output/docs/features/tracing/index.html
+++ b/output/docs/features/tracing/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/trace-dashboard-zASBbm2T.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/trace-list-D_9jNPId.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fe [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/trace-dashboard-zASBbm2T.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/trace-list-D_9jNPId.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fe [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<p class="wrap-anywhere">Phoenix leverages Cloudera's <a href="https://github.com/cloudera/htrace">HTrace</a> library to integrate with HBase tracing utilities. Trace metrics are then deposited into a Hadoop Metrics2 sink that writes them into a Phoenix table.</p>
<p class="wrap-anywhere">Writing traces to a Phoenix table is not supported on Hadoop 1.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="tracing-configuration"><a data-card="" href="#tracing-configuration" class="peer">Configuration</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 [...]
@@ -177,11 +177,11 @@ Enabling one of these properties only turns on trace collection. Trace data stil
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/tracing.mdx\",\"url\",\"/docs/features/tracing\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/tracing.mdx\",\"url\",\"/docs/features/tracing\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\ [...]
\ No newline at end of file
diff --git a/output/docs/features/transactions.data b/output/docs/features/transactions.data
index 6b0a70c1..106efbfb 100644
--- a/output/docs/features/transactions.data
+++ b/output/docs/features/transactions.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/transactions.mdx","url","/docs/features/transactions","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,39 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/transactions.mdx","url","/docs/features/transactions","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,40 [...]
diff --git a/output/docs/features/transactions/index.html b/output/docs/features/transactions/index.html
index b0df790f..601ea38f 100644
--- a/output/docs/features/transactions/index.html
+++ b/output/docs/features/transactions/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<p class="wrap-anywhere">Set up a system to use transactions in Phoenix with the following steps:</p>
<div class="fd-steps"><div class="fd-step"><p class="wrap-anywhere">Add the following config to your client-side <code>hbase-site.xml</code> file to enable transactions:</p><figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right [...]
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> <</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>phoenix.transactions.enabled</</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
@@ -74,11 +74,11 @@ For now, an administrator can manually clear transactions from this list after a
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/transactions.mdx\",\"url\",\"/docs/features/transactions\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/transactions.mdx\",\"url\",\"/docs/features/transactions\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\" [...]
\ No newline at end of file
diff --git a/output/docs/features/ttl.data b/output/docs/features/ttl.data
index 4635c69e..8bf23cdd 100644
--- a/output/docs/features/ttl.data
+++ b/output/docs/features/ttl.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/ttl.mdx","url","/docs/features/ttl","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,398,401,407,413,419, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/ttl.mdx","url","/docs/features/ttl","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,404,407,413,419,425, [...]
diff --git a/output/docs/features/ttl/index.html b/output/docs/features/ttl/index.html
index 6a648bd7..ae798fb4 100644
--- a/output/docs/features/ttl/index.html
+++ b/output/docs/features/ttl/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
without an application-issued <code>DELETE</code>. There are three flavors, and one orthogonal
table property — <code>IS_STRICT_TTL</code> — that controls how aggressively expired rows are
hidden from reads.</p>
@@ -75,11 +75,11 @@ acceptable for your readers.</p></div><a href="https://github.com/apache/phoenix
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/ttl.mdx\",\"url\",\"/docs/features/ttl\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/ttl.mdx\",\"url\",\"/docs/features/ttl\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_ [...]
\ No newline at end of file
diff --git a/output/docs/features/user-defined-functions.data b/output/docs/features/user-defined-functions.data
index 4133bfc3..36b39840 100644
--- a/output/docs/features/user-defined-functions.data
+++ b/output/docs/features/user-defined-functions.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/user-defined-functions.mdx","url","/docs/features/user-defined-functions","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,6 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/user-defined-functions.mdx","url","/docs/features/user-defined-functions","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,6 [...]
diff --git a/output/docs/features/user-defined-functions/index.html b/output/docs/features/user-defined-functions/index.html
index f5663bb9..c2f6c4ec 100644
--- a/output/docs/features/user-defined-functions/index.html
+++ b/output/docs/features/user-defined-functions/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
their own custom or domain-specific UDFs to the cluster.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="user-defined-functions-overview"><a data-card="" href="#user-defined-functions-overview" class="peer">Overview</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d [...]
<p class="wrap-anywhere">Users can create temporary or permanent user-defined (domain-specific) scalar functions.
@@ -156,11 +156,11 @@ The method returns <code>false</code> if there is not enough information to calc
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/user-defined-functions.mdx\",\"url\",\"/docs/features/user-defined-functions\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":2 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/user-defined-functions.mdx\",\"url\",\"/docs/features/user-defined-functions\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":2 [...]
\ No newline at end of file
diff --git a/output/docs/features/varbinary-encoded.data b/output/docs/features/varbinary-encoded.data
index 95560505..5361a5c4 100644
--- a/output/docs/features/varbinary-encoded.data
+++ b/output/docs/features/varbinary-encoded.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/varbinary-encoded.mdx","url","/docs/features/varbinary-encoded","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/varbinary-encoded.mdx","url","/docs/features/varbinary-encoded","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287, [...]
diff --git a/output/docs/features/varbinary-encoded/index.html b/output/docs/features/varbinary-encoded/index.html
index 026d7af0..4b9e825f 100644
--- a/output/docs/features/varbinary-encoded/index.html
+++ b/output/docs/features/varbinary-encoded/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
column that participates in <strong>ordering</strong>: a non-trailing column of a composite primary
key, a secondary-index key, or a row value constructor used for paged queries.
Introduced in Phoenix 5.3.0
@@ -95,11 +95,11 @@ the values into the new physical layout for you).</li>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/varbinary-encoded.mdx\",\"url\",\"/docs/features/varbinary-encoded\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/varbinary-encoded.mdx\",\"url\",\"/docs/features/varbinary-encoded\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
diff --git a/output/docs/features/view-ttl.data b/output/docs/features/view-ttl.data
index 8e2cc2cd..25758407 100644
--- a/output/docs/features/view-ttl.data
+++ b/output/docs/features/view-ttl.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/view-ttl.mdx","url","/docs/features/view-ttl","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,398,401,40 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/view-ttl.mdx","url","/docs/features/view-ttl","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,404,407,41 [...]
diff --git a/output/docs/features/view-ttl/index.html b/output/docs/features/view-ttl/index.html
index 5a2c05b8..6134be06 100644
--- a/output/docs/features/view-ttl/index.html
+++ b/output/docs/features/view-ttl/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
HBase table with its sibling views. <strong>View TTL</strong> lets each view define its <strong>own</strong> data
retention policy on top of that shared table. Rows that have outlived their view's TTL
disappear from queries against that view and are eventually removed in the background —
@@ -96,11 +96,11 @@ TTL too.</p></div><a href="https://github.com/apache/phoenix-site/edit/asf-site/
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/view-ttl.mdx\",\"url\",\"/docs/features/view-ttl\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_2 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/view-ttl.mdx\",\"url\",\"/docs/features/view-ttl\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_2 [...]
\ No newline at end of file
diff --git a/output/docs/features/views.data b/output/docs/features/views.data
index 1291a704..685f8037 100644
--- a/output/docs/features/views.data
+++ b/output/docs/features/views.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/views.mdx","url","/docs/features/views","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,281,335,369,398,401,407,413, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/features/views.mdx","url","/docs/features/views","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,287,341,375,404,407,413,419, [...]
diff --git a/output/docs/features/views/index.html b/output/docs/features/views/index.html
index 8f729812..b37a64ff 100644
--- a/output/docs/features/views/index.html
+++ b/output/docs/features/views/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<p class="wrap-anywhere">For example, given the following table definition that defines a base table to collect product metrics:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> metric_type </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">CHAR</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
@@ -67,11 +67,11 @@ Notice that unlike with standard SQL views, you may define additional columns fo
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/views.mdx\",\"url\",\"/docs/features/views\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/features/views.mdx\",\"url\",\"/docs/features/views\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7 [...]
\ No newline at end of file
diff --git a/output/docs/functions.data b/output/docs/functions.data
index 8a1098d9..f89f12f1 100644
--- a/output/docs/functions.data
+++ b/output/docs/functions.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/functions.mdx","url","/docs/functions","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,337,371,400,403,409,413,419,425,43 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/functions.mdx","url","/docs/functions","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,343,377,406,409,415,419,425,431,43 [...]
diff --git a/output/docs/functions/index.html b/output/docs/functions/index.html
index 627e0928..dfc59efd 100644
--- a/output/docs/functions/index.html
+++ b/output/docs/functions/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -6604,11 +6604,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/functions.mdx\",\"url\",\"/docs/functions\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":2 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/functions.mdx\",\"url\",\"/docs/functions\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":2 [...]
\ No newline at end of file
diff --git a/output/docs/fundamentals/backward-compatibility.data b/output/docs/fundamentals/backward-compatibility.data
index 67acd4f4..ea7b74fd 100644
--- a/output/docs/fundamentals/backward-compatibility.data
+++ b/output/docs/fundamentals/backward-compatibility.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/backward-compatibility.mdx","url","/docs/fundamentals/backward-compatibility","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/backward-compatibility.mdx","url","/docs/fundamentals/backward-compatibility","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49 [...]
diff --git a/output/docs/fundamentals/backward-compatibility/index.html b/output/docs/fundamentals/backward-compatibility/index.html
index 9a179aab..df039f6a 100644
--- a/output/docs/fundamentals/backward-compatibility/index.html
+++ b/output/docs/fundamentals/backward-compatibility/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -58,11 +58,11 @@ determined on a release-by-release basis.</p>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/backward-compatibility.mdx\",\"url\",\"/docs/fundamentals/backward-compatibility\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/backward-compatibility.mdx\",\"url\",\"/docs/fundamentals/backward-compatibility\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\ [...]
\ No newline at end of file
diff --git a/output/docs/fundamentals/building.data b/output/docs/fundamentals/building.data
index 39f120ce..73ff5f95 100644
--- a/output/docs/fundamentals/building.data
+++ b/output/docs/fundamentals/building.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/building.mdx","url","/docs/fundamentals/building","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,113,281,335,369,39 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/building.mdx","url","/docs/fundamentals/building","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,113,287,341,375,40 [...]
diff --git a/output/docs/fundamentals/building/index.html b/output/docs/fundamentals/building/index.html
index a01c256b..104c8319 100644
--- a/output/docs/fundamentals/building/index.html
+++ b/output/docs/fundamentals/building/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -60,11 +60,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/building.mdx\",\"url\",\"/docs/fundamentals/building\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/building.mdx\",\"url\",\"/docs/fundamentals/building\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\" [...]
\ No newline at end of file
diff --git a/output/docs/fundamentals/client-classpath-and-jdbc-url.data b/output/docs/fundamentals/client-classpath-and-jdbc-url.data
index 8253ce39..069f3210 100644
--- a/output/docs/fundamentals/client-classpath-and-jdbc-url.data
+++ b/output/docs/fundamentals/client-classpath-and-jdbc-url.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/client-classpath-and-jdbc-url.mdx","url","/docs/fundamentals/client-classpath-and-jdbc-url","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/client-classpath-and-jdbc-url.mdx","url","/docs/fundamentals/client-classpath-and-jdbc-url","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index [...]
diff --git a/output/docs/fundamentals/client-classpath-and-jdbc-url/index.html b/output/docs/fundamentals/client-classpath-and-jdbc-url/index.html
index fc8950dd..b20e3721 100644
--- a/output/docs/fundamentals/client-classpath-and-jdbc-url/index.html
+++ b/output/docs/fundamentals/client-classpath-and-jdbc-url/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -113,11 +113,11 @@ Phoenix will throw an error if a variant that the HBase client version doesn
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/client-classpath-and-jdbc-url.mdx\",\"url\",\"/docs/fundamentals/client-classpath-and-jdbc-url\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":2 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/client-classpath-and-jdbc-url.mdx\",\"url\",\"/docs/fundamentals/client-classpath-and-jdbc-url\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":2 [...]
\ No newline at end of file
diff --git a/output/docs/fundamentals/configuration.data b/output/docs/fundamentals/configuration.data
index 51d677e9..a80c1191 100644
--- a/output/docs/fundamentals/configuration.data
+++ b/output/docs/fundamentals/configuration.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/configuration.mdx","url","/docs/fundamentals/configuration","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,113,281, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/configuration.mdx","url","/docs/fundamentals/configuration","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,113,287, [...]
diff --git a/output/docs/fundamentals/configuration/index.html b/output/docs/fundamentals/configuration/index.html
index 45e64c19..bee1a7e6 100644
--- a/output/docs/fundamentals/configuration/index.html
+++ b/output/docs/fundamentals/configuration/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -32,11 +32,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/configuration.mdx\",\"url\",\"/docs/fundamentals/configuration\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/configuration.mdx\",\"url\",\"/docs/fundamentals/configuration\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
diff --git a/output/docs/fundamentals/performance-testing.data b/output/docs/fundamentals/performance-testing.data
index 7bc43443..41c70e0c 100644
--- a/output/docs/fundamentals/performance-testing.data
+++ b/output/docs/fundamentals/performance-testing.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/performance-testing.mdx","url","/docs/fundamentals/performance-testing","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/performance-testing.mdx","url","/docs/fundamentals/performance-testing","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63 [...]
diff --git a/output/docs/fundamentals/performance-testing/index.html b/output/docs/fundamentals/performance-testing/index.html
index 03634b27..fa57cd4f 100644
--- a/output/docs/fundamentals/performance-testing/index.html
+++ b/output/docs/fundamentals/performance-testing/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/pherf-zjt4kTra.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href= [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/pherf-zjt4kTra.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href= [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -162,11 +162,11 @@ runtime, timeout status, result row count, and more. The header file format can
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/performance-testing.mdx\",\"url\",\"/docs/fundamentals/performance-testing\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/performance-testing.mdx\",\"url\",\"/docs/fundamentals/performance-testing\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\" [...]
\ No newline at end of file
diff --git a/output/docs/fundamentals/performance.data b/output/docs/fundamentals/performance.data
index e58db1a4..92330319 100644
--- a/output/docs/fundamentals/performance.data
+++ b/output/docs/fundamentals/performance.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/performance.mdx","url","/docs/fundamentals/performance","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,113,281,335, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/performance.mdx","url","/docs/fundamentals/performance","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,113,287,341, [...]
diff --git a/output/docs/fundamentals/performance/index.html b/output/docs/fundamentals/performance/index.html
index e3fcd63f..98d7f9e7 100644
--- a/output/docs/fundamentals/performance/index.html
+++ b/output/docs/fundamentals/performance/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/PhoenixVsHive-CrdSmERl.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/PhoenixVsImpala-Cm5ZYcnR.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/PhoenixVsHive-CrdSmERl.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/PhoenixVsImpala-Cm5ZYcnR.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -82,11 +82,11 @@ servers: 4 (HBase heap: 10GB, processor: 6 cores @ 3.3GHz Xeon).</p>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/performance.mdx\",\"url\",\"/docs/fundamentals/performance\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/performance.mdx\",\"url\",\"/docs/fundamentals/performance\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\ [...]
\ No newline at end of file
diff --git a/output/docs/fundamentals/tuning-guide.data b/output/docs/fundamentals/tuning-guide.data
index 31ce90f2..f643f0e5 100644
--- a/output/docs/fundamentals/tuning-guide.data
+++ b/output/docs/fundamentals/tuning-guide.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/tuning-guide.mdx","url","/docs/fundamentals/tuning-guide","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,113,281,33 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/fundamentals/tuning-guide.mdx","url","/docs/fundamentals/tuning-guide","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,113,287,34 [...]
diff --git a/output/docs/fundamentals/tuning-guide/index.html b/output/docs/fundamentals/tuning-guide/index.html
index 8b6e2840..4896c68d 100644
--- a/output/docs/fundamentals/tuning-guide/index.html
+++ b/output/docs/fundamentals/tuning-guide/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -217,11 +217,11 @@ Statistics are turned on by default. With Phoenix 4.9, the user can set guidepos
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/tuning-guide.mdx\",\"url\",\"/docs/fundamentals/tuning-guide\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/fundamentals/tuning-guide.mdx\",\"url\",\"/docs/fundamentals/tuning-guide\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7 [...]
\ No newline at end of file
diff --git a/output/docs/grammar.data b/output/docs/grammar.data
index 7abe6353..de041aa5 100644
--- a/output/docs/grammar.data
+++ b/output/docs/grammar.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/grammar.mdx","url","/docs/grammar","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,337,371,400,403,407,413,419,425,431,43 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/grammar.mdx","url","/docs/grammar","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,343,377,406,409,413,419,425,431,437,44 [...]
diff --git a/output/docs/grammar/index.html b/output/docs/grammar/index.html
index 99f1c15d..c024fca4 100644
--- a/output/docs/grammar/index.html
+++ b/output/docs/grammar/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -8219,11 +8219,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/grammar.mdx\",\"url\",\"/docs/grammar\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":27,\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/grammar.mdx\",\"url\",\"/docs/grammar\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":27,\" [...]
\ No newline at end of file
diff --git a/output/docs/index.html b/output/docs/index.html
index 787d7de3..41781415 100644
--- a/output/docs/index.html
+++ b/output/docs/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.wof [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.wof [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -118,11 +118,11 @@ download <a href="/downloads" data-discover="true">here</a>. Follow Apache Phoen
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/index.mdx\",\"url\",\"/docs\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":27,\"_11\":455, [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/index.mdx\",\"url\",\"/docs\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":27,\"_11\":461, [...]
\ No newline at end of file
diff --git a/output/docs/installation.data b/output/docs/installation.data
index b3535669..9115c395 100644
--- a/output/docs/installation.data
+++ b/output/docs/installation.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/installation.mdx","url","/docs/installation","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,54,61,64,113,281,335,369,398,401,407,413,419, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/installation.mdx","url","/docs/installation","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,54,61,64,113,287,341,375,404,407,413,419,425, [...]
diff --git a/output/docs/installation/index.html b/output/docs/installation/index.html
index 4cce1421..aad72825 100644
--- a/output/docs/installation/index.html
+++ b/output/docs/installation/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/sqlline-h05veEny.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/squirrel-CeQy7FtI.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriorit [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/sqlline-h05veEny.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="image" href="/assets/squirrel-CeQy7FtI.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriorit [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -76,11 +76,11 @@ ready to run SQL queries against Phoenix.</p></div></div>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/installation.mdx\",\"url\",\"/docs/installation\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/installation.mdx\",\"url\",\"/docs/installation\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_ [...]
\ No newline at end of file
diff --git a/output/docs/integrations/apache-hive.data b/output/docs/integrations/apache-hive.data
index bb601b97..a356c3a2 100644
--- a/output/docs/integrations/apache-hive.data
+++ b/output/docs/integrations/apache-hive.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/apache-hive.mdx","url","/docs/integrations/apache-hive","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,335, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/apache-hive.mdx","url","/docs/integrations/apache-hive","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,341, [...]
diff --git a/output/docs/integrations/apache-hive/index.html b/output/docs/integrations/apache-hive/index.html
index a1b26d28..7ab9b957 100644
--- a/output/docs/integrations/apache-hive/index.html
+++ b/output/docs/integrations/apache-hive/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -171,11 +171,11 @@ Otherwise, create a world-readable directory on the system and copy the connecto
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/apache-hive.mdx\",\"url\",\"/docs/integrations/apache-hive\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/apache-hive.mdx\",\"url\",\"/docs/integrations/apache-hive\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\ [...]
\ No newline at end of file
diff --git a/output/docs/integrations/flume-plugin.data b/output/docs/integrations/flume-plugin.data
index bb76c018..2a679a3a 100644
--- a/output/docs/integrations/flume-plugin.data
+++ b/output/docs/integrations/flume-plugin.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/flume-plugin.mdx","url","/docs/integrations/flume-plugin","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,33 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/flume-plugin.mdx","url","/docs/integrations/flume-plugin","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,34 [...]
diff --git a/output/docs/integrations/flume-plugin/index.html b/output/docs/integrations/flume-plugin/index.html
index c292a5b6..77b4f09c 100644
--- a/output/docs/integrations/flume-plugin/index.html
+++ b/output/docs/integrations/flume-plugin/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -49,11 +49,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/flume-plugin.mdx\",\"url\",\"/docs/integrations/flume-plugin\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/flume-plugin.mdx\",\"url\",\"/docs/integrations/flume-plugin\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7 [...]
\ No newline at end of file
diff --git a/output/docs/integrations/kafka-plugin.data b/output/docs/integrations/kafka-plugin.data
index e649e365..fbabff89 100644
--- a/output/docs/integrations/kafka-plugin.data
+++ b/output/docs/integrations/kafka-plugin.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/kafka-plugin.mdx","url","/docs/integrations/kafka-plugin","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,33 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/kafka-plugin.mdx","url","/docs/integrations/kafka-plugin","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,34 [...]
diff --git a/output/docs/integrations/kafka-plugin/index.html b/output/docs/integrations/kafka-plugin/index.html
index 6f41e70e..2f2c24a6 100644
--- a/output/docs/integrations/kafka-plugin/index.html
+++ b/output/docs/integrations/kafka-plugin/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/producer_consumer-DjmJXk5s.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as= [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/assets/producer_consumer-DjmJXk5s.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as= [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -84,11 +84,11 @@ instructions <a href="/docs/fundamentals/building" data-discover="true">here</a>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/kafka-plugin.mdx\",\"url\",\"/docs/integrations/kafka-plugin\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/kafka-plugin.mdx\",\"url\",\"/docs/integrations/kafka-plugin\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7 [...]
\ No newline at end of file
diff --git a/output/docs/integrations/map-reduce-integration.data b/output/docs/integrations/map-reduce-integration.data
index c84b43b8..19555396 100644
--- a/output/docs/integrations/map-reduce-integration.data
+++ b/output/docs/integrations/map-reduce-integration.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/map-reduce-integration.mdx","url","/docs/integrations/map-reduce-integration","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/map-reduce-integration.mdx","url","/docs/integrations/map-reduce-integration","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49 [...]
diff --git a/output/docs/integrations/map-reduce-integration/index.html b/output/docs/integrations/map-reduce-integration/index.html
index 25cfb2a8..275c323e 100644
--- a/output/docs/integrations/map-reduce-integration/index.html
+++ b/output/docs/integrations/map-reduce-integration/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -176,11 +176,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/map-reduce-integration.mdx\",\"url\",\"/docs/integrations/map-reduce-integration\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/map-reduce-integration.mdx\",\"url\",\"/docs/integrations/map-reduce-integration\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\ [...]
\ No newline at end of file
diff --git a/output/docs/integrations/phoenix-dynamodb.data b/output/docs/integrations/phoenix-dynamodb.data
index c6f1c59a..f89dce37 100644
--- a/output/docs/integrations/phoenix-dynamodb.data
+++ b/output/docs/integrations/phoenix-dynamodb.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/phoenix-dynamodb.mdx","url","/docs/integrations/phoenix-dynamodb","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,11 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/phoenix-dynamodb.mdx","url","/docs/integrations/phoenix-dynamodb","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,11 [...]
diff --git a/output/docs/integrations/phoenix-dynamodb/index.html b/output/docs/integrations/phoenix-dynamodb/index.html
index d181617c..2074baa4 100644
--- a/output/docs/integrations/phoenix-dynamodb/index.html
+++ b/output/docs/integrations/phoenix-dynamodb/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -54,11 +54,11 @@ SQL surface, not just whatever subset the DynamoDB API maps onto.</p>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/phoenix-dynamodb.mdx\",\"url\",\"/docs/integrations/phoenix-dynamodb\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/phoenix-dynamodb.mdx\",\"url\",\"/docs/integrations/phoenix-dynamodb\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\" [...]
\ No newline at end of file
diff --git a/output/docs/integrations/pig-integration.data b/output/docs/integrations/pig-integration.data
index 80e35463..e1350eb3 100644
--- a/output/docs/integrations/pig-integration.data
+++ b/output/docs/integrations/pig-integration.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/pig-integration.mdx","url","/docs/integrations/pig-integration","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/pig-integration.mdx","url","/docs/integrations/pig-integration","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115, [...]
diff --git a/output/docs/integrations/pig-integration/index.html b/output/docs/integrations/pig-integration/index.html
index 23b14566..498e7e4c 100644
--- a/output/docs/integrations/pig-integration/index.html
+++ b/output/docs/integrations/pig-integration/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -82,11 +82,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/pig-integration.mdx\",\"url\",\"/docs/integrations/pig-integration\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_2 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/pig-integration.mdx\",\"url\",\"/docs/integrations/pig-integration\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_2 [...]
\ No newline at end of file
diff --git a/output/docs/integrations/python-driver.data b/output/docs/integrations/python-driver.data
index d8983b2b..f169db10 100644
--- a/output/docs/integrations/python-driver.data
+++ b/output/docs/integrations/python-driver.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/python-driver.mdx","url","/docs/integrations/python-driver","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/python-driver.mdx","url","/docs/integrations/python-driver","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289, [...]
diff --git a/output/docs/integrations/python-driver/index.html b/output/docs/integrations/python-driver/index.html
index db3bfdde..50cd6c9b 100644
--- a/output/docs/integrations/python-driver/index.html
+++ b/output/docs/integrations/python-driver/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -71,11 +71,11 @@ repository.</p>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/python-driver.mdx\",\"url\",\"/docs/integrations/python-driver\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/python-driver.mdx\",\"url\",\"/docs/integrations/python-driver\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\": [...]
\ No newline at end of file
diff --git a/output/docs/integrations/spark-integration.data b/output/docs/integrations/spark-integration.data
index cbcef5e2..292b2c9e 100644
--- a/output/docs/integrations/spark-integration.data
+++ b/output/docs/integrations/spark-integration.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/spark-integration.mdx","url","/docs/integrations/spark-integration","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/integrations/spark-integration.mdx","url","/docs/integrations/spark-integration","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66, [...]
diff --git a/output/docs/integrations/spark-integration/index.html b/output/docs/integrations/spark-integration/index.html
index fb190195..cce39eb6 100644
--- a/output/docs/integrations/spark-integration/index.html
+++ b/output/docs/integrations/spark-integration/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -450,11 +450,11 @@ correspond to the Java types Phoenix supports <a href="/docs/datatypes" data-dis
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/spark-integration.mdx\",\"url\",\"/docs/integrations/spark-integration\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22, [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/integrations/spark-integration.mdx\",\"url\",\"/docs/integrations/spark-integration\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22, [...]
\ No newline at end of file
diff --git a/output/docs/joins.data b/output/docs/joins.data
index bea0e9a2..60f64d06 100644
--- a/output/docs/joins.data
+++ b/output/docs/joins.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/joins.mdx","url","/docs/joins","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,337,371,400,403,409,415,421,427,433,437,44 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/joins.mdx","url","/docs/joins","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,343,377,406,409,415,421,427,433,439,443,44 [...]
diff --git a/output/docs/joins/index.html b/output/docs/joins/index.html
index da5e79d2..07593bb5 100644
--- a/output/docs/joins/index.html
+++ b/output/docs/joins/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -198,11 +198,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/joins.mdx\",\"url\",\"/docs/joins\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":27,\"_11\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/joins.mdx\",\"url\",\"/docs/joins\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":27,\"_11\ [...]
\ No newline at end of file
diff --git a/output/docs/quick-start.data b/output/docs/quick-start.data
index b33645b3..e2333e4e 100644
--- a/output/docs/quick-start.data
+++ b/output/docs/quick-start.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/quick-start.mdx","url","/docs/quick-start","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,47,54,61,64,113,281,335,369,398,401,407,413,419,42 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/quick-start.mdx","url","/docs/quick-start","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,47,54,61,64,113,287,341,375,404,407,413,419,425,43 [...]
diff --git a/output/docs/quick-start/index.html b/output/docs/quick-start/index.html
index 45952896..23774b03 100644
--- a/output/docs/quick-start/index.html
+++ b/output/docs/quick-start/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -90,11 +90,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/quick-start.mdx\",\"url\",\"/docs/quick-start\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/quick-start.mdx\",\"url\",\"/docs/quick-start\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15 [...]
\ No newline at end of file
diff --git a/output/docs/sequences.data b/output/docs/sequences.data
index 30f7d56d..0a2d43c2 100644
--- a/output/docs/sequences.data
+++ b/output/docs/sequences.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/sequences.mdx","url","/docs/sequences","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,337,371,400,403,409,415,421,427,43 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/sequences.mdx","url","/docs/sequences","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,343,377,406,409,415,421,427,433,43 [...]
diff --git a/output/docs/sequences/index.html b/output/docs/sequences/index.html
index 42bf4672..8dd83d07 100644
--- a/output/docs/sequences/index.html
+++ b/output/docs/sequences/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -56,11 +56,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/sequences.mdx\",\"url\",\"/docs/sequences\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":2 [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/sequences.mdx\",\"url\",\"/docs/sequences\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":2 [...]
\ No newline at end of file
diff --git a/output/docs/single-page.data b/output/docs/single-page.data
index 6063638a..5d773419 100644
--- a/output/docs/single-page.data
+++ b/output/docs/single-page.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","single-page/index.mdx","url","/docs/single-page","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,460],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":457,"_39":458},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,337,371,400,403,409,415,421,427,433,4 [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","single-page/index.mdx","url","/docs/single-page","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,466],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":463,"_39":464},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,343,377,406,409,415,421,427,433,439,4 [...]
diff --git a/output/docs/single-page/index.html b/output/docs/single-page/index.html
index 38797138..e263eaeb 100644
--- a/output/docs/single-page/index.html
+++ b/output/docs/single-page/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><link rel="preload" as="image" href="/assets/sqlline-h05veEny.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="imag [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><link rel="preload" as="image" href="/assets/sqlline-h05veEny.png" imageSizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" fetchPriority="auto"/><link rel="preload" as="imag [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -14,7 +14,7 @@
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMe [...]
"sidebar toc-popover toc"
- "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
+ "sidebar main toc" 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[tran [...]
<img alt="Apache Phoenix logo" src="/images/logo.svg" fetchPriority="auto" sizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" class="rounded-lg w-1/2 dark:hidden"/>
<img alt="Apache Phoenix logo" src="/images/dark-theme-logo.svg" fetchPriority="auto" sizes="(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px" class="rounded-lg hidden w-1/2 dark:block"/>
<p class="wrap-anywhere"><strong>OLTP and operational analytics for Apache Hadoop</strong></p>
@@ -2345,6 +2345,60 @@ standard index hint:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> users</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> email </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'jane@example.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre></div></figure>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="partial-indexes"><a data-card="" href="#partial-indexes" class="peer">Partial Indexes</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.5 [...]
+<p class="wrap-anywhere">A <strong>partial index</strong> indexes only the rows of the data table that satisfy a SQL
+boolean predicate, supplied at <code>CREATE INDEX</code> time via a <code>WHERE</code> clause. The
+index is smaller, writes that don't affect the predicate are cheaper, and the
+planner only uses it for queries whose own predicate implies the index's. Added
+in <a href="https://issues.apache.org/jira/browse/PHOENIX-7032">PHOENIX-7032</a>.</p>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="partial-indexes-when"><a data-card="" href="#partial-indexes-when" class="peer">When to choose a partial index</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d [...]
+<p class="wrap-anywhere">Reach for a partial index when the workload reads a small, well-defined slice of
+a much larger table — and that slice is identifiable by a SQL predicate. Common
+shapes:</p>
+<ul>
+<li><em>Open / active records</em>: <code>WHERE status IN ('OPEN', 'PENDING')</code> on a table that
+also stores closed records.</li>
+<li><em>Recent rows</em>: <code>WHERE created_at > DATE '2024-01-01'</code>.</li>
+<li><em>Hot tier</em>: <code>WHERE priority >= 5</code> for paging / alerting workloads.</li>
+<li><em>Failure investigation</em>: <code>WHERE result = 'FAIL'</code> on a successful-most-of-the-time
+table.</li>
+</ul>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="partial-indexes-usage"><a data-card="" href="#partial-indexes-usage" class="peer">Creating a partial index</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M1 [...]
+<p class="wrap-anywhere">The DDL is a regular <code>CREATE INDEX</code> with a trailing <code>WHERE</code> clause. Both
+<strong>covered</strong> and <strong>uncovered</strong> global indexes can be partial:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ON</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> orders (customer_id, created_at)</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> INCLUDE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (total_amount)</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> WHERE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> status</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> IN</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'OPEN'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9 [...]
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">CREATE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> UNCOVERED </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">INDEX</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> idx_failed_jobs</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ON</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> jobs (created_at)</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'FAIL'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre></div></figure>
+<p class="wrap-anywhere">The planner uses the index for any query whose <code>WHERE</code> clause implies the
+index's predicate:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> customer_id, total_amount</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> orders</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> status</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'OPEN'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> AND</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> created_at </span><span style="--shiki-light:#D73A49;--shiki [...]
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="partial-indexes-mutations"><a data-card="" href="#partial-indexes-mutations" class="peer">Mutations that cross the predicate</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden= [...]
+<p class="wrap-anywhere">Partial indexes correctly maintain themselves when a mutation moves a row into
+or out of the predicate, including under <code>ON DUPLICATE KEY UPDATE</code>:</p>
+<ul>
+<li>A row that <strong>starts</strong> satisfying the predicate after an update has its index
+row created.</li>
+<li>A row that <strong>stops</strong> satisfying the predicate after an update has its index
+row removed.</li>
+</ul>
+<p class="wrap-anywhere">This means a partial index stays consistent for a workload like <em>"close an
+order"</em> even though that operation flips the row out of the index's covered
+slice.</p>
+<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="partial-indexes-limitations"><a data-card="" href="#partial-indexes-limitations" class="peer">Limitations</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 [...]
+<ul>
+<li><strong>Local partial indexes are not supported</strong> — only global (covered or
+uncovered) partial indexes work today.</li>
+<li>The <code>WHERE</code> predicate is fixed at <code>CREATE INDEX</code> time. To change it, drop and
+recreate the index.</li>
+</ul>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="index-population"><a data-card="" href="#index-population" class="peer">Index Population</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.5 [...]
<p class="wrap-anywhere">By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the <code>ASYNC</code> keyword in the index creation DDL statement:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
@@ -2848,7 +2902,6 @@ existing rows.</li>
does not handle atomicity unless the latest value is being updated.</li>
<li>The same column should not be updated more than once in the same statement.</li>
<li>No aggregation or references to sequences are allowed within the clause.</li>
-<li>Global indexes on columns being atomically updated are not supported, as potentially a separate RPC across the wire would be made while the row is under lock to maintain the secondary index.</li>
</ul>
<hr/>
<h1 class="font-bold" id="namespace-mapping">Namespace Mapping</h1>
@@ -3011,6 +3064,75 @@ on the data should be used to drive query parallelization.</li>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> METRICS_ID, METRIC_VALUE </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> SOURCE_METRICS_TABLE</span></span></code></pre></div></figure>
<p class="wrap-anywhere">This sets <code>CREATED_DATE</code> in the destination table to the server timestamp.</p>
<p class="wrap-anywhere">When querying with filters on the row timestamp column, Phoenix performs its usual row-key optimizations and can also set scan min/max time ranges appropriately. Using this time range information, HBase can skip store files that do not fall in the target time range, which significantly improves performance, especially for tail-end data queries.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="see-also"><a data-card="" href="#see-also" class="peer">See also</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07- [...]
+<p class="wrap-anywhere">The <a href="#phoenix-row-timestamp"><code>PHOENIX_ROW_TIMESTAMP()</code></a> function lets you read the underlying HBase row timestamp on any Phoenix table — even one without a declared <code>ROW_TIMESTAMP</code> column — and is indexable for fast time-bounded queries.</p>
+<hr/>
+<h1 class="font-bold" id="phoenix-row-timestamp">PHOENIX_ROW_TIMESTAMP</h1>
+<p class="wrap-anywhere"><code>PHOENIX_ROW_TIMESTAMP()</code> is a built-in SQL function that returns the <strong>timestamp
+of the row's empty column</strong>, which Phoenix updates automatically on every write.
+It's effectively the row's <strong>last-modified time</strong>, available on any Phoenix table
+without you having to declare or manage a timestamp column yourself. The return
+type is <code>DATE</code>.</p>
+<p class="wrap-anywhere">It can be used in three places, and the third one is what makes it especially
+powerful:</p>
+<ol>
+<li>As a projection in <code>SELECT</code>.</li>
+<li>As a predicate in <code>WHERE</code> (and <code>JOIN</code>) clauses.</li>
+<li>As the indexed expression in a <a href="#functional-indexes">functional index</a>, which makes time-bounded reads fast even when the table isn't ordered by time.</li>
+</ol>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="phoenix-row-timestamp-read"><a data-card="" href="#phoenix-row-timestamp-read" class="peer">Reading the row timestamp</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"> [...]
+<p class="wrap-anywhere">Project it like any other column:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP(), id, payload </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events;</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">-- Combine with regular row data.</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">AS</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> modified_at,</span></span>
+<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> payload</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> region </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'us-west-2'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre></div></figure>
+<p class="wrap-anywhere">The function takes no arguments and is evaluated server-side from the empty cell
+that Phoenix already maintains for every row.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="phoenix-row-timestamp-where"><a data-card="" href="#phoenix-row-timestamp-where" class="peer">In WHERE predicates</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><pat [...]
+<p class="wrap-anywhere">Use it to bound queries by mutation time, including incremental "what changed
+since" patterns:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> CURRENT_DATE() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span><span style="--shiki-light:#24292E;- [...]
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">-- Pull a window for an incremental consumer.</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id, payload</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ?</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> AND</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"><</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ?</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ORDER BY</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ASC</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre></div></figure>
+<p class="wrap-anywhere">Without an index, these predicates require a scan of the table. The next section
+fixes that.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="phoenix-row-timestamp-index"><a data-card="" href="#phoenix-row-timestamp-index" class="peer">Indexing on PHOENIX_ROW_TIMESTAMP()</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hi [...]
+<p class="wrap-anywhere">Create a <a href="#functional-indexes">functional index</a>
+on the function to make time-bounded reads fast. Phoenix can then seek directly
+on the indexed timestamp instead of scanning the data table:</p>
+<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-c [...]
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ON</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events (PHOENIX_ROW_TIMESTAMP())</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> INCLUDE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (payload);</span></span>
+<span class="line"></span>
+<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">-- Phoenix uses the index for this query.</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SELECT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id, payload</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> events</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">WHERE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ?</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> AND</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"><</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ?</span></span>
+<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ORDER BY</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PHOENIX_ROW_TIMESTAMP() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ASC</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span></code></pre></div></figure>
+<p class="wrap-anywhere">This is the typical recipe for "scan rows changed in the last N minutes" type
+queries on a table whose primary key isn't time-ordered. Pair with
+<a href="#uncovered-indexes">uncovered indexes</a> when you
+don't want to duplicate payload columns into the index.</p>
+<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="phoenix-row-timestamp-vs-row-timestamp"><a data-card="" href="#phoenix-row-timestamp-vs-row-timestamp" class="peer">Relationship to ROW_TIMESTAMP column</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hov [...]
+<p class="wrap-anywhere">Two related concepts share the word "timestamp" — they are not the same:</p>
+<div class="relative overflow-auto prose-no-margin my-6"><table><thead><tr><th>Feature</th><th>Direction</th><th>What it does</th></tr></thead><tbody><tr><td><a href="#row-timestamp-column"><code>ROW_TIMESTAMP</code> column</a></td><td>Write</td><td>Designate a primary-key column whose value is <em>written into</em> the underlying HBase row timestamp.</td></tr><tr><td><code>PHOENIX_ROW_TIMESTAMP()</code> function</td><td>Read</td><td>Return the underlying HBase row timestamp Phoenix alre [...]
+<p class="wrap-anywhere"><code>PHOENIX_ROW_TIMESTAMP()</code> works on <strong>any</strong> Phoenix table, regardless of whether
+you've declared a <code>ROW_TIMESTAMP</code> column. If you have declared one, both
+mechanisms read/write the same underlying timestamp, so <code>PHOENIX_ROW_TIMESTAMP()</code>
+returns the value of the <code>ROW_TIMESTAMP</code> column for that row.</p>
<hr/>
<h1 class="font-bold" id="paged-queries">Paged Queries</h1>
<p class="wrap-anywhere">Phoenix supports standard SQL constructs to enable paged queries:</p>
@@ -20835,7 +20957,7 @@ To avoid this, <a href="https://central.sonatype.org/publish/release/#locate-and
<p class="wrap-anywhere">Bulk close JIRAs that were marked for the release fixVersion.</p>
</li>
</ol>
-<p class="wrap-anywhere"><strong>Congratulations!</strong></p></div><a href="https://github.com/apache/phoenix-site/edit/asf-site//app/pages/_docs/docs/_mdx/(multi-page)/" rel="noreferrer noopener" target="_blank" class="no-print text-fd-secondary-foreground bg-fd-secondary hover:text-fd-accent-foreground hover:bg-fd-accent w-fit rounded-xl border p-2 text-sm font-medium transition-colors">Edit on GitHub</a><div class="@container grid gap-4 grid-cols-1"></div></article><div id="nd-toc" c [...]
+<p class="wrap-anywhere"><strong>Congratulations!</strong></p></div><a href="https://github.com/apache/phoenix-site/edit/asf-site//app/pages/_docs/docs/_mdx/(multi-page)/" rel="noreferrer noopener" target="_blank" class="no-print text-fd-secondary-foreground bg-fd-secondary hover:text-fd-accent-foreground hover:bg-fd-accent w-fit rounded-xl border p-2 text-sm font-medium transition-colors">Edit on GitHub</a><div class="@container grid gap-4 grid-cols-1"></div></article><div id="nd-toc" c [...]
if (!window.history.state || !window.history.state.key) {
let key = Math.random().toString(32).slice(2);
window.history.replaceState({ key }, "");
@@ -20850,11 +20972,11 @@ To avoid this, <a href="https://central.sonatype.org/publish/release/#locate-and
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"single-page/index.mdx\",\"url\",\"/docs/single-page\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,460],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":27,\ [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"single-page/index.mdx\",\"url\",\"/docs/single-page\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,466],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\":27,\ [...]
\ No newline at end of file
diff --git a/output/docs/subqueries.data b/output/docs/subqueries.data
index de2c9469..14a41aae 100644
--- a/output/docs/subqueries.data
+++ b/output/docs/subqueries.data
@@ -1 +1 @@
-[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/subqueries.mdx","url","/docs/subqueries","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,458],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":455,"_39":456},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,283,337,371,400,403,409,415,421,427, [...]
+[{"_1":2},"routes/_docs/docs",{"_3":4},"data",{"_5":6,"_7":8,"_9":10},"path","(multi-page)/subqueries.mdx","url","/docs/subqueries","tree",{"_11":12,"_13":14,"_15":16},"$id","root","name","Docs","children",[17,464],{"_18":19,"_13":20,"_21":-7,"_12":22,"_23":-7,"_24":25,"_26":-7,"_15":27,"_11":461,"_39":462},"type","folder","Multi-Page Documentation","icon",true,"defaultOpen","description","Split across multiple pages","index",[28,32,42,49,56,63,66,115,289,343,377,406,409,415,421,427,433, [...]
diff --git a/output/docs/subqueries/index.html b/output/docs/subqueries/index.html
index 8ffb4248..8d497b19 100644
--- a/output/docs/subqueries/index.html
+++ b/output/docs/subqueries/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="mo [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="mo [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -136,11 +136,11 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/docs-layout-Ezb4kvRE.js";
-import * as route2 from "/assets/docs-CUpgRa_K.js";
+import * as route2 from "/assets/docs-DPQsvOfn.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
-import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_471\":-5,\"_472\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/subqueries.mdx\",\"url\",\"/docs/subqueries\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,458],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\" [...]
\ No newline at end of file
+import("/assets/entry.client-_CVK9qYI.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_477\":-5,\"_478\":-5},\"loaderData\",{\"_3\":4},\"routes/_docs/docs\",{\"_5\":6,\"_7\":8,\"_9\":10},\"path\",\"(multi-page)/subqueries.mdx\",\"url\",\"/docs/subqueries\",\"tree\",{\"_11\":12,\"_13\":14,\"_15\":16},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[17,464],{\"_18\":19,\"_13\":20,\"_21\":-7,\"_12\":22,\"_23\":-7,\"_24\":25,\"_26\":-7,\"_15\" [...]
\ No newline at end of file
diff --git a/output/downloads/index.html b/output/downloads/index.html
index 7e07bd3e..6468fc83 100644
--- a/output/downloads/index.html
+++ b/output/downloads/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Downloads - Apache Phoenix</title><meta name="description" content="Download Apache Phoenix releases, connectors, and operator tools with verification hashes and signatures."/><link rel="preload" as="font" href="/fonts/inter-latin-wg [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Downloads - Apache Phoenix</title><meta name="description" content="Download Apache Phoenix releases, connectors, and operator tools with verification hashes and signatures."/><link rel="preload" as="font" href="/fonts/inter-latin-wg [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -50,7 +50,7 @@ Current release 5.3.0 can run on Apache HBase 2.5 and 2.6 versions.</p>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/downloads-nPTKAI2k.js";
diff --git a/output/index.html b/output/index.html
index c9f26585..13b9a26d 100644
--- a/output/index.html
+++ b/output/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Apache Phoenix</title><meta name="description" content="Query HBase with standard SQL and JDBC. Low latency OLTP and operational analytics for Hadoop."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type=" [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Apache Phoenix</title><meta name="description" content="Query HBase with standard SQL and JDBC. Low latency OLTP and operational analytics for Hadoop."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type=" [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -27,7 +27,7 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/home-Dymhx5Xx.js";
diff --git a/output/issues-tracking/index.html b/output/issues-tracking/index.html
index 175edbac..00700b7f 100644
--- a/output/issues-tracking/index.html
+++ b/output/issues-tracking/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Issue Tracking - Apache Phoenix</title><meta name="description" content="Track issues, bugs, and feature requests for Apache Phoenix."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" cross [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Issue Tracking - Apache Phoenix</title><meta name="description" content="Track issues, bugs, and feature requests for Apache Phoenix."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" cross [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -35,7 +35,7 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/issues-tracking-D2UNn17s.js";
diff --git a/output/llms-full.txt b/output/llms-full.txt
index 4fa1db08..1b9f0f0e 100644
--- a/output/llms-full.txt
+++ b/output/llms-full.txt
@@ -1994,7 +1994,6 @@ The following limitations are enforced for the `ON DUPLICATE KEY` clause usage:
does not handle atomicity unless the latest value is being updated.
* The same column should not be updated more than once in the same statement.
* No aggregation or references to sequences are allowed within the clause.
-* Global indexes on columns being atomically updated are not supported, as potentially a separate RPC across the wire would be made while the row is under lock to maintain the secondary index.
# Document Data: BSON (/docs/features/bson)
@@ -3080,6 +3079,99 @@ LIMIT 10 OFFSET 10
`OFFSET` reads and skips rows on either the server or client depending on query type, whereas RVC is more effective for queries on the primary key axis because it can start directly from the provided key.
+# PHOENIX_ROW_TIMESTAMP() (/docs/features/phoenix-row-timestamp)
+`PHOENIX_ROW_TIMESTAMP()` is a built-in SQL function that returns the **timestamp
+of the row's empty column**, which Phoenix updates automatically on every write.
+It's effectively the row's **last-modified time**, available on any Phoenix table
+without you having to declare or manage a timestamp column yourself. The return
+type is `DATE`.
+
+It can be used in three places, and the third one is what makes it especially
+powerful:
+
+1. As a projection in `SELECT`.
+2. As a predicate in `WHERE` (and `JOIN`) clauses.
+3. As the indexed expression in a [functional index](/docs/features/secondary-indexes#functional-indexes), which makes time-bounded reads fast even when the table isn't ordered by time.
+
+## Reading the row timestamp
+
+Project it like any other column:
+
+```sql
+-- Last-modified time of every row.
+SELECT PHOENIX_ROW_TIMESTAMP(), id, payload FROM events;
+
+-- Combine with regular row data.
+SELECT id,
+ PHOENIX_ROW_TIMESTAMP() AS modified_at,
+ payload
+FROM events
+WHERE region = 'us-west-2';
+```
+
+The function takes no arguments and is evaluated server-side from the empty cell
+that Phoenix already maintains for every row.
+
+## In WHERE predicates
+
+Use it to bound queries by mutation time, including incremental "what changed
+since" patterns:
+
+```sql
+-- Rows modified in the last hour.
+SELECT * FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() > CURRENT_DATE() - 1.0 / 24;
+
+-- Pull a window for an incremental consumer.
+SELECT id, payload
+FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() >= ?
+ AND PHOENIX_ROW_TIMESTAMP() < ?
+ORDER BY PHOENIX_ROW_TIMESTAMP() ASC;
+```
+
+Without an index, these predicates require a scan of the table. The next section
+fixes that.
+
+## Indexing on PHOENIX\_ROW\_TIMESTAMP()
+
+Create a [functional index](/docs/features/secondary-indexes#functional-indexes)
+on the function to make time-bounded reads fast. Phoenix can then seek directly
+on the indexed timestamp instead of scanning the data table:
+
+```sql
+CREATE INDEX events_by_modified
+ ON events (PHOENIX_ROW_TIMESTAMP())
+ INCLUDE (payload);
+
+-- Phoenix uses the index for this query.
+SELECT id, payload
+FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() >= ?
+ AND PHOENIX_ROW_TIMESTAMP() < ?
+ORDER BY PHOENIX_ROW_TIMESTAMP() ASC;
+```
+
+This is the typical recipe for "scan rows changed in the last N minutes" type
+queries on a table whose primary key isn't time-ordered. Pair with
+[uncovered indexes](/docs/features/secondary-indexes#uncovered-indexes) when you
+don't want to duplicate payload columns into the index.
+
+## Relationship to ROW\_TIMESTAMP column
+
+Two related concepts share the word "timestamp" — they are not the same:
+
+| Feature | Direction | What it does |
+| ------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------ |
+| [`ROW_TIMESTAMP` column](/docs/features/row-timestamp-column) | Write | Designate a primary-key column whose value is *written into* the underlying HBase row timestamp. |
+| `PHOENIX_ROW_TIMESTAMP()` function | Read | Return the underlying HBase row timestamp Phoenix already maintains on every row's empty cell. |
+
+`PHOENIX_ROW_TIMESTAMP()` works on **any** Phoenix table, regardless of whether
+you've declared a `ROW_TIMESTAMP` column. If you have declared one, both
+mechanisms read/write the same underlying timestamp, so `PHOENIX_ROW_TIMESTAMP()`
+returns the value of the `ROW_TIMESTAMP` column for that row.
+
+
# Query Server (/docs/features/query-server)
The Phoenix Query Server provides an alternative means for interaction with
Phoenix and HBase.
@@ -3412,6 +3504,10 @@ This sets `CREATED_DATE` in the destination table to the server timestamp.
When querying with filters on the row timestamp column, Phoenix performs its usual row-key optimizations and can also set scan min/max time ranges appropriately. Using this time range information, HBase can skip store files that do not fall in the target time range, which significantly improves performance, especially for tail-end data queries.
+## See also
+
+The [`PHOENIX_ROW_TIMESTAMP()`](/docs/features/phoenix-row-timestamp) function lets you read the underlying HBase row timestamp on any Phoenix table — even one without a declared `ROW_TIMESTAMP` column — and is indexable for fast time-bounded queries.
+
# Salted Tables (/docs/features/salted-tables)
Sequential writes in HBase may suffer from region server hotspotting if your row key is monotonically increasing. Salting the row key helps mitigate this problem. See [this article](http://blog.sematext.com/2012/04/09/hbasewd-avoid-regionserver-hotspotting-despite-writing-records-with-sequential-keys/) for details.
@@ -3549,6 +3645,74 @@ FROM users
WHERE email = 'jane@example.com';
```
+## Partial Indexes
+
+A **partial index** indexes only the rows of the data table that satisfy a SQL
+boolean predicate, supplied at `CREATE INDEX` time via a `WHERE` clause. The
+index is smaller, writes that don't affect the predicate are cheaper, and the
+planner only uses it for queries whose own predicate implies the index's. Added
+in [PHOENIX-7032](https://issues.apache.org/jira/browse/PHOENIX-7032).
+
+### When to choose a partial index
+
+Reach for a partial index when the workload reads a small, well-defined slice of
+a much larger table — and that slice is identifiable by a SQL predicate. Common
+shapes:
+
+* *Open / active records*: `WHERE status IN ('OPEN', 'PENDING')` on a table that
+ also stores closed records.
+* *Recent rows*: `WHERE created_at > DATE '2024-01-01'`.
+* *Hot tier*: `WHERE priority >= 5` for paging / alerting workloads.
+* *Failure investigation*: `WHERE result = 'FAIL'` on a successful-most-of-the-time
+ table.
+
+### Creating a partial index
+
+The DDL is a regular `CREATE INDEX` with a trailing `WHERE` clause. Both
+**covered** and **uncovered** global indexes can be partial:
+
+```sql
+CREATE INDEX idx_open_orders
+ ON orders (customer_id, created_at)
+ INCLUDE (total_amount)
+ WHERE status IN ('OPEN', 'PENDING');
+
+CREATE UNCOVERED INDEX idx_failed_jobs
+ ON jobs (created_at)
+ WHERE result = 'FAIL';
+```
+
+The planner uses the index for any query whose `WHERE` clause implies the
+index's predicate:
+
+```sql
+-- Uses idx_open_orders (status IN ('OPEN','PENDING') is implied).
+SELECT customer_id, total_amount
+FROM orders
+WHERE status = 'OPEN' AND created_at >= ?;
+```
+
+### Mutations that cross the predicate
+
+Partial indexes correctly maintain themselves when a mutation moves a row into
+or out of the predicate, including under `ON DUPLICATE KEY UPDATE`:
+
+* A row that **starts** satisfying the predicate after an update has its index
+ row created.
+* A row that **stops** satisfying the predicate after an update has its index
+ row removed.
+
+This means a partial index stays consistent for a workload like *"close an
+order"* even though that operation flips the row out of the index's covered
+slice.
+
+### Limitations
+
+* **Local partial indexes are not supported** — only global (covered or
+ uncovered) partial indexes work today.
+* The `WHERE` predicate is fixed at `CREATE INDEX` time. To change it, drop and
+ recreate the index.
+
## Index Population
By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the `ASYNC` keyword in the index creation DDL statement:
@@ -14621,6 +14785,74 @@ FROM users
WHERE email = 'jane@example.com';
```
+## Partial Indexes
+
+A **partial index** indexes only the rows of the data table that satisfy a SQL
+boolean predicate, supplied at `CREATE INDEX` time via a `WHERE` clause. The
+index is smaller, writes that don't affect the predicate are cheaper, and the
+planner only uses it for queries whose own predicate implies the index's. Added
+in [PHOENIX-7032](https://issues.apache.org/jira/browse/PHOENIX-7032).
+
+### When to choose a partial index
+
+Reach for a partial index when the workload reads a small, well-defined slice of
+a much larger table — and that slice is identifiable by a SQL predicate. Common
+shapes:
+
+* *Open / active records*: `WHERE status IN ('OPEN', 'PENDING')` on a table that
+ also stores closed records.
+* *Recent rows*: `WHERE created_at > DATE '2024-01-01'`.
+* *Hot tier*: `WHERE priority >= 5` for paging / alerting workloads.
+* *Failure investigation*: `WHERE result = 'FAIL'` on a successful-most-of-the-time
+ table.
+
+### Creating a partial index
+
+The DDL is a regular `CREATE INDEX` with a trailing `WHERE` clause. Both
+**covered** and **uncovered** global indexes can be partial:
+
+```sql
+CREATE INDEX idx_open_orders
+ ON orders (customer_id, created_at)
+ INCLUDE (total_amount)
+ WHERE status IN ('OPEN', 'PENDING');
+
+CREATE UNCOVERED INDEX idx_failed_jobs
+ ON jobs (created_at)
+ WHERE result = 'FAIL';
+```
+
+The planner uses the index for any query whose `WHERE` clause implies the
+index's predicate:
+
+```sql
+-- Uses idx_open_orders (status IN ('OPEN','PENDING') is implied).
+SELECT customer_id, total_amount
+FROM orders
+WHERE status = 'OPEN' AND created_at >= ?;
+```
+
+### Mutations that cross the predicate
+
+Partial indexes correctly maintain themselves when a mutation moves a row into
+or out of the predicate, including under `ON DUPLICATE KEY UPDATE`:
+
+* A row that **starts** satisfying the predicate after an update has its index
+ row created.
+* A row that **stops** satisfying the predicate after an update has its index
+ row removed.
+
+This means a partial index stays consistent for a workload like *"close an
+order"* even though that operation flips the row out of the index's covered
+slice.
+
+### Limitations
+
+* **Local partial indexes are not supported** — only global (covered or
+ uncovered) partial indexes work today.
+* The `WHERE` predicate is fixed at `CREATE INDEX` time. To change it, drop and
+ recreate the index.
+
## Index Population
By default, when an index is created, it is populated synchronously during the CREATE INDEX call. This may not be feasible depending on the current size of the data table. As of 4.5, initially population of an index may be done asynchronously by including the `ASYNC` keyword in the index creation DDL statement:
@@ -15318,7 +15550,6 @@ The following limitations are enforced for the `ON DUPLICATE KEY` clause usage:
does not handle atomicity unless the latest value is being updated.
* The same column should not be updated more than once in the same statement.
* No aggregation or references to sequences are allowed within the clause.
-* Global indexes on columns being atomically updated are not supported, as potentially a separate RPC across the wire would be made while the row is under lock to maintain the secondary index.
***
@@ -15568,6 +15799,105 @@ This sets `CREATED_DATE` in the destination table to the server timestamp.
When querying with filters on the row timestamp column, Phoenix performs its usual row-key optimizations and can also set scan min/max time ranges appropriately. Using this time range information, HBase can skip store files that do not fall in the target time range, which significantly improves performance, especially for tail-end data queries.
+## See also
+
+The [`PHOENIX_ROW_TIMESTAMP()`](/docs/features/phoenix-row-timestamp) function lets you read the underlying HBase row timestamp on any Phoenix table — even one without a declared `ROW_TIMESTAMP` column — and is indexable for fast time-bounded queries.
+
+***
+
+# PHOENIX\_ROW\_TIMESTAMP
+
+`PHOENIX_ROW_TIMESTAMP()` is a built-in SQL function that returns the **timestamp
+of the row's empty column**, which Phoenix updates automatically on every write.
+It's effectively the row's **last-modified time**, available on any Phoenix table
+without you having to declare or manage a timestamp column yourself. The return
+type is `DATE`.
+
+It can be used in three places, and the third one is what makes it especially
+powerful:
+
+1. As a projection in `SELECT`.
+2. As a predicate in `WHERE` (and `JOIN`) clauses.
+3. As the indexed expression in a [functional index](/docs/features/secondary-indexes#functional-indexes), which makes time-bounded reads fast even when the table isn't ordered by time.
+
+## Reading the row timestamp
+
+Project it like any other column:
+
+```sql
+-- Last-modified time of every row.
+SELECT PHOENIX_ROW_TIMESTAMP(), id, payload FROM events;
+
+-- Combine with regular row data.
+SELECT id,
+ PHOENIX_ROW_TIMESTAMP() AS modified_at,
+ payload
+FROM events
+WHERE region = 'us-west-2';
+```
+
+The function takes no arguments and is evaluated server-side from the empty cell
+that Phoenix already maintains for every row.
+
+## In WHERE predicates
+
+Use it to bound queries by mutation time, including incremental "what changed
+since" patterns:
+
+```sql
+-- Rows modified in the last hour.
+SELECT * FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() > CURRENT_DATE() - 1.0 / 24;
+
+-- Pull a window for an incremental consumer.
+SELECT id, payload
+FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() >= ?
+ AND PHOENIX_ROW_TIMESTAMP() < ?
+ORDER BY PHOENIX_ROW_TIMESTAMP() ASC;
+```
+
+Without an index, these predicates require a scan of the table. The next section
+fixes that.
+
+## Indexing on PHOENIX\_ROW\_TIMESTAMP()
+
+Create a [functional index](/docs/features/secondary-indexes#functional-indexes)
+on the function to make time-bounded reads fast. Phoenix can then seek directly
+on the indexed timestamp instead of scanning the data table:
+
+```sql
+CREATE INDEX events_by_modified
+ ON events (PHOENIX_ROW_TIMESTAMP())
+ INCLUDE (payload);
+
+-- Phoenix uses the index for this query.
+SELECT id, payload
+FROM events
+WHERE PHOENIX_ROW_TIMESTAMP() >= ?
+ AND PHOENIX_ROW_TIMESTAMP() < ?
+ORDER BY PHOENIX_ROW_TIMESTAMP() ASC;
+```
+
+This is the typical recipe for "scan rows changed in the last N minutes" type
+queries on a table whose primary key isn't time-ordered. Pair with
+[uncovered indexes](/docs/features/secondary-indexes#uncovered-indexes) when you
+don't want to duplicate payload columns into the index.
+
+## Relationship to ROW\_TIMESTAMP column
+
+Two related concepts share the word "timestamp" — they are not the same:
+
+| Feature | Direction | What it does |
+| ------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------ |
+| [`ROW_TIMESTAMP` column](/docs/features/row-timestamp-column) | Write | Designate a primary-key column whose value is *written into* the underlying HBase row timestamp. |
+| `PHOENIX_ROW_TIMESTAMP()` function | Read | Return the underlying HBase row timestamp Phoenix already maintains on every row's empty cell. |
+
+`PHOENIX_ROW_TIMESTAMP()` works on **any** Phoenix table, regardless of whether
+you've declared a `ROW_TIMESTAMP` column. If you have declared one, both
+mechanisms read/write the same underlying timestamp, so `PHOENIX_ROW_TIMESTAMP()`
+returns the value of the `ROW_TIMESTAMP` column for that row.
+
***
# Paged Queries
diff --git a/output/llms-full.txt.data b/output/llms-full.txt.data
index cd7c42f6..6c9dae42 100644
--- a/output/llms-full.txt.data
+++ b/output/llms-full.txt.data
@@ -1 +1 @@
-[{"_1":2},"routes/_api/llms-full",{"_3":4},"data","# Phoenix Omid Transaction Manager (/docs/addons/phoenix-omid-transaction-manager)\nThe Apache Omid podling has recently decided to graduate as a sub-project of Apache Phoenix.\n\nThis graduation process is currently ongoing. Please follow the Apache Phoenix mailing lists\nfor more information about this effort.\n\n\n# Phoenix ORM library (/docs/addons/phoenix-orm-library)\n\n\n<img alt=\"PHO logo\" src={__img0} placeholder=\"blur\" />\n [...]
+[{"_1":2},"routes/_api/llms-full",{"_3":4},"data","# Phoenix Omid Transaction Manager (/docs/addons/phoenix-omid-transaction-manager)\nThe Apache Omid podling has recently decided to graduate as a sub-project of Apache Phoenix.\n\nThis graduation process is currently ongoing. Please follow the Apache Phoenix mailing lists\nfor more information about this effort.\n\n\n# Phoenix ORM library (/docs/addons/phoenix-orm-library)\n\n\n<img alt=\"PHO logo\" src={__img0} placeholder=\"blur\" />\n [...]
diff --git a/output/mailing-lists/index.html b/output/mailing-lists/index.html
index ff453965..f643d1ae 100644
--- a/output/mailing-lists/index.html
+++ b/output/mailing-lists/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Mailing Lists - Apache Phoenix</title><meta name="description" content="Subscribe to Apache Phoenix mailing lists including user, developer, commits, issues, and builds lists."/><link rel="preload" as="font" href="/fonts/inter-latin- [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Mailing Lists - Apache Phoenix</title><meta name="description" content="Subscribe to Apache Phoenix mailing lists including user, developer, commits, issues, and builds lists."/><link rel="preload" as="font" href="/fonts/inter-latin- [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -29,7 +29,7 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/mailing-lists-BSTnC29W.js";
diff --git a/output/news/index.html b/output/news/index.html
index 62f47eb4..03a82748 100644
--- a/output/news/index.html
+++ b/output/news/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>News - Apache Phoenix</title><meta name="description" content="Latest news, events, and releases for Apache Phoenix."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>News - Apache Phoenix</title><meta name="description" content="Latest news, events, and releases for Apache Phoenix."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -27,7 +27,7 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/news-C-JE5FJh.js";
diff --git a/output/phoenixcon-2018/index.html b/output/phoenixcon-2018/index.html
index 40aba445..69cb1d87 100644
--- a/output/phoenixcon-2018/index.html
+++ b/output/phoenixcon-2018/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="modulepreload" href="/assets/entry.client-_CVK9qYI.js" [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="modulepreload" href="/assets/entry.client-_CVK9qYI.js" [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -27,7 +27,7 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/phoenixcon-2018-E6RKkUUf.js";
diff --git a/output/phoenixcon-archives/index.html b/output/phoenixcon-archives/index.html
index 389fbe84..66721804 100644
--- a/output/phoenixcon-archives/index.html
+++ b/output/phoenixcon-archives/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-e852c125.js"/><link rel="modulepreload" href="/assets/entry.client-_CVK9qYI.js" [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-d1992ec0.js"/><link rel="modulepreload" href="/assets/entry.client-_CVK9qYI.js" [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -27,7 +27,7 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/phoenixcon-archives-BrA1WaaW.js";
diff --git a/output/presentations/index.html b/output/presentations/index.html
index 21eef328..6694059b 100644
--- a/output/presentations/index.html
+++ b/output/presentations/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Presentations - Apache Phoenix</title><meta name="description" content="Presentations and videos about Apache Phoenix from community events."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2 [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Presentations - Apache Phoenix</title><meta name="description" content="Presentations and videos about Apache Phoenix from community events."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2 [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -36,7 +36,7 @@ presentations about how they are using Apache Phoenix or new features coming to
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/presentations-qDW_RxDY.js";
diff --git a/output/recent-improvements/index.html b/output/recent-improvements/index.html
index ec2aec1b..e77bdef8 100644
--- a/output/recent-improvements/index.html
+++ b/output/recent-improvements/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Recent Improvements - Apache Phoenix</title><meta name="description" content="Recent updates and improvements of Apache Phoenix."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigi [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Recent Improvements - Apache Phoenix</title><meta name="description" content="Recent updates and improvements of Apache Phoenix."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigi [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -85,7 +85,7 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/recent-improvements-BVyGojk8.js";
diff --git a/output/release-notes/index.html b/output/release-notes/index.html
index 935460c0..17e5b3b6 100644
--- a/output/release-notes/index.html
+++ b/output/release-notes/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Release Notes - Apache Phoenix</title><meta name="description" content="Release notes and upgrade considerations for Apache Phoenix releases."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Release Notes - Apache Phoenix</title><meta name="description" content="Release notes and upgrade considerations for Apache Phoenix releases."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -115,7 +115,7 @@ impact on performance until the upgrade is performed.</p>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/release-notes-C6nU5G3H.js";
diff --git a/output/roadmap/index.html b/output/roadmap/index.html
index 155cb30e..5929722b 100644
--- a/output/roadmap/index.html
+++ b/output/roadmap/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Roadmap - Apache Phoenix</title><meta name="description" content="Roadmap of Apache Phoenix driven by the community."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Roadmap - Apache Phoenix</title><meta name="description" content="Roadmap of Apache Phoenix driven by the community."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -58,7 +58,7 @@ current plan for Phoenix:</p>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/roadmap-BQKYnSI0.js";
diff --git a/output/sitemap.xml b/output/sitemap.xml
index 4fc3b71b..b228234d 100644
--- a/output/sitemap.xml
+++ b/output/sitemap.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://phoenix.apache.org/</loc><lastmod>2026-04-29T20:57:45.596Z</lastmod></url><url><loc>https://phoenix.apache.org/docs/</loc><lastmod>2026-04-29T20:57:4 [...]
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://phoenix.apache.org/</loc><lastmod>2026-04-29T22:54:47.387Z</lastmod></url><url><loc>https://phoenix.apache.org/docs/</loc><lastmod>2026-04-29T22:54:4 [...]
\ No newline at end of file
diff --git a/output/source-repository/index.html b/output/source-repository/index.html
index c8abc613..731bdcc6 100644
--- a/output/source-repository/index.html
+++ b/output/source-repository/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Source Repository - Apache Phoenix</title><meta name="description" content="Access the Apache Phoenix source code repository."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin=" [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Source Repository - Apache Phoenix</title><meta name="description" content="Access the Apache Phoenix source code repository."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin=" [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -53,7 +53,7 @@ and so on.</p>
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/source-repository-Dr0IOOXq.js";
diff --git a/output/team/index.html b/output/team/index.html
index 160cc3d6..50b84da6 100644
--- a/output/team/index.html
+++ b/output/team/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Team - Apache Phoenix</title><meta name="description" content="Meet the Apache Phoenix project team members and contributors who develop and maintain Phoenix."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2 [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Team - Apache Phoenix</title><meta name="description" content="Meet the Apache Phoenix project team members and contributors who develop and maintain Phoenix."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2 [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -27,7 +27,7 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/team-ByeUkygk.js";
diff --git a/output/tech-talks/index.html b/output/tech-talks/index.html
index 28730cb0..bc4ce5ac 100644
--- a/output/tech-talks/index.html
+++ b/output/tech-talks/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Tech Talks - Apache Phoenix</title><meta name="description" content="Technical talks and presentations from the Apache Phoenix community."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" c [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Tech Talks - Apache Phoenix</title><meta name="description" content="Technical talks and presentations from the Apache Phoenix community."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" c [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -37,7 +37,7 @@
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/tech-talks-CyEwmdjk.js";
diff --git a/output/who-is-using/index.html b/output/who-is-using/index.html
index 22ca500f..6ac51d91 100644
--- a/output/who-is-using/index.html
+++ b/output/who-is-using/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Who is Using - Apache Phoenix</title><meta name="description" content="See organizations and projects using Apache Phoenix in production."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" c [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/images/logo.svg"/><link rel="preload" as="image" href="/images/dark-theme-logo.svg"/><title>Who is Using - Apache Phoenix</title><meta name="description" content="See organizations and projects using Apache Phoenix in production."/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" c [...]
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
@@ -135,7 +135,7 @@ This is near real time aggregation of tracking data to find trend of events with
console.error(error);
sessionStorage.removeItem(storageKey2);
}
- })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
+ })("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamCo [...]
import * as route0 from "/assets/root-BHBAHx51.js";
import * as route1 from "/assets/landing-layout-BpAkdLQB.js";
import * as route2 from "/assets/who-is-using-DN2qLuJ4.js";