# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# Define the anchor at the top so it's available for the nav section
extra:
  social:
    - icon: fontawesome/brands/github
      link: 'https://github.com/apache/spatialbench'
    - icon: fontawesome/brands/twitter
      link: 'https://twitter.com/ApacheSedona'
    - icon: fontawesome/brands/discord
      link: 'https://discord.gg/9A3k5dEBsY'
  community_links: &community_links
    - Get Involved:
        - Sedona OSS Blog: "https://sedona.apache.org/latest/blog/"
        - Community: "https://sedona.apache.org/latest/community/contact/"
        - Apache Software Foundation: "https://sedona.apache.org/latest/asf/asf/"
  spatialbench_links: &spatialbench_links
    - Framework:
        - Methodology: overview-methodology.md
        - SpatialBench Queries: queries.md
        - Datasets & Generators: datasets-generators.md
        - Data Distributions: spatialbench-distributions.md


site_name: SpatialBench
site_url: https://sedona.apache.org/spatialbench/
site_description: SpatialBench is a benchmark for assessing geospatial SQL analytics query performance across database systems
# Define a reusable block of links with a YAML anchor (&)

nav:
  - Home: https://sedona.apache.org/latest/
  - SedonaDB: https://sedona.apache.org/sedonadb/
  - SedonaSpark: https://sedona.apache.org/latest/sedonaspark/
  - SedonaFlink: https://sedona.apache.org/latest/sedonaflink/
  - SedonaSnow: https://sedona.apache.org/latest/sedonasnow/
  - SpatialBench:
      - Home: index.md
      - Quickstart: quickstart.md
      - Methodology: overview-methodology.md
      - Queries: queries.md
      - Datasets & Generators: datasets-generators.md
      - Data Distributions: spatialbench-distributions.md
      - Single Node Results: single-node-benchmarks.md
      - Contributors Guide: contributors-guide.md
      - Release Notes: release-notes.md
  - Blog: https://sedona.apache.org/latest/blog/
  - Community: https://sedona.apache.org/latest/community/contact/
  - Apache Software Foundation: https://sedona.apache.org/latest/asf/asf/

repo_url: https://github.com/apache/sedona-spatialbench/
edit_uri: https://github.com/apache/sedona-spatialbench/blob/main/docs/
repo_name: apache/sedona-spatialbench

theme:
  name: material
  custom_dir: docs/overrides
  font:
    font: false
    name: 'material'
  palette:
    primary: custom
    accent: 'green'
  favicon: image/sedona_logo_symbol.png
  logo: image/logo.svg
  icon:
    logo: fontawesome/solid/earth-americas
    repo: fontawesome/brands/github
  features:
    - content.code.copy
    - content.action.edit
    - search.highlight
    - search.share
    - search.suggest
    - navigation.footer
    - navigation.instant
    - navigation.top
    - navigation.sections
    - navigation.tabs
    - navigation.tabs.sticky

extra_css:
  - stylesheets/extra.css
  - https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css

extra_javascript:
  - assets/javascripts/main.min.js
  - https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js
  - https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js
  - javascripts/katex.js

copyright: Copyright © 2026 The Apache Software Foundation. Apache Sedona, Sedona, Apache, the Apache feather logo, and the Apache Sedona project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries. All other marks mentioned may be trademarks or registered trademarks of their respective owners. Please visit <a href="https://www.apache.org/">Apache Software Foundation</a> for more details.<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=f3e121f6-c909-4592-8be6-5bd345768cba" /><img referrerpolicy="no-referrer-when-downgrade" src="https://analytics.apache.org/matomo.php?idsite=74&rec=1" />

markdown_extensions:
   - admonition
   - attr_list
   - codehilite
   - footnotes
   - toc:
        permalink: true
        toc_depth: 3
   - pymdownx.arithmatex:
        generic: true
   - pymdownx.betterem:
        smart_enable: all
   - pymdownx.caret
   - pymdownx.critic
   - pymdownx.details
   - pymdownx.emoji
   - pymdownx.highlight
   - pymdownx.inlinehilite
   - pymdownx.magiclink
   - pymdownx.mark
   - pymdownx.smartsymbols
   - pymdownx.snippets:
        base_path: ["docs/"]
   - pymdownx.superfences:
        custom_fences:
        - name: mermaid
          class: mermaid
   - pymdownx.tabbed:
        alternate_style: true
   - pymdownx.tasklist:
        custom_checkbox: true
   - pymdownx.tilde
plugins:
   - search
   - macros
   - i18n:
        docs_structure: suffix
        fallback_to_default: true
        reconfigure_material: true
        reconfigure_search: true
        languages:
          - locale: en
            default: true
            name: English
            build: true
          - locale: zh
            name: 中文
            build: true
            site_name: SpatialBench
            site_description: SpatialBench 是一个用于评估各类数据库系统中地理空间 SQL 分析查询性能的基准测试
            nav_translations:
              Home: 首页
              SpatialBench: SpatialBench
              Quickstart: 快速开始
              Methodology: 方法论
              Queries: 查询
              Datasets & Generators: 数据集与生成器
              Data Distributions: 数据分布
              Single Node Results: 单节点结果
              Contributors Guide: 贡献者指南
              Release Notes: 发布说明
              Blog: 博客
              Community: 社区
              Apache Software Foundation: Apache 软件基金会
              Framework: 框架
              SpatialBench Queries: SpatialBench 查询
              Get Involved: 参与贡献
              Sedona OSS Blog: Sedona 开源博客
   - git-revision-date-localized:
        type: datetime
   - glightbox:
        touchNavigation: true
        loop: false
        effect: zoom
        slide_effect: slide
        width: 100%
        height: auto
        zoomable: true
        draggable: true
        skip_classes:
          - custom-skip-class-name
          - skip-lightbox
        auto_caption: false
        caption_position: bottom
        background: white
        shadow: false
        manual: false
   - tags
   - mkdocstrings:
          handlers:
               python:
                    inventories:
                         - https://docs.python.org/3/objects.inv
                         - https://geopandas.org/en/stable/objects.inv
                         - https://pandas.pydata.org/docs/objects.inv
                    options:
                         docstring_section_style: list
                         docstring_style: google
                         line_length: 80
                         separate_signature: true
                         show_root_heading: true
                         show_signature_annotations: true
                         show_source: false
                         show_symbol_type_toc: true
                         signature_crossrefs: true
                         extra:
                              paths: ['python']
