Specmonstah
  • Introduction
  • Infomercial
  • Tutorial
    • Concepts
    • 01: ent db
    • 02: schemas
    • 03: queries
    • 04: refs
    • 05: progressive construction
    • 06: spec-gen
    • 07: spec gen customization and omission
    • 08: visiting functions
    • 09: performing inserts
    • 10: uniqueness constraint
    • 11: collection constraint (vector of foreign keys)
    • 12: what about cycles?
Powered by GitBook
On this page

Was this helpful?

  1. Tutorial

05: progressive construction

At the beginning of this tutorial, I told you that add-ents takes an ent db as an argument:

(sm/add-ents {:schema schema} {:post [[1]]})

You may have wondered why the empty ent db {:schema schema} is used, rather than just directly passing in schema; why don't we just write this?

(sm/add-ents schema {:post [[1]]})

The reason the first argument to add-ents is an ent db is so you can take the return value of add-ents and pass it in as the first argument to further calls to add-ents:

(ns reifyhealth.specmonstah-tutorial.05
  (:require [reifyhealth.specmonstah.core :as sm]))

(def schema
  {:user  {:prefix :u}
   :topic {:prefix    :t
           :relations {:owner-id [:user :id]}}})

(defn ex-01
  []
  (let [ent-db-1 (sm/add-ents {:schema schema} {:topic [[1]]})
        ent-db-2 (sm/add-ents ent-db-1 {:topic [[1]
                                                [1 {:refs {:owner-id :hamburglar}}]]})]
    (sm/view ent-db-1)
    (sm/view ent-db-2)))

(ex-01)

Additional calls to add-ents are additive; they will never alter existing ents, and will only add new ents. The first call, (sm/add-ents {:schema schema} {:topic [[1]]}), produces a :topic named :t0 referencing a :user named :u0:

That ent db is passed to the next call:

(sm/add-ents ent-db-1 {:topic [[1]
                               [1 {:refs {:owner-id :hamburglar}}]]})

This creates two more topics:

The default naming system picks up where it left off, giving the topic the names :t1 and :t2. :t1 references the existing user, :u0, and :t2 references a new user from the :refs, :hamburglar. When progressively generating an ent-db, you can expect Specmonstah to behave as if all queries were passed as a single query to a single call of add-ents.

Everything you've learned up to this point has focused on generating an ent db: you've learned a bit about how to use schemas and queries together to concisely specify what ents to create. You've also learned how to customize the relationships with the :refs query option.

In the next couple sections, you'll learn about how Specmonstah uses visitation to generate and insert business data.

Previous04: refsNext06: spec-gen

Last updated 5 years ago

Was this helpful?