notes:internals:db
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| notes:internals:db [2025/09/07 01:15] – smj-edison | notes:internals:db [2025/09/08 19:27] (current) – smj-edison | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Database ====== | + | ====== Database |
| //If you want to follow along in the code, all of these things are implemented in trie.c, db.c, folk.c, | //If you want to follow along in the code, all of these things are implemented in trie.c, db.c, folk.c, | ||
| and prelude.tcl.// | and prelude.tcl.// | ||
| - | Folk's database stores all Wishes, Claims, Whens, and Holds. Essentially, | + | Folk's database stores all Wishes, Claims, |
| - | in Folk. The database | + | in Folk. The data type of this database |
| - | Wish, When, etc—are functions that insert a Statement into the database by calling the Say function. | + | Wish, Claim, and When. |
| - | We'll cover Statement removal later. | + | |
| ===== Statements ===== | ===== Statements ===== | ||
| So, what is a Statement? A Statement consists of two parts: the Clause and the child matches*. | So, what is a Statement? A Statement consists of two parts: the Clause and the child matches*. | ||
| - | Let's start with the Clause: a Clause is an array of words, with each word known as a Term. An example | + | Let's start with the Clause: a Clause is an array of words, with each word known as a Term†. An example |
| Clause, "the sky is blue", would become [" | Clause, "the sky is blue", would become [" | ||
| - | === Wish and Claim === | + | === Wishes |
| - | Let's see what happens when we run Wish. | + | Statements are inserted when running the core commands—Wish, |
| + | Say. Say inserts the provided Statement into the database. | ||
| + | |||
| + | Since Wish is a command that inserts a Statement, let's see what happens when we run it. | ||
| < | < | ||
| Line 37: | Line 39: | ||
| - We add " | - We add " | ||
| - We preserve both the query and the code (that' | - We preserve both the query and the code (that' | ||
| - | - We add "with environment {foo bar}", as Tcl doesn' | + | - We add "with environment {foo bar}"‡, as Tcl doesn' |
| ==== Reacting to Statements ==== | ==== Reacting to Statements ==== | ||
| Line 57: | Line 59: | ||
| Wait wait, what?? That was a lot all at once. Let's break it down. | Wait wait, what?? That was a lot all at once. Let's break it down. | ||
| - | First, | + | First, the context. We just inserted a Statement, so we need to check if there' |
| Whens that match. So, we do a database query. But what kind of query? Well, let's convert this Wish into | Whens that match. So, we do a database query. But what kind of query? Well, let's convert this Wish into | ||
| what a When would look like for this Statement. The easiest way to explain this is to just look at a | what a When would look like for this Statement. The easiest way to explain this is to just look at a | ||
| Line 74: | Line 76: | ||
| === When scheduling === | === When scheduling === | ||
| - | One exciting thing about folk2 is its support for multithreading. It does this by running | + | One exciting thing about folk2 is its support for multithreading. It supports |
| - | on its own thread. That means that when a Statement matches with a When, it needs to be queued for the next | + | to run on a thread |
| available thread to pick it up. That's exactly what happened in this example. The Wish got inserted, | available thread to pick it up. That's exactly what happened in this example. The Wish got inserted, | ||
| it checked for matching Whens, and then when it found a match, it pushed it to the work queue to be run | it checked for matching Whens, and then when it found a match, it pushed it to the work queue to be run | ||
| as soon as a thread is available. | as soon as a thread is available. | ||
| - | In fact, it's quite literally called | + | In fact, when this queued item runs, it is known as a Match. |
| - | it creates | + | statements, which we'll get to in a bit. |
| === Statements and Matches === | === Statements and Matches === | ||
| Line 157: | Line 159: | ||
| === Footnotes === | === Footnotes === | ||
| - | * Also metadata, but this is already long enough. | + | * Also metadata |
| + | |||
| + | † This is a little misleading, as a Statement can have Terms with spaces in them. For example, | ||
| + | the last Term in `Wish $this has name "Mason Jones" | ||
| + | space seperated by default, and all the database commands are called from Tcl. | ||
| + | |||
| + | ‡ This is simplified for explanation reasons. This is actually a list of environments, | ||
| + | entry being one level higher in the call stack. | ||
notes/internals/db.1757207741.txt.gz · Last modified: by smj-edison
