Lindorm GanosBase では、時空間オブジェクトを削除する方法として、TTL に基づく有効期限切れ、時空間範囲による削除、およびオブジェクト ID による削除の 3 種類をサポートしています。各方法は、異なるインデックス構成に適用されます。
削除方法の選択
| 方法 | 対応するインデックスタイプ | 他のインデックスへの影響 | 使用するタイミング |
|---|---|---|---|
| TTL に基づく有効期限切れ | すべてのインデックステーブル | あり(テーブルごとに TTL を設定) | 固定された時間しきい値を超えるデータを自動的にパージする場合 |
| 時空間範囲による削除 | z2/xz2 および z3/xz3 のみ | 属性インデックスとの不整合が発生するリスクあり | データベース内に時空間インデックステーブルのみが存在する場合 |
| オブジェクト ID による削除 | ID インデックステーブルのみ | 他のインデックステーブルのデータは削除されない | データベース内に ID インデックステーブルが 1 つだけ存在する場合 |
削除を実行する前に、インデックステーブルのデータをバックアップしてください。
TTL による削除
Lindorm GanosBase では、ApsaraDB for HBase の Time to Live (TTL) 機能を活用して、データの自動的な有効期限切れを実現します。HBase Shell を使用し、時空間インデックステーブルの TTL 属性を変更することで、期限切れデータを削除できます。
複数のインデックステーブルが存在する場合は、それぞれのテーブルに対して個別に TTL を設定してください。TTL の値は秒単位で指定します。
例: 時空間インデックステーブル xxx_z3 および属性インデックステーブル xxx_attr から、5 分(300 秒)より古いデータを削除します。
Alter 'xxx_z3',{NAME=>'d',TTL=>300}
Alter 'xxx_attr',{NAME=>'d',TTL=>300}時空間範囲による削除
この方法は、z2/xz2 および z3/xz3 の時空間インデックステーブルにのみ適用可能です。
データベースに属性インデックステーブルが含まれる場合、時空間範囲による削除を実行しても、属性インデックステーブルは変更されません。これにより、時空間インデックステーブルと属性インデックステーブルの間で不整合が発生します。したがって、この方法は、データベース内に時空間インデックステーブルのみが存在する場合にのみ使用してください。
操作手順:
削除対象のオブジェクトを特定するフィルターを設定します。クエリ時と同じフィルター構文を使用します。フィルター文字列は、拡張共通クエリ言語(ECQL)構文に準拠している必要があります。
GeoTools の
SimpleFeatureStore.removeFeatures()を呼び出して、条件に一致するオブジェクトを削除します。
/**
* 指定されたフィルターに一致する時空間オブジェクトを削除します。
* @param schema スキーマ名
* @param filterString ECQL フィルター文字列。空文字列の場合は、すべてのオブジェクトが削除されます
*/
public void removeByFilter(String schema, String filterString) throws Exception {
SimpleFeatureStore fs = (SimpleFeatureStore) ds.getFeatureSource(schema);
// filterString が空文字列の場合、すべての時空間オブジェクトが削除されます。
if (StringUtils.isEmpty(filterString)) {
fs.removeFeatures(Filter.INCLUDE);
return;
}
Filter filterToDelete = ECQL.toFilter(filterString);
fs.removeFeatures(filterToDelete);
}オブジェクト ID による削除
この方法では、指定された ID に関連付けられたインデックステーブルからのみデータが削除されます。他のインデックステーブルのデータには影響しません。
この方法は、データベース内に ID インデックステーブルが 1 つだけ存在する場合にのみ使用してください。複数のインデックステーブルが存在する場合、削除されたオブジェクトに関するデータは他のインデックスに残り続けます。
SimpleFeatureStore.removeFeatures() を、FilterFactory2 を使用して構築した ID フィルターとともに呼び出します。
public void removeById(String schema, String simpleFeatureId) throws Exception {
// FilterFactory2 を使用して ID フィルターを構築します。
FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
Filter filterToDelete = ff.id(ff.featureId(simpleFeatureId));
SimpleFeatureStore fs = (SimpleFeatureStore) ds.getFeatureSource(schema);
fs.removeFeatures(filterToDelete);
}