GoDasturchi
Query Language

Query Language

So'rov tili

Google qidiruv satriga site:go.dev concurrency deb yozganingizda, siz aslida SODDA "so'rov tili"dan foydalanyapsiz — site: MAXSUS ma'noga ega FILTR, qolgani esa oddiy qidiruv so'zi. Log Aggregator'imizga ham xuddi shunday, oddiy so'rov tilini qo'shamiz: level:ERROR service:payments kabi so'rovlar orqali loglarni FILTRLASH.

example.go
package main

import (
	"fmt"
	"strings"
)

type LogEntry struct {
	Level   string
	Service string
	Message string
}

// parseQuery — "level:ERROR service:payments" kabi so'rovni filtrlar xaritasiga aylantiradi
func parseQuery(query string) map[string]string {
	filters := make(map[string]string)
	for _, token := range strings.Fields(query) {
		parts := strings.SplitN(token, ":", 2)
		if len(parts) == 2 {
			filters[parts[0]] = parts[1]
		}
	}
	return filters
}

// matches — bitta log yozuvi berilgan filtrlarga MOS kelamikan tekshiradi
func matches(entry LogEntry, filters map[string]string) bool {
	if level, ok := filters["level"]; ok && entry.Level != level {
		return false
	}
	if service, ok := filters["service"]; ok && entry.Service != service {
		return false
	}
	return true
}

func main() {
	entries := []LogEntry{
		{Level: "ERROR", Service: "payments", Message: "muvaffaqiyatsiz"},
		{Level: "INFO", Service: "payments", Message: "boshlandi"},
		{Level: "ERROR", Service: "auth", Message: "kirish rad etildi"},
	}

	filters := parseQuery("level:ERROR service:payments")

	var results []LogEntry
	for _, entry := range entries {
		if matches(entry, filters) {
			results = append(results, entry)
		}
	}
	fmt.Println(len(results), results[0].Message)
}

filters[parts[0]] = parts[1] — so'rovdagi har bir kalit:qiymat juftligi (level:ERROR) filtrlar xaritasiga qo'shiladi. matches funksiyasi — HAR BIR filtr uchun "comma-ok" (ok) tekshiruvidan foydalanadi: agar SO'ROVDA o'sha filtr BERILMAGAN bo'lsa (masalan foydalanuvchi service: yozmagan bo'lsa), o'sha shart TEKSHIRILMAYDI — faqat AYTIB o'tilgan filtrlar qo'llaniladi.

Bu — "API Gateway Pattern" darsida ko'rgan g'oyaga o'xshash: murakkab, ICHKI mantiq (filtrlash) FOYDALANUVCHIGA sodda, matnga o'xshash INTERFEYS orqali TAQDIM etiladi. Foydalanuvchi Go kodini yozmasdan, faqat ODDIY matn so'rovi orqali murakkab filtrlashni AMALGA OSHIRA oladi.

>_ Exercise

So'rov tiliga "contains" (xabar ichida qidirish) imkonini qo'shing.

  • matches funksiyasiga qo'shimcha tekshiruv qo'shing: agar filters'da "contains" bo'lsa VA entry.Message unda strings.Contains bo'yicha TOPILMASA, false qaytaring
  • "level:ERROR contains:kirish" so'rovini tahlil qilib, entries bo'ylab filtrlang
  • natijadagi mos kelgan yozuvlar sonini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Oddiy "kalit:qiymat" so'rov tili, foydalanuvchiga murakkab Go kodi yozmasdan, matnga o'xshash so'rovlar orqali loglarni moslashuvchan tarzda filtrlash imkonini beradi.

NEXT UP

Real-Time Tail

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Query Language

So'rov tili

Google qidiruv satriga site:go.dev concurrency deb yozganingizda, siz aslida SODDA "so'rov tili"dan foydalanyapsiz — site: MAXSUS ma'noga ega FILTR, qolgani esa oddiy qidiruv so'zi. Log Aggregator'imizga ham xuddi shunday, oddiy so'rov tilini qo'shamiz: level:ERROR service:payments kabi so'rovlar orqali loglarni FILTRLASH.

example.go
package main

import (
	"fmt"
	"strings"
)

type LogEntry struct {
	Level   string
	Service string
	Message string
}

// parseQuery — "level:ERROR service:payments" kabi so'rovni filtrlar xaritasiga aylantiradi
func parseQuery(query string) map[string]string {
	filters := make(map[string]string)
	for _, token := range strings.Fields(query) {
		parts := strings.SplitN(token, ":", 2)
		if len(parts) == 2 {
			filters[parts[0]] = parts[1]
		}
	}
	return filters
}

// matches — bitta log yozuvi berilgan filtrlarga MOS kelamikan tekshiradi
func matches(entry LogEntry, filters map[string]string) bool {
	if level, ok := filters["level"]; ok && entry.Level != level {
		return false
	}
	if service, ok := filters["service"]; ok && entry.Service != service {
		return false
	}
	return true
}

func main() {
	entries := []LogEntry{
		{Level: "ERROR", Service: "payments", Message: "muvaffaqiyatsiz"},
		{Level: "INFO", Service: "payments", Message: "boshlandi"},
		{Level: "ERROR", Service: "auth", Message: "kirish rad etildi"},
	}

	filters := parseQuery("level:ERROR service:payments")

	var results []LogEntry
	for _, entry := range entries {
		if matches(entry, filters) {
			results = append(results, entry)
		}
	}
	fmt.Println(len(results), results[0].Message)
}

filters[parts[0]] = parts[1] — so'rovdagi har bir kalit:qiymat juftligi (level:ERROR) filtrlar xaritasiga qo'shiladi. matches funksiyasi — HAR BIR filtr uchun "comma-ok" (ok) tekshiruvidan foydalanadi: agar SO'ROVDA o'sha filtr BERILMAGAN bo'lsa (masalan foydalanuvchi service: yozmagan bo'lsa), o'sha shart TEKSHIRILMAYDI — faqat AYTIB o'tilgan filtrlar qo'llaniladi.

Bu — "API Gateway Pattern" darsida ko'rgan g'oyaga o'xshash: murakkab, ICHKI mantiq (filtrlash) FOYDALANUVCHIGA sodda, matnga o'xshash INTERFEYS orqali TAQDIM etiladi. Foydalanuvchi Go kodini yozmasdan, faqat ODDIY matn so'rovi orqali murakkab filtrlashni AMALGA OSHIRA oladi.

>_ Exercise

So'rov tiliga "contains" (xabar ichida qidirish) imkonini qo'shing.

  • matches funksiyasiga qo'shimcha tekshiruv qo'shing: agar filters'da "contains" bo'lsa VA entry.Message unda strings.Contains bo'yicha TOPILMASA, false qaytaring
  • "level:ERROR contains:kirish" so'rovini tahlil qilib, entries bo'ylab filtrlang
  • natijadagi mos kelgan yozuvlar sonini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Oddiy "kalit:qiymat" so'rov tili, foydalanuvchiga murakkab Go kodi yozmasdan, matnga o'xshash so'rovlar orqali loglarni moslashuvchan tarzda filtrlash imkonini beradi.

NEXT UP

Real-Time Tail