MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Parsing sql query menggunakan antlr parsetree ke dokumen mongo bson di Java

Di salah satu pekerjaan saya sebelumnya, saya melakukan hal serupa:mendapat kueri (bukan sql, tetapi sangat mirip) dan menerjemahkannya ke kueri mongo dengan antlr.

Saya tidak memiliki kode untuk dibagikan, Namun saya dapat membagikan pemikiran saya:

  1. Mongo tidak sesuai dengan SQL, jadi Anda tidak bisa hanya mengambil tata bahasa sql. Bagaimana dengan GABUNG dan semua aljabar relasional? Bagaimana dengan agregasi yang cukup rumit di mongo dengan kerangka agregasinya? Di arah yang berlawanan, bagaimana Anda menghasilkan SQL yang diterjemahkan ke klausa "ada" di mongo. Ada banyak hal seperti ini, ada yang kecil, ada yang besar, tetapi intinya Anda harus berbicara tentang semacam subset sql, beberapa DSL yang diizinkan untuk digunakan sebagai bahasa kueri dan terlihat "seperti" sql karena orang sudah terbiasa dengan SQL.

  2. Dengan mengingat hal itu, Anda harus membuat tata bahasa Anda sendiri dan Antlr akan menghasilkan lexer/parser untuk Anda. Anda juga akan mendapatkan pemeriksaan sintaks kueri di Runtime. Antlr tidak akan dapat mengurai kueri jika tidak dalam format yang benar, beberapa aturan tata bahasa akan gagal. Ini adalah alasan lain untuk tidak mengambil SQL "sebagaimana adanya".

  3. Sejauh ini bagus, Anda telah membuat pendengar / pengunjung Anda sendiri. Dalam kasus saya, saya telah memilih untuk membuat representasi objek dari kueri dengan status internal dan semuanya. Jadi kueri

Select id,name 
from employee 
where age > 30 
 and department = 'IT' 
limit 200

Diterjemahkan ke objek dengan tipe:


class Query {
   private SelectClause select;
   private FromClause  from;
   private WhereClause where;
   private Limit        limit;
}

class SelectClause {
   private List<String> fields;
}
...
class WhereClause {
   Condition root;
}

interface Condition {
...
}

class AndCondition implements Condition { // the same for Not, Or

}

Untuk kueri khusus ini kira-kira seperti:

Query q = new Query(new SelectClause(["id", "name"]), new FromClause("employee"), new WhereClause(new AndCondition(new SimpleLeafCondition("age", Operators.GT, 30), new  SimpleLeafCondition("department", Operators.EQ, "IT" )), new Limit(30));

Kemudian dimungkinkan untuk membuat beberapa pengoptimalan dalam kueri (seperti menyematkan klausa di mana jika Anda perlu, atau, misalnya, memanipulasi bagian "Untuk" jika Anda bekerja di lingkungan multi penyewa dan memiliki koleksi berbeda untuk penyewa berbeda).

Lagi pula, Anda dapat menggunakan pola desain "penerjemah" dan secara rekursif mengurai objek kueri dan "menerjemahkan" mereka ke kueri mongo yang valid. Saya ingat bahwa langkah ini membutuhkan waktu sekitar 1 hari untuk diselesaikan (7 tahun yang lalu dengan mongo 2 I tebak, tapi tetap saja), mengingat struktur objek yang benar yang mewakili kueri, jadi ini seharusnya tidak terlalu rumit. Saya mengangkat ini, karena sepertinya ini adalah perhatian utama Anda dalam pertanyaan tersebut.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoError operator tingkat atas yang tidak diketahui:$set

  2. 10 fitur teratas dari MongoDB Atlas

  3. MongoDB memproyeksikan dokumen dengan jumlah lebih dari 2

  4. Memasukkan bidang (kolom) baru ke mongoDB dengan panda

  5. Mencetak hasil kueri dari Mongodb di Scala menggunakan mongo-scala-driver