# catalog/operations/vector/dissolve.yaml

id: vector_dissolve
name: Dissolve
description: >
  Dissolve vector features into a single geometry, optionally grouped by
  an attribute. Merges adjacent or overlapping polygons.
version: 1.0.0
category: vector
type: vector-to-vector
default_implementation: native

inputs:
  - name: features
    type: vector
    format: geojson
    description: Input polygon features to dissolve
    required: true

# Structural op — operates on any vector geometry uniformly.
requires: {}

outputs:
  - name: dissolved
    type: vector
    format: geojson
    geometry: Polygon
    description: Dissolved polygon features

params:
  by:
    type: string
    description: Attribute name to group by (dissolves features with same value)

cache_policy:
  ttl_days: 30
  invalidate_on: [source_update, param_change]

# backends: audited 2026-08-14 (defect 50). A key means a runtime that DISPATCHES this op —
# folia-engine `dispatch_op` (products/sdk/folia-engine/src/lib.rs), a `registerOp`/OP_TABLE
# entry in packages/compute, `_BUILTIN_OP_MAP` in folia/compute.py, or a backend manifest
# (folia/backends/*/backend.yaml).
backends:
  python:
    function: geo.vector.dissolve
    dispatch: folia/compute.py _BUILTIN_OP_MAP

display_hints:
  map:
    renderer: maplibre
    type: fill
    paint:
      fill-color: "rgba(138, 43, 226, 0.3)"
      fill-outline-color: "#8A2BE2"

ui:
  icon: git-merge
  color: "#8A2BE2"
