Skip to content

Instantly share code, notes, and snippets.

@baybatu
Last active January 27, 2016 22:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save baybatu/face1955629764c8f576 to your computer and use it in GitHub Desktop.
Save baybatu/face1955629764c8f576 to your computer and use it in GitHub Desktop.
Couchbase view'larındaki sayı formatındaki string alanlara göre arama sorunu ve çözümü

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment