Asynchronous Sources in DataScript
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 20/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Cần làm rõ
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- clojure, javascript
- Lĩnh vực
- databases
Hướng nghiên cứu
Bắt đầu với datascript.core/q và giao thức datascript.db.ISearch được đề cập trong đề xuất. Theo dõi cách các mẫu truy vấn gọi hoạt động tìm kiếm, sau đó xác định cách một triển khai IAsyncSearch và việc xử lý kết quả bất đồng bộ có thể phù hợp trên Clojure, ClojureScript và JavaScript. Công việc được xem là hoàn tất khi đã thống nhất một thiết kế đa nền tảng, hành vi đồng bộ được giữ nguyên và có các kiểm thử cho các nguồn bất đồng bộ.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Currently, DataScript queries are synchronous. When a query is executed, each pattern has search called in sequential order against a record that implements datascript.db.ISearch. The search calls are synchronous, as they are currently operations against an in-memory immutable BTSet record. This makes sense for a single-threaded environment such as JavaScript / ClojureScript, and functions in Clojure as well.
This proposes to add the capability for asynchronous data sources to DataScript. This can be done as a branch or fork of DataScript in the interim, but I would like to see this merged into DataScript if possible.
This opens the following possibilities:
- Leveraging Clojure parallelism; each pattern queried for could be performed separately and asynchronously.
- LevelDB support in a Node environment; requires callbacks.
- IndexedDB support in a browser environment; requires callbacks.
In the case of LevelDB and IndexedDB, there are complications when it comes to guaranteeing immutability, but it is a separate subject from asynchronous queries and out of scope of this proposal.
At a high level, we would implement an IAsyncSearch protocol, where the return values are expected to be promises or channnels. The intermediate query functions would check for the implementation of the IAsyncSearch methods on the source object provided. On a call to datascript.core/q the sources would be checked. If any sources were provided that implement IAsyncSearch, we would synchronously block on the call if the platform supports it, otherwise, we would return a promise or channel.
It would be useful to note the requirements, implied or explicit:
- Asynchronous
- Minimal impact as possible on existing DataScript code.
- As little platform-specific code as possible.
- Synchronous calls should work as expected, with little performance degradation.
- JavaScript integration, returning a JavaScript standard promise, or accept a callback function.
There are a few ways that asyncronity can be gotten:
- Native - Clojure promises, and JavaScript promises (ECMAScript 6)
core.asyncchannelscljs-promises- ClojureScript promises built oncore.asyncredlobster- ClojureScript promises for Node.promesa- Promises for Clojure and ClojureScript
Native
Clojure already has support for promises via promise and synchronously blocking on dereferencing. ECMAScript 6 also supports promises, but would require the JavaScript environment to support ECMAScript 6.
Implementing native support at this level would require a lot of platform specific code, but would work in a JavaScript-targeted environment.
core.async
core.async is well-supported on both Clojure and ClojureScript, but:
- Integrating with JavaScript would require a callback function to be provided on query call.
- While Clojure has the synchronously blocking
<!!operator, ClojureScript only has the asynchronous<!operator and requires all channel operations to be wrapped in agoblock. This would contaminate the Datascript code withcore.async. core.asyncis primarily for message passing and synchronization.
core.async does have the advantage in that it is supported on earlier JVM and JavaScript platforms.
cljs-promises
cljs-promises is built on core.async and provides a promise facility that addresses one of the concerns above. It still does not solve the issue where it has to be asynchronous all the way up. It is also ClojureScript-specific, and does not satisfy the cross-platform requirement.
redlobster
redlobster is a ClojureScript promise facility with strong ties to NodeJS, but it has been shown to work in browsers as well if one ignores some of the Node-specific functionality. However, the query call itself would need to be asynchronous, returning a promise. It is also ClojureScript-specific.
promesa
promesa provides a cross-platform abstraction layer for both Clojure and ClojureScript.
- On Clojure, it is built on JDK8 completable futures.
- On ClojureScript, it is built on
bluebird.bluebirdis well-accepted in the JavaScript community, so abluebirdpromise could be returned if invoked from JavaScript on an asynchronous data source.
A possibly big negative is the requirement for JDK8, transitively imposing a dependency onto DataScript. It however fulfills much of the other requirements, and would be my choice.
- Ngôn ngữ chính
- Clojure
- Star
- 5.8k
- Fork
- 318
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của tonsky/datascript
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 42/100
tonsky/datascript#498 · 1 bình luận ·
-
Datascript MCP Server Đang mở
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 10/100
tonsky/datascript#489 ·
-
Stack overflow when transacting :db.type/tupleAttrs with a :db.type/ref attr through :db.fn/call Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
tonsky/datascript#483 · 2 bình luận ·
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
tonsky/datascript#470 · 1 bình luận ·
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
tonsky/datascript#441 · 1 bình luận · 3 reaction ·
Tất cả issue của tonsky/datascript
Issue tương tự
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
-
.Team/Metabot Priority:P3
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
needs triage
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
scalar-labs/scalar-jepsen#222 · 1 bình luận ·