PostgreSQL: Kombinasi Query LIKE dan IN

Saya memiliki dua tabel, misalkan tabel users (berisi name) dan tabel badwords (berisi word). Kebutuhannya adalah:

  1. Menemukan semua user yang namanya mengandung salah satu (atau lebih) kata yang terdapat di tabel badwords.
  2. Menemukan semua user yang namanya tidak mengandung satupun kata yang terdapat di tabel badwords.

Asumsikan semua name dan word ditulis dengan lowercase. Jika tidak, dapat menggunakan ILIKE.

Untuk masalah pertama:
SELECT *
FROM users
WHERE users.name LIKE ANY (
SELECT '%' || badwords.word || '%'
FROM badwords
)

Untuk masalah kedua:
SELECT *
FROM users
WHERE users.name NOT LIKE ALL (
SELECT '%' || badwords.word || '%'
FROM badwords
)

Penjelasan singkat:
Kita tidak dapat menggunakan IN karena IN bersifat membandingkan secara utuh, sementara kita butuh pembanding yang dapat membandingkan secara parsial (LIKE/ILIKE). Penggunaan ANY seperti OR, jika satu saja atau lebih dari subquery memenuhi kondisi LIKE, maka kondisi WHERE terpenuhi. Sementara penggunaan ALL seperti AND, harus semua terpenuhi (di kasus ini karena menggunakan NOT, berarti semua kata di subquery harus tidak ada).

Meningkatkan Performa SQL Query di Windows Phone

Pada tutorial sebelumnya, saya menjelaskan bagaimana cara menggunakan database SQLite pada app Windows Phone. Di tutorial tersebut saya melakukan copy file database dari “Package.Current.InstalledLocation” ke “ApplicationData.Current.LocalFolder”. Mengapa langkah ini diperlukan?

Ketika menambahkan external file pada Windows Phone project, biasanya developer memilih “Content” pada property “Build Action” dan “Copy always” pada property “Copy to Output Directory”. Dengan pilihan ini berarti external file tersebut akan di-copy ke dalam app package dan di-compress untuk mengurangi ukuran file yang harus di-download oleh pengguna di Windows Store. Hal ini mengakibatkan setiap kali ada query yang dijalankan, file database harus di-decompress terlebih dahulu sehingga dapat memakan waktu lama, apalagi jika ukuran file database sangat besar.

Solusi lain yang dapat dipilih adalah menggunakan pilihan property “Build Action” > “Embedded Resource”. Namun ini berarti ukuran file di Windows Store akan menjadi sangat besar karena file database tidak di-compress. Go green, save internet quota.

Dengan melakukan copy dari InstalledLocation ke LocalFolder, kita sudah melakukan decompress sebelum menjalankan query. Terlebih lagi, LocalFolder adalah persistent storage yang berarti file hasil decompress tersebut akan tetap ada meskipun app sudah ditutup dan dibuka kembali. Jangan lupa juga untuk selalu menambahkan index pada database. Dengan menggunakan database file di LocalFolder dan indexing yang tepat, performa SQL query akan meningkat tajam.

Menghubungkan Windows Phone 8.1 App dan SQLite

Karena bosan dengan web development, saya mencoba untuk mengembangkan sebuah aplikasi untuk Windows Phone 8.1 menggunakan Visual Studio Express 2015. Salah satu permasalahan terbesar yang saya temukan adalah Windows Phone 8.1 ternyata secara resmi sudah berhenti mendukung penggunaan database SQL Server CE (Compact Edition) yang umum digunakan pada versi pendahulunya (WP 8 dan WP 7). Lebih buruk lagi, dukungan resmi terhadap SQLite pun tidak ada, sehingga hanya meninggalkan pilihan plaintext file untuk penyimpanan data.

Namun sepertinya saya diselamatkan oleh sebuah library yang dibuat Frank Krueger yaitu sqlite-net yang memungkinkan penggunaan SQLite sebagai database app Windows Phone. Cara instalasi sqlite-net:

  1. Buka Tools (alt+T) > NuGet Package Manager > Package Manager Console
  2. Pada console, jalankan baris berikut
    Install-Package sqlite-net
  3. Pada Solution Explorer, klik kanan References > Add Reference
  4. Pada menu kiri, pilih Windows Phone 8.1 > Extensions, pastikan SQLite for “Windows Phone 8.1” dalam status aktif
  5. Perhatikan pada Solution Explorer, akan ada 2 file baru yaitu SQLite.cs dan SQLiteAsync.cs

Kali ini kita akan menggunakan SQLite.cs sebagai penghubung app dengan SQLite, penggunaan fungsi-fungsi async (asynchronous) akan dijelaskan di kesempatan lain. Sebelum dapat menggunakan database SQLite, lakukan langkah-langkah berikut:

  1. Persiapkan file database SQLite yang akan digunakan (contoh: db.sqlite)
  2. Buat folder baru di bawah project Anda (contoh: DB)
  3. Klik kanan folder yang baru dibuat, Add > Existing Item, arahkan pada file SQLite Anda
  4. Klik kanan file db.sqlite di Solution Explorer > Properties
  5. Pada panel properties pastikan “Build Action” berisi “Content” dan “Copy to Output Directory” berisi”Copy always”
  6. Salin code berikut pada class yang akan menggunakan koneksi database
    public static async void copyDatabase()
    {
    bool isDatabaseExisting = false;
    try
    {
    StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync("db.sqlite");
    isDatabaseExisting = true;
    }
    catch
    {
    isDatabaseExisting = false;
    if (!isDatabaseExisting)
    {
    StorageFile databaseFile = await Package.Current.InstalledLocation.GetFileAsync("DB\\db.sqlite");
    await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder);
    }
    }

    public static SQLiteConnection getConnection()
    {
    return new SQLiteConnection(Path.Combine(ApplicationData.Current.LocalFolder.Path, "db.sqlite"));
    }
  7. Pastikan copyDatabase() dipanggil sebelum menggunakan database
  8. Untuk mendapatkan suatu tabel, buatlah entity class untuk tabel tersebut, misalnya users
  9. Gunakan pemanggilan seperti berikut, dilanjutkan dengan query yang diinginkan (Where, GroupBy, …)
    getConnection().Table<users>().Where(...)

Mengubah Permalink di WordPress

Permalink adalah “alamat statis” dari sebuah halaman web (atau blog post). Kegunaan utamanya adalah mempercantik URL website Anda dan juga SEO (Search Engine Optimization). Sebagai contoh, permalink default di WordPress memiliki format sebagai berikut: http://blog.yohan.id/?p=1 dimana angka di belakang adalah ID post.

Format permalink yang saya gunakan saat ini memiliki bentuk: http://blog.yohan.id/read/1/hello-world/ dimana strukturnya adalah http://blog.yohan.id/read/%post_id%/%postname%/

Anda dapat mengubah format permalink di dashboard WordPress, bagian “Settings”. Terdapat beberapa pilihan permalink yang biasa digunakan pengguna WordPress, namun Anda juga dapat membuat permalink custom. Format seperti apa saja yang disediakan WordPress?

%year%
Tahun post dalam format 4 digit (Contoh: 2015)

%monthnum%
Bulan post dalam format 2 digit (Contoh: 08)

%day%
Tanggal post dalam format 2 digit (Contoh: 27)

%hour%
Jam post dalam format 2 digit (Contoh: 01)

%minute%
Menit post dalam format 2 digit (Contoh: 01)

%second%
Detik post dalam format 2 digit (Contoh: 01)

%post_id%
Nomor ID post (Contoh: 123)

%postname%
Judul post atau biasa disebut slug (Contoh: mengubah-permalink-di-wordpress)

%category%
Nama kategori post (Contoh: tutorial), apabila post memiliki subkategori maka nama subkategori akan ditampilkan secara berurutan setelah kategori (Contoh: tutorial/windows)

%author%
Nama penulis post (Contoh: matt-mullenweg), siapakah Matt Mullenweg?

Jadi jika Anda ingin permalink berbentuk http://yohan.id/post/2015/08/27/baca/mengubah-permalink-di-wordpress/ maka format yang perlu Anda isi ke custom permalink adalah /post/%year%/%monthnum%/%day%/baca/%postname%/

Masalah Permalink WordPress di Nginx HTTP Server

Ketika migrasi hosting, saya menggunakan Nginx HTTP server di hosting yang baru. Setelah semua konfigurasi selesai, saya baru menyadari bahwa ketika post saya di blog (semua post) di-klik, yang terjadi adalah ditampilkan halaman 404 (not found). Setelah sedikit berguru di bawah didikan master Google, saya menemukan pencerahan. Salah satu solusi yang dapat dilakukan adalah menggunakan permalink default (http://blog.yohan.id/?p=1) yang tentu tidak saya inginkan karena bentuknya tidak sedap dipandang.

Berikut solusi yang sudah saya coba:

  1. Buka file config Nginx situs Anda, jika masih menggunakan default dapat menggunakan command berikut
    sudo nano /etc/nginx/sites-available/default
  2. Cari bagian config yang berisi baris berikut
    location / {
    try_files $uri $uri/ =404;
    }
  3. Ubah dengan baris berikut
    location / {
    try_files $uri $uri/ /index.php?$args;
    }
  4. Reload Nginx
    sudo nginx -s reload

Untuk bermain-main dengan permalink WordPress, saya akan menulis tutorial singkat di post selanjutnya.