Filter Tablestore memungkinkan Anda menyaring baris di sisi server sebelum hasil dikembalikan ke klien, sehingga mengurangi lalu lintas jaringan tanpa pemrosesan tambahan di sisi klien.
Cara kerja
Filter Tablestore menyaring baris di server sebelum hasil dikembalikan ke klien, sehingga mengurangi lalu lintas jaringan tanpa pemrosesan tambahan di sisi klien.
Terapkan filter ke permintaan kueri apa pun menggunakan metode setFilter. Tablestore mendukung tiga jenis filter:
SingleColumnValueFilter: Mengembalikan baris jika satu kolom atribut memenuhi kondisi perbandingan.
SingleColumnValueRegexFilter: Mengekstraksi substring dari kolom String menggunakan ekspresi reguler, mengonversinya ke tipe target, lalu membandingkan hasilnya terhadap suatu kondisi.
CompositeColumnValueFilter: Menggabungkan beberapa filter menggunakan operator logika (
AND,OR,NOT).
Filter nilai kolom tunggal
public class SingleColumnValueFilter extends ColumnValueFilter
Signature: new SingleColumnValueFilter(columnName, operator, columnValue)
Catatan:passIfMissingsecara default bernilaitrue—baris tanpa kolom target lolos filter dan dikembalikan. Atur menjadifalseuntuk mengecualikan baris yang tidak memiliki kolom tersebut.latestVersionsOnlysecara default bernilaitrue—hanya versi terbaru yang dievaluasi. Atur menjadifalseuntuk mengembalikan baris jika versi apa pun memenuhi kondisi.
Filter ekspresi reguler nilai kolom tunggal
Hanya kolom atribut bertipe String yang mendukung filter ekspresi reguler.
public class SingleColumnValueRegexFilter extends ColumnValueFilter
Signature: new SingleColumnValueRegexFilter(columnName, regexRule, operator, columnValue)
Filter komposit
Menggabungkan hingga 32 kondisi menggunakan operator logika. Kondisi dapat berupa kombinasi apa pun dari instance SingleColumnValueFilter, SingleColumnValueRegexFilter, dan CompositeColumnValueFilter bersarang.
public class CompositeColumnValueFilter extends ColumnValueFilter
Signature: new CompositeColumnValueFilter(logicOperator), lalu panggil addFilter() untuk setiap kondisi.
Kode contoh
Sebelum menjalankan kode, konfigurasikan kredensial akses Anda dengan mengatur variabel lingkungan TABLESTORE_ACCESS_KEY_ID dan TABLESTORE_ACCESS_KEY_SECRET.
Ketiga contoh berikut menggunakan pola yang sama: membuat RangeRowQueryCriteria untuk rentang kunci primer [row1, row3), membuat filter yang sesuai, menerapkannya dengan setFilter, lalu memanggil getRange.
Filter nilai kolom tunggal
Contoh ini melakukan kueri rentang dan hanya mengembalikan baris di mana col1 sama dengan val1.
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.core.auth.V4Credentials;
import com.alicloud.openservices.tablestore.model.Column;
import com.alicloud.openservices.tablestore.model.ColumnValue;
import com.alicloud.openservices.tablestore.model.GetRangeRequest;
import com.alicloud.openservices.tablestore.model.GetRangeResponse;
import com.alicloud.openservices.tablestore.model.PrimaryKeyBuilder;
import com.alicloud.openservices.tablestore.model.PrimaryKeyValue;
import com.alicloud.openservices.tablestore.model.RangeRowQueryCriteria;
import com.alicloud.openservices.tablestore.model.Row;
import com.alicloud.openservices.tablestore.model.filter.SingleColumnValueFilter;
public class SingleValueFilter {
public static void main(String[] args) {
// Dapatkan kredensial akses dari variabel lingkungan. Anda harus mengonfigurasi TABLESTORE_ACCESS_KEY_ID dan TABLESTORE_ACCESS_KEY_SECRET.
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
// TODO: Ubah konfigurasi berikut berdasarkan informasi instans Anda.
final String region = "cn-hangzhou"; // ID wilayah tempat instans berada, misalnya "cn-hangzhou".
final String instanceName = "your_instance_name"; // Nama instans.
final String endpoint = "your_endpoint"; // Titik akhir instans.
SyncClient client = null;
try {
// Buat kredensial.
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);
// Buat instance client.
client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
// Buat kriteria kueri.
// TODO: Ganti nama tabel.
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("test_table");
// Atur kunci primer awal.
// TODO: Ganti nama dan nilai kunci primer.
PrimaryKeyBuilder startKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startKeyBuilder.build());
// Atur kunci primer akhir. Hasil tidak mencakup kunci primer akhir.
// TODO: Ganti nama dan nilai kunci primer.
PrimaryKeyBuilder endKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row3"));
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endKeyBuilder.build());
// Atur jumlah versi yang akan dikueri.
// Ini mengontrol berapa banyak versi yang dibaca getRange per sel.
// Karena latestVersionsOnly secara default true, filter hanya mengevaluasi versi terbaru.
rangeRowQueryCriteria.setMaxVersions(1);
// Buat filter dengan kondisi col1 == "val1".
// TODO: Ganti bidang dan nilai filter.
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("col1", SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromString("val1"));
rangeRowQueryCriteria.setFilter(singleColumnValueFilter);
// Panggil metode getRange untuk mengkueri data.
GetRangeRequest getRangeRequest = new GetRangeRequest(rangeRowQueryCriteria);
GetRangeResponse getRangeResponse = client.getRange(getRangeRequest);
// Proses hasil.
System.out.println("Kueri selesai. Statistik hasil:");
System.out.println("RequestId: " + getRangeResponse.getRequestId());
System.out.println("Biaya CU Baca: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
System.out.println("Biaya CU Tulis: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
// Cetak hasil kueri.
if (getRangeResponse.getRows() != null && !getRangeResponse.getRows().isEmpty()) {
System.out.println("Ditemukan " + getRangeResponse.getRows().size() + " baris yang memenuhi kondisi:");
for (Row row : getRangeResponse.getRows()) {
// Dapatkan dan cetak informasi kunci primer.
// TODO: Sesuaikan berdasarkan tipe data kunci primer.
String primaryKeyInfo = row.getPrimaryKey().toString();
System.out.println("- Kunci Primer: " + primaryKeyInfo);
// Iterasi dan cetak semua kolom atribut baris. Jika MaxVersions adalah 1, setiap kolom adalah versi terbaru.
if (row.getColumns() != null && row.getColumns().length > 0) {
System.out.println(" Kolom Atribut:");
for (Column column : row.getColumns()) {
// Cetak nama kolom, nilai, dan timestamp.
String columnName = column.getName();
// TODO: Sesuaikan berdasarkan tipe data kolom atribut.
String columnValue = column.getValue().toString();
long timestamp = column.getTimestamp();
System.out.println(
String.format(" - %s: %s (Timestamp Versi: %d)", columnName, columnValue, timestamp)
);
}
} else {
System.out.println(" (Baris ini tidak memiliki kolom atribut)");
}
}
} else {
System.out.println("Tidak ditemukan data yang memenuhi kondisi filter.");
}
System.out.println("Operasi kueri filter selesai.");
} catch (Exception e) {
System.err.println("Kueri gagal. Detail:");
e.printStackTrace();
} finally {
// Matikan client.
if (client != null) {
client.shutdown();
}
}
}
}
Filter ekspresi reguler nilai kolom tunggal
Contoh ini melakukan kueri rentang dan hanya mengembalikan baris di mana atribut col1 cocok dengan ekspresi reguler 1([a-z]+)5 dan substring yang diekstraksi sama dengan aaa.
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.core.auth.V4Credentials;
import com.alicloud.openservices.tablestore.model.Column;
import com.alicloud.openservices.tablestore.model.ColumnValue;
import com.alicloud.openservices.tablestore.model.GetRangeRequest;
import com.alicloud.openservices.tablestore.model.GetRangeResponse;
import com.alicloud.openservices.tablestore.model.PrimaryKeyBuilder;
import com.alicloud.openservices.tablestore.model.PrimaryKeyValue;
import com.alicloud.openservices.tablestore.model.RangeRowQueryCriteria;
import com.alicloud.openservices.tablestore.model.Row;
import com.alicloud.openservices.tablestore.model.filter.RegexRule;
import com.alicloud.openservices.tablestore.model.filter.SingleColumnValueRegexFilter;
public class SingleValueRegexFilter {
public static void main(String[] args) {
// Dapatkan kredensial akses dari variabel lingkungan. Anda harus mengonfigurasi TABLESTORE_ACCESS_KEY_ID dan TABLESTORE_ACCESS_KEY_SECRET.
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
// TODO: Ubah konfigurasi berikut berdasarkan informasi instans Anda.
final String region = "cn-hangzhou"; // ID wilayah tempat instans berada, misalnya "cn-hangzhou".
final String instanceName = "your_instance_name"; // Nama instans.
final String endpoint = "your_endpoint"; // Titik akhir instans.
SyncClient client = null;
try {
// Buat kredensial.
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);
// Buat instance client.
client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
// Buat kriteria kueri.
// TODO: Ganti nama tabel.
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("test_table");
// Atur kunci primer awal.
// TODO: Ganti nama dan nilai kunci primer.
PrimaryKeyBuilder startKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startKeyBuilder.build());
// Atur kunci primer akhir. Hasil tidak mencakup kunci primer akhir.
// TODO: Ganti nama dan nilai kunci primer.
PrimaryKeyBuilder endKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row3"));
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endKeyBuilder.build());
// Atur jumlah versi yang akan dikueri.
rangeRowQueryCriteria.setMaxVersions(1);
// Buat filter ekspresi reguler dengan kondisi cast<String>(reg(col1)) == "aaa".
// RegexRule: regex "1([a-z]+)5" mengekstraksi grup tangkapan pertama dari nilai kolom.
// Contoh: "1aaa51bbb5" -> mengekstraksi "aaa" (grup pertama yang cocok dengan regex).
// castType VT_STRING: perlakukan substring yang diekstraksi sebagai string untuk perbandingan.
// TODO: Ganti ekspresi reguler, bidang filter, dan nilai yang dicocokkan.
RegexRule regexRule = new RegexRule("1([a-z]+)5", RegexRule.CastType.VT_STRING);
SingleColumnValueRegexFilter singleColumnValueRegexFilter = new SingleColumnValueRegexFilter("col1", regexRule, SingleColumnValueRegexFilter.CompareOperator.EQUAL, ColumnValue.fromString("aaa"));
rangeRowQueryCriteria.setFilter(singleColumnValueRegexFilter);
// Panggil metode getRange untuk mengkueri data baris.
GetRangeRequest getRangeRequest = new GetRangeRequest(rangeRowQueryCriteria);
GetRangeResponse getRangeResponse = client.getRange(getRangeRequest);
// Proses hasil.
System.out.println("Kueri filter regex selesai. Statistik hasil:");
System.out.println("RequestId: " + getRangeResponse.getRequestId());
System.out.println("Biaya CU Baca: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
System.out.println("Biaya CU Tulis: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
// Cetak hasil kueri.
if (getRangeResponse.getRows() != null && !getRangeResponse.getRows().isEmpty()) {
System.out.println("Ditemukan " + getRangeResponse.getRows().size() + " baris yang memenuhi kondisi filter regex:");
for (Row row : getRangeResponse.getRows()) {
// Dapatkan dan cetak informasi kunci primer.
// TODO: Sesuaikan berdasarkan tipe data kunci primer.
String primaryKeyInfo = row.getPrimaryKey().toString();
System.out.println("- Kunci Primer: " + primaryKeyInfo);
// Iterasi dan cetak semua kolom atribut baris. Jika MaxVersions adalah 1, setiap kolom adalah versi terbaru.
if (row.getColumns() != null && row.getColumns().length > 0) {
System.out.println(" Kolom Atribut:");
for (Column column : row.getColumns()) {
// Cetak nama kolom, nilai, dan timestamp.
String columnName = column.getName();
// TODO: Sesuaikan berdasarkan tipe data kolom atribut.
String columnValue = column.getValue().toString();
long timestamp = column.getTimestamp();
System.out.println(
String.format(" - %s: %s (Timestamp Versi: %d)", columnName, columnValue, timestamp)
);
}
} else {
System.out.println(" (Baris ini tidak memiliki kolom atribut)");
}
}
} else {
System.out.println("Tidak ditemukan data yang memenuhi kondisi filter regex.");
}
System.out.println("Operasi kueri filter regex selesai.");
} catch (Exception e) {
System.err.println("Kueri filter regex gagal. Detail:");
e.printStackTrace();
} finally {
// Matikan client.
if (client != null) {
client.shutdown();
}
}
}
}
Filter komposit
Contoh ini melakukan kueri rentang pada rentang [row1, row3) dan hanya mengembalikan baris yang memenuhi kondisi (col1 == "val1" OR cast<String>(reg(col2)) >= "aaa") AND col3 == "val3".
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.core.auth.V4Credentials;
import com.alicloud.openservices.tablestore.model.Column;
import com.alicloud.openservices.tablestore.model.ColumnValue;
import com.alicloud.openservices.tablestore.model.GetRangeRequest;
import com.alicloud.openservices.tablestore.model.GetRangeResponse;
import com.alicloud.openservices.tablestore.model.PrimaryKeyBuilder;
import com.alicloud.openservices.tablestore.model.PrimaryKeyValue;
import com.alicloud.openservices.tablestore.model.RangeRowQueryCriteria;
import com.alicloud.openservices.tablestore.model.Row;
import com.alicloud.openservices.tablestore.model.filter.CompositeColumnValueFilter;
import com.alicloud.openservices.tablestore.model.filter.RegexRule;
import com.alicloud.openservices.tablestore.model.filter.SingleColumnValueFilter;
import com.alicloud.openservices.tablestore.model.filter.SingleColumnValueRegexFilter;
public class CompositeFilter {
public static void main(String[] args) {
// Dapatkan kredensial akses dari variabel lingkungan. Anda harus mengonfigurasi TABLESTORE_ACCESS_KEY_ID dan TABLESTORE_ACCESS_KEY_SECRET.
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
// TODO: Ubah konfigurasi berikut berdasarkan informasi instans Anda.
final String region = "cn-hangzhou"; // ID wilayah tempat instans berada, misalnya "cn-hangzhou".
final String instanceName = "your_instance_name"; // Nama instans.
final String endpoint = "your_endpoint"; // Titik akhir instans.
SyncClient client = null;
try {
// Buat kredensial.
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);
// Buat instance client.
client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
// Buat kriteria kueri.
// TODO: Ganti nama tabel.
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("test_table");
// Atur kunci primer awal.
// TODO: Ganti nama dan nilai kunci primer.
PrimaryKeyBuilder startKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startKeyBuilder.build());
// Atur kunci primer akhir. Hasil tidak mencakup kunci primer akhir.
// TODO: Ganti nama dan nilai kunci primer.
PrimaryKeyBuilder endKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row3"));
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endKeyBuilder.build());
// Atur jumlah versi yang akan dikueri.
rangeRowQueryCriteria.setMaxVersions(1);
// 1. Buat filter daun: col1 == "val1"
// TODO: Ganti bidang dan nilai filter.
SingleColumnValueFilter singleColumnValueFilter1 = new SingleColumnValueFilter("col1", SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromString("val1"));
// 2. Buat filter daun: cast<String>(reg(col2)) >= "aaa"
// Regex "1([a-z]+)5" mengekstraksi grup tangkapan pertama, lalu membandingkan sebagai string.
// TODO: Ganti ekspresi reguler, nama bidang, dan nilai perbandingan.
RegexRule regexRule = new RegexRule("1([a-z]+)5", RegexRule.CastType.VT_STRING);
SingleColumnValueRegexFilter singleColumnValueRegexFilter = new SingleColumnValueRegexFilter("col2", regexRule, SingleColumnValueRegexFilter.CompareOperator.GREATER_EQUAL, ColumnValue.fromString("aaa"));
// 3. Gabungkan filter 1 dan 2 dengan OR: col1 == "val1" OR cast<String>(reg(col2)) >= "aaa"
CompositeColumnValueFilter compositeColumnValueFilter1 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.OR);
compositeColumnValueFilter1.addFilter(singleColumnValueFilter1);
compositeColumnValueFilter1.addFilter(singleColumnValueRegexFilter);
// 4. Buat filter daun: col3 == "val3"
// TODO: Ganti bidang dan nilai filter.
SingleColumnValueFilter singleColumnValueFilter2 = new SingleColumnValueFilter("col3", SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromString("val3"));
// 5. Gabungkan grup OR dengan filter 4 menggunakan AND:
// (col1 == "val1" OR cast<String>(reg(col2)) >= "aaa") AND col3 == "val3"
CompositeColumnValueFilter compositeColumnValueFilter2 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.AND);
compositeColumnValueFilter2.addFilter(compositeColumnValueFilter1);
compositeColumnValueFilter2.addFilter(singleColumnValueFilter2);
// Sambungkan filter komposit tingkat atas ke kueri.
rangeRowQueryCriteria.setFilter(compositeColumnValueFilter2);
// Panggil metode getRange untuk mengkueri data.
GetRangeRequest getRangeRequest = new GetRangeRequest(rangeRowQueryCriteria);
GetRangeResponse getRangeResponse = client.getRange(getRangeRequest);
// Proses hasil.
System.out.println("Kueri selesai. Statistik hasil:");
System.out.println("RequestId: " + getRangeResponse.getRequestId());
System.out.println("Biaya CU Baca: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
System.out.println("Biaya CU Tulis: " + getRangeResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
// Cetak hasil kueri.
if (getRangeResponse.getRows() != null && !getRangeResponse.getRows().isEmpty()) {
System.out.println("Ditemukan " + getRangeResponse.getRows().size() + " baris yang memenuhi kondisi:");
for (Row row : getRangeResponse.getRows()) {
// Dapatkan dan cetak informasi kunci primer.
// TODO: Sesuaikan berdasarkan tipe data kunci primer.
String primaryKeyInfo = row.getPrimaryKey().toString();
System.out.println("- Kunci Primer: " + primaryKeyInfo);
// Iterasi dan cetak semua kolom atribut baris. Jika MaxVersions adalah 1, setiap kolom adalah versi terbaru.
if (row.getColumns() != null && row.getColumns().length > 0) {
System.out.println(" Kolom Atribut:");
for (Column column : row.getColumns()) {
// Cetak nama kolom, nilai, dan timestamp.
String columnName = column.getName();
// TODO: Sesuaikan berdasarkan tipe data kolom atribut.
String columnValue = column.getValue().toString();
long timestamp = column.getTimestamp();
System.out.println(
String.format(" - %s: %s (Timestamp Versi: %d)", columnName, columnValue, timestamp)
);
}
} else {
System.out.println(" (Baris ini tidak memiliki kolom atribut)");
}
}
} else {
System.out.println("Tidak ditemukan data yang memenuhi kondisi filter.");
}
System.out.println("Operasi kueri filter komposit selesai.");
} catch (Exception e) {
System.err.println("Kueri gagal. Detail:");
e.printStackTrace();
} finally {
// Matikan client.
if (client != null) {
client.shutdown();
}
}
}
}
Perilaku penyaringan saat kolom tidak ada
Gunakan metode setPassIfMissing untuk mengontrol apakah baris dikembalikan ketika kolom target tidak ada.
// Kecualikan baris yang tidak berisi kolom atribut yang akan dievaluasi.
singleColumnValueFilter.setPassIfMissing(false);
Penyaringan data versi historis
Gunakan metode setLatestVersionsOnly untuk mengontrol versi mana yang dievaluasi. Saat diatur ke false, baris dikembalikan jika versi apa pun memenuhi kondisi.
// Evaluasi semua versi data.
singleColumnValueFilter.setLatestVersionsOnly(false);