Couchbase view'larında arama yapılacak alan string türünde fakat arama sorgusu(key) sayı formatında ise bu durumda Couchbase'in 1.4.9'a kadar olan java client'ları bu key'i sayı formatında sorguya gönderir ve boş sonuç döner.
Örneğin şöyle bir Couchbase dokümanımız olsun:
{
"isim": "Batuhan",
"numara": "1234"
}
Görüleceği üzere örnek Couchbase dokümanında "numara" alanı sayı formatında fakat değer türü string. Biz view'ımızda bu alana göre arama yapmak istiyoruz. map fonksiyonu aşağıdaki gibi olan bir 'numarayaGoreAra'
view'ımız olsun:
function (doc, meta) {
if (doc.numara)
emit(doc.numara, null);
}
Couchbase java client'ta (com.couchbase.client:couchbase-client:1.4.9) bu sorguyu kabaca şöyle yaparız:
...
Query query = new Query();
query.setKey("1234")
...
Burada çağrılan setKey
ve onun kullandığı quote
metodlarının kaynak kodlarına bakarsak:
public Query setKey(String key) {
params[PARAM_KEY_OFFSET] = "key";
params[PARAM_KEY_OFFSET+1] = encode(quote(key));
return this;
}
protected String quote(final String source) {
if (quotePattern.matcher(source).matches()) {
ParsePosition parsePosition = new ParsePosition(0);
Number result = numberFormat.parse(source, parsePosition);
if (parsePosition.getIndex() == source.length()) {
return result.toString();
}
return source;
}
return '"' + source + '"';
}
Burada önce arama sorgumuzun (1234) hangi formatta olduğuna bakar. Eğer arama sorgumuz sayı formatında ise -ki buradaki 1234 sayı formatında bir string- onu sayı olarak arar. Aksi durumda ise başına ve sonuna çift tırnak(") ekleyerek "string" olarak arar.
Örneğimizde 1234 string'i sayı formatında olduğu için client, sorguyu sayı formatına çevirir ve arama yapar. Dolayısıyla istediğimiz sonuç dönmez.
Couchbase'in yeni Java SDK'sında ise quote
metodu kaldırıldı (bkz. https://github.com/couchbase/couchbase-java-client/blob/master/src/main/java/com/couchbase/client/java/view/ViewQuery.java#L312).
Eski client'lardaki bu sorunu çözmenin bir yolu, varolan Query
sınıfını genişletip quote
metodunu ezmek. Örnek olarak ben şu şekilde ezdim:
class NewViewQuery extends Query {
@Override
protected String quote(String source) {
return '"' + source + '"'
}
}
View sorgusu oluşturuken de şu şekilde oluşturabiliriz:
...
Query query = new NewViewQuery();
query.setKey("1234")
...
Bu şekilde artık gelen arama sorgusunun formatına bakmaksızın doğrudan başına ve sonuna çift tırnak(") koyabiliriz.