Skip to content

cjindex

Dagster resource wrapping the published cityjson-index package.

The pipeline keeps this module path for compatibility while exposing the package-oriented CityJSON index API used by downstream assets.

CityIndexResource

Bases: ConfigurableResource

Dagster resource for a cityjson_index.OpenedIndex over a stage.

Source code in packages/common/src/bag3d/common/resources/cjindex.py
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
class CityIndexResource(ConfigurableResource):
    """Dagster resource for a ``cityjson_index.OpenedIndex`` over a stage."""

    dataset_dir: str
    index_path_override: str | None = None

    def open(self) -> cityjson_index.OpenedIndex:
        """Return an opened native index for this resource's dataset."""
        return cityjson_index.OpenedIndex.open(
            self.dataset_dir, self.index_path_override
        )

    @classmethod
    def from_filestore(
        cls,
        filestore_root: str | os.PathLike[str],
        stage: str,
        index_path_override: str | None = None,
    ) -> Self:
        """Build a resource from a filestore root and stage name."""
        dataset_dir = Path(filestore_root) / "stages" / stage
        return cls(
            dataset_dir=str(dataset_dir),
            index_path_override=index_path_override,
        )

from_filestore(filestore_root, stage, index_path_override=None) classmethod

Build a resource from a filestore root and stage name.

Source code in packages/common/src/bag3d/common/resources/cjindex.py
78
79
80
81
82
83
84
85
86
87
88
89
90
@classmethod
def from_filestore(
    cls,
    filestore_root: str | os.PathLike[str],
    stage: str,
    index_path_override: str | None = None,
) -> Self:
    """Build a resource from a filestore root and stage name."""
    dataset_dir = Path(filestore_root) / "stages" / stage
    return cls(
        dataset_dir=str(dataset_dir),
        index_path_override=index_path_override,
    )

open()

Return an opened native index for this resource's dataset.

Source code in packages/common/src/bag3d/common/resources/cjindex.py
72
73
74
75
76
def open(self) -> cityjson_index.OpenedIndex:
    """Return an opened native index for this resource's dataset."""
    return cityjson_index.OpenedIndex.open(
        self.dataset_dir, self.index_path_override
    )

city_model_to_feature_json(model)

Serialize a native CityJSONFeature model and release it.

Source code in packages/common/src/bag3d/common/resources/cjindex.py
41
42
43
44
45
46
47
48
def city_model_to_feature_json(model: object) -> dict[str, Any]:
    """Serialize a native CityJSONFeature model and release it."""
    if isinstance(model, dict):
        return model
    try:
        return json.loads(model.serialize_feature_bytes())  # type: ignore[attr-defined]
    finally:
        model.close()  # type: ignore[attr-defined]

iter_package_refs(index, page_size)

Yield package-ref pages and advance using the page's final record ID.

Source code in packages/common/src/bag3d/common/resources/cjindex.py
28
29
30
31
32
33
34
35
36
37
38
def iter_package_refs(
    index: cityjson_index.OpenedIndex, page_size: int
) -> Iterator[list[cityjson_index.PackageRef]]:
    """Yield package-ref pages and advance using the page's final record ID."""
    after_record_id = None
    while True:
        refs = package_ref_page_after_record_id(index, after_record_id, page_size)
        if not refs:
            return
        yield refs
        after_record_id = refs[-1].record_id

open_ready_index(resource)

Open the index and rebuild it when its source dataset is stale.

Source code in packages/common/src/bag3d/common/resources/cjindex.py
58
59
60
61
62
63
def open_ready_index(resource: CityIndexResource) -> cityjson_index.OpenedIndex:
    """Open the index and rebuild it when its source dataset is stale."""
    index = resource.open()
    if index.status().needs_reindex:
        index.reindex()
    return index

package_ref_page_after_record_id(index, after_record_id, page_size)

Return one keyset page of package refs, ordered by record ID.

Source code in packages/common/src/bag3d/common/resources/cjindex.py
19
20
21
22
23
24
25
def package_ref_page_after_record_id(
    index: cityjson_index.OpenedIndex,
    after_record_id: int | None,
    page_size: int,
) -> list[cityjson_index.PackageRef]:
    """Return one keyset page of package refs, ordered by record ID."""
    return index.package_ref_page_after_record_id(after_record_id, page_size)

read_package_feature_json(index, ref)

Read a package and convert its native model to a CityJSONFeature dict.

Source code in packages/common/src/bag3d/common/resources/cjindex.py
51
52
53
54
55
def read_package_feature_json(
    index: cityjson_index.OpenedIndex, ref: cityjson_index.PackageRef
) -> dict[str, Any]:
    """Read a package and convert its native model to a CityJSONFeature dict."""
    return city_model_to_feature_json(index.read_package(ref))