Skip to content

Instantly share code, notes, and snippets.

@blambeau
Last active January 10, 2026 11:14
Show Gist options
  • Select an option

  • Save blambeau/f7ecf6b0adab5a7c43544c14ccad76db to your computer and use it in GitHub Desktop.

Select an option

Save blambeau/f7ecf6b0adab5a7c43544c14ccad76db to your computer and use it in GitHub Desktop.

Prompt

Me: You wrote a Relation#toText(...) method to display Relations as nice ASCII tables. Are we sure it's working on nested relations ?

Claude: the unit tests pass !

Me (thinking): yes, but they just assert incomplete stuff.

Me: Can you write example/toText.ts and execute it for me, so I can see the output ?

Claude's answer

∴ Thinking…

Claude Now let me run it. I need to check how to run it - probably need to use tsx from the example folder.

Result

Bash(cd /workspace/example && npx tsx toText.ts 2>&1)
 ======================================================================
 EXAMPLE 1: Flat Relations
 ======================================================================

 --- Suppliers ---
 +-----+-------+--------+--------+
 | sid | name  | status | city   |
 +-----+-------+--------+--------+
 | S1  | Smith |     20 | London |
 | S2  | Jones |     10 | Paris  |
 | S3  | Blake |     30 | Paris  |
 | S4  | Clark |     20 | London |
 | S5  | Adams |     30 | Athens |
 +-----+-------+--------+--------+


 --- Parts (with floats) ---
 +-----+-------+-------+--------+--------+
 | pid | pname | color | weight | city   |
 +-----+-------+-------+--------+--------+
 | P1  | Nut   | Red   | 12.500 | London |
 | P2  | Bolt  | Green |     17 | Paris  |
 | P3  | Screw | Blue  | 17.250 | Oslo   |
 +-----+-------+-------+--------+--------+


 --- Projected Relation (sid, name only) ---
 +-----+-------+
 | sid | name  |
 +-----+-------+
 | S1  | Smith |
 | S2  | Jones |
 | S3  | Blake |
 | S4  | Clark |
 | S5  | Adams |
 +-----+-------+

 ======================================================================
 EXAMPLE 2: Group (nested relations)
 ======================================================================

 --- Suppliers grouped by city ---
 +--------+--------------------------+
 | city   | suppliers                |
 +--------+--------------------------+
 | London | +-----+-------+--------+ |
 |        | | sid | name  | status | |
 |        | +-----+-------+--------+ |
 |        | | S1  | Smith |     20 | |
 |        | | S4  | Clark |     20 | |
 |        | +-----+-------+--------+ |
 |        |                          |
 | Paris  | +-----+-------+--------+ |
 |        | | sid | name  | status | |
 |        | +-----+-------+--------+ |
 |        | | S2  | Jones |     10 | |
 |        | | S3  | Blake |     30 | |
 |        | +-----+-------+--------+ |
 |        |                          |
 | Athens | +-----+-------+--------+ |
 |        | | sid | name  | status | |
 |        | +-----+-------+--------+ |
 |        | | S5  | Adams |     30 | |
 |        | +-----+-------+--------+ |
 |        |                          |
 +--------+--------------------------+

 ======================================================================
 EXAMPLE 3: Image (nested relations)
 ======================================================================

 --- Suppliers with their shipments ---
 +-----+-------+---------------+
 | sid | name  | shipments     |
 +-----+-------+---------------+
 | S1  | Smith | +-----+-----+ |
 |     |       | | pid | qty | |
 |     |       | +-----+-----+ |
 |     |       | | P1  | 300 | |
 |     |       | | P2  | 200 | |
 |     |       | +-----+-----+ |
 |     |       |               |
 | S2  | Jones | +-----+-----+ |
 |     |       | | pid | qty | |
 |     |       | +-----+-----+ |
 |     |       | | P1  | 300 | |
 |     |       | | P2  | 400 | |
 |     |       | +-----+-----+ |
 |     |       |               |
 | S3  | Blake | +-----+-----+ |
 |     |       | | pid | qty | |
 |     |       | +-----+-----+ |
 |     |       | | P2  | 200 | |
 |     |       | +-----+-----+ |
 |     |       |               |
 | S4  | Clark | +--+          |
 |     |       | |  |          |
 |     |       | +--+          |
 |     |       | +--+          |
 |     |       |               |
 | S5  | Adams | +--+          |
 |     |       | |  |          |
 |     |       | +--+          |
 |     |       | +--+          |
 |     |       |               |
 +-----+-------+---------------+

 ======================================================================
 EXAMPLE 4: Wrap (nested objects)
 ======================================================================

 --- Suppliers with location wrapped ---
 +-----+-------+-------------------------------+
 | sid | name  | location                      |
 +-----+-------+-------------------------------+
 | S1  | Smith | {"status":20,"city":"London"} |
 | S2  | Jones | {"status":10,"city":"Paris"}  |
 | S3  | Blake | {"status":30,"city":"Paris"}  |
 | S4  | Clark | {"status":20,"city":"London"} |
 | S5  | Adams | {"status":30,"city":"Athens"} |
 +-----+-------+-------------------------------+

 ======================================================================
 EXAMPLE 5: Special Values
 ======================================================================

 --- Various value types ---
 +----+--------------------------+---------------------------+
 | id | value                    | note                      |
 +----+--------------------------+---------------------------+
 |  1 | [null]                   | null value                |
 |  2 | [undefined]              | undefined value           |
 |  3 |                    3.142 | float (default precision) |
 |  4 | 2024-06-15T10:30:00.000Z | date                      |
 |  5 | {"nested":"object"}      | plain object              |
 |  6 | [a, b, c]                | array of primitives       |
 +----+--------------------------+---------------------------+

 ======================================================================
 EXAMPLE 6: Options
 ======================================================================

 --- Float precision: 1 decimal ---
 +-----+-------+-------+--------+--------+
 | pid | pname | color | weight | city   |
 +-----+-------+-------+--------+--------+
 | P1  | Nut   | Red   |   12.5 | London |
 | P2  | Bolt  | Green |     17 | Paris  |
 | P3  | Screw | Blue  |   17.3 | Oslo   |
 +-----+-------+-------+--------+--------+


 --- Float precision: 5 decimals ---
 +---------+
 | pi      |
 +---------+
 | 3.14159 |
 +---------+


 --- Trimmed output (trimAt: 40) ---
 +-----+-------+--------+--------+
 | sid | name  | status | city   |
 +-----+-------+--------+--------+
 | S1  | Smith |     20 | London |
 | S2  | Jones |     10 | Paris  |
 | S3  | Blake |     30 | Paris  |
 | S4  | Clark |     20 | London |
 | S5  | Adams |     30 | Athens |
 +-----+-------+--------+--------+

 ======================================================================
 EXAMPLE 7: Complex Nesting
 ======================================================================

 --- Shipments summarized by supplier, with supplier info ---
 +-----+-------+--------+-----------+-----------+
 | sid | name  | city   | total_qty | num_parts |
 +-----+-------+--------+-----------+-----------+
 | S1  | Smith | London |       500 |         2 |
 | S2  | Jones | Paris  |       700 |         2 |
 | S3  | Blake | Paris  |       200 |         1 |
 +-----+-------+--------+-----------+-----------+


 --- Parts grouped by color with count ---
 +-------+-----------------------------------+-------+
 | color | parts                             | count |
 +-------+-----------------------------------+-------+
 | Red   | +-----+-------+--------+--------+ |     1 |
 |       | | pid | pname | weight | city   | |       |
 |       | +-----+-------+--------+--------+ |       |
 |       | | P1  | Nut   | 12.500 | London | |       |
 |       | +-----+-------+--------+--------+ |       |
 |       |                                   |       |
 | Green | +-----+-------+--------+-------+  |     1 |
 |       | | pid | pname | weight | city  |  |       |
 |       | +-----+-------+--------+-------+  |       |
 |       | | P2  | Bolt  |     17 | Paris |  |       |
 |       | +-----+-------+--------+-------+  |       |
 |       |                                   |       |
 | Blue  | +-----+-------+--------+------+   |     1 |
 |       | | pid | pname | weight | city |   |       |
 |       | +-----+-------+--------+------+   |       |
 |       | | P3  | Screw | 17.250 | Oslo |   |       |
 |       | +-----+-------+--------+------+   |       |
 |       |                                   |       |
 +-------+-----------------------------------+-------+

Review

Me: We miss DEE Relation([{}]) and DUM Relation([])

Claude's answer

Claude: Let me fix the example numbering and also add unit tests for DEE/DUM: ∴ Thinking…

  Example file (example/toText.ts):
  - Added DEE and DUM examples with explanations

  Unit tests (tests/writer/toText.test.ts):
  - Added 2 new tests (now 20 total)

  Output:
  --- DEE: one tuple, no attributes (TRUE) ---
  +--+
  |  |
  +--+
  |  |
  +--+

  --- DUM: no tuples, no attributes (FALSE) ---
  +--+
  |  |
  +--+
  +--+

  - DEE renders with header + 1 data row (both empty cells)
  - DUM renders with header only, no data rows

Conclusion

Me: You can definitely commit, I trust your code (having also quickly looked at it for complexity analysis).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment