🔍 JQL: Jira Sorgu Dili

JQL: Jira Sorgu Dili: JQL, kütüphanedeki kart kataloğu gibidir: rafları tek tek gezmek yerine "2019 sonrası basılmış, şu yazarın, şu konudaki kitaplar" diye sorarsın ve kütüphane

JQL, kütüphanedeki kart kataloğu gibidir: rafları tek tek gezmek yerine "2019 sonrası basılmış, şu yazarın, şu konudaki kitaplar" diye sorarsın ve kütüphane sana yalnızca onları getirir. Board sana rafları gösterir; JQL sana soruna göre süzülmüş bir liste verir. Düşündürücü soru: pano zaten kartları gösteriyorken, neden ayrıca bir sorgu dili öğrenesin? Çünkü pano bir GÖRÜNÜMDÜR ve yalnızca birinin önceden kurduğu soruya cevap verir. "Son 30 gündür hiç dokunulmamış, bana atanmış, yüksek öncelikli bug'lar" sorusunun cevabı hiçbir panoda hazır durmaz. Karşılaştır: SQL biliyorsan JQL sana tanıdık gelecek — alan, operatör, değer ve sıralama aynı mantıkla dizilir. Ama kritik bir fark var: JQL bir veritabanı dili değildir, JOIN yapamaz. Tek bir varlık üzerinde (issue) alan filtreler; bir issue'nun ilişkili olduğu başka bir issue'nun alanına doğrudan bakamaz. Bu sınırı bilmemek, JQL öğrenirken yaşanan hayal kırıklığının bir numaralı sebebidir. QA açısından farkı şurada görürsün: her sabah panoya bakıp "bugün ne yapsam" diyen tester ile, kaydedilmiş altı filtresini açıp bekleyen doğrulamaları, reopen olanları ve unutulmuş kayıtları saniyede gören tester aynı işi yapmaz.

🎬 Bir JQL Sorgusunun Jira'yı Nasıl Süzdüğü

Tüm Issue'lar (2.400)

SHOP projesinde 2.400 issue var. Ayşe her sabah panoya tek tek bakmak yerine bir cümle yazıyor: "bana atanmış, açık, yüksek öncelikli bug'lar". Bu filmde bu cümlenin arkasında ne olduğunu izleyeceksin.

Adım 1 — Sorgu yazılır: `project = SHOP AND issuetype = Bug AND status != Done AND assignee = currentUser() AND priority = High`. Her `AND` bir SÜZGEÇ katmanı ekler, kümeyi daraltır.

Adım 2 — Jira her koşulu sırayla 2.400 issue'nun alanlarına uygular: önce `project`, sonra `issuetype`, sonra `status`, sonra `assignee`, en son `priority`. Her koşulda küme küçülür, hiçbir issue'nun İÇERİĞİ değişmez — yalnızca GÖRÜNÜRLÜK filtrelenir.

Adım 3 — Beş koşuldan sağ çıkan 18 issue kalır. Bu, JQL'in bir veritabanı JOIN'i YAPMADIĞINI hatırlatan bir andır: hepsi TEK bir varlık (issue) üzerindeki alanlar, başka bir issue'nun alanına bakılmaz.

Final — `ORDER BY priority DESC, created ASC` eklenince 18 issue Ayşe'nin göreceği SIRAYA girer: en yüksek öncelikli en üstte, aynı öncelikte olanlar en eski oluşturulandan başlar. Panoda hiç görünmeyen bu liste artık Ayşe'nin sabah rutini oldu.

1️⃣ F1. JQL Anatomisi

Gerçek bir Jira hesabında üst navigasyon çubuğundaki "Filters" menüsüne tıkla, açılan listeden "Advanced issue search"ü seç. Karşına gelen issue navigator ekranının sağ üstünde bir "Basic / JQL" değiştirme anahtarı vardır — "JQL"e tıkladığında bu sayfada gördüğün sözdizimini doğrudan yazabileceğin, otomatik tamamlama önerili bir arama kutusu açılır. Aynı ekran, bir sorguyu "kaydedilmiş filtre"ye dönüştürüp abonelik kurmanın (bkz. F4) da yeridir.

Bir JQL sorgusu dört parçadan oluşur: ALAN (project, status, assignee), OPERATÖR (=, !=, IN, ~, WAS, CHANGED), DEĞER ve isteğe bağlı SIRALAMA (ORDER BY). Koşullar AND / OR ile zincirlenir. Aşağıdaki örnek bir QA'in günlük olarak kullandığı üç sorguyu gösteriyor — anahtar kelimeler dilin kendi sözdizimidir ve Türkçe sayfada da İngilizce kalır; değişen yalnızca açıklamalardır. Ardından gelen tablo, SQL bilenler için JQL'i tanıdık ama önemli bir farkla gösteriyor.

Bir bug'ın hangi Story'den doğduğunu görmek için, JQL'de doğrudan `story.title ~ "kupon"` gibi bir sorgu yazabilir misin?

Evet, JQL de SQL gibi JOIN yapar

Hayır — JQL JOIN yapmaz, yalnızca TEK bir issue'nun kendi alanlarını filtreler