=> (crux/submit-tx node [[:crux.tx/put {:crux.db/id :legend/picasso :kind :human}]
[:crux.tx/put {:crux.db/id :legend/picasso :planet :earth}]
[:crux.tx/put {:crux.db/id :legend/picasso :alive? :always}]
[:crux.tx/put {:crux.db/id :legend/picasso :location "Barcelona"}]])
=> (crux/entity-history (crux/db node) :legend/picasso :desc {:with-docs? true})
[{:crux.tx/tx-time #inst "2020-08-22T13:50:46.966-00:00",
:crux.tx/tx-id 0,
:crux.db/valid-time #inst "2020-08-22T13:50:46.966-00:00",
:crux.db/content-hash
#crux/id "ea449b1f1d7bb0ef7ad3ddf83f36e4eff18c9869",
:crux.db/doc {:crux.db/id :legend/picasso, :location "Barcelona"}}]
would the only way not to lose #{:kind :planet :alive?}
attributes be to provide them a different #inst
as a part of the same transaction?
=> (crux/submit-tx node [[:crux.tx/put {:crux.db/id :legend/picasso :kind :human} #inst "2020-08-19"]
[:crux.tx/put {:crux.db/id :legend/picasso :planet :earth} #inst "2020-08-20"]
[:crux.tx/put {:crux.db/id :legend/picasso :alive? :always} #inst "2020-08-21"]
[:crux.tx/put {:crux.db/id :legend/picasso :location "Barcelona"} #inst "2020-08-22"]])
=> (crux/entity-history (crux/db node) :legend/picasso :desc {:with-docs? true})
[{:crux.tx/tx-time #inst "2020-08-22T13:59:16.368-00:00",
:crux.tx/tx-id 0,
:crux.db/valid-time #inst "2020-08-22T00:00:00.000-00:00",
:crux.db/content-hash
#crux/id "ea449b1f1d7bb0ef7ad3ddf83f36e4eff18c9869",
:crux.db/doc {:crux.db/id :legend/picasso, :location "Barcelona"}}
{:crux.tx/tx-time #inst "2020-08-22T13:59:16.368-00:00",
:crux.tx/tx-id 0,
:crux.db/valid-time #inst "2020-08-21T00:00:00.000-00:00",
:crux.db/content-hash
#crux/id "32c630cc43444c1bef891a25d1c764463386f7b4",
:crux.db/doc {:crux.db/id :legend/picasso, :alive? :always}}
{:crux.tx/tx-time #inst "2020-08-22T13:59:16.368-00:00",
:crux.tx/tx-id 0,
:crux.db/valid-time #inst "2020-08-20T00:00:00.000-00:00",
:crux.db/content-hash
#crux/id "f5f0304f5d32b98b83a41e38a98904b97bf9c36a",
:crux.db/doc {:crux.db/id :legend/picasso, :planet :earth}}
{:crux.tx/tx-time #inst "2020-08-22T13:59:16.368-00:00",
:crux.tx/tx-id 0,
:crux.db/valid-time #inst "2020-08-19T00:00:00.000-00:00",
:crux.db/content-hash
#crux/id "fe64a4d1e0b747ad68b93e1ab677d71681607431",
:crux.db/doc {:crux.db/id :legend/picasso, :kind :human}}]
what is a crux way to do history rollups? i.e. "as of" 2020-08-21
I know this about Picasso:
{:crux.db/id :legend/picasso
:kind :human
:planet :earth
:alive? :always}
I could walk the history with a manual merge, but before doing that want to make sure crux does not already have something up its sleeve to roll these up.
apps use crux as a library with postgres as its storage (crux-jdbc) when an app is started it goes through all the transactions to index them:
2020-08-22T10:24:56,745 [crux-polling-tx-consumer] DEBUG crux.tx - Indexing tx-id: 7
2020-08-22T10:24:56,746 [crux-polling-tx-consumer] DEBUG crux.tx - Indexing tx-id: 9
2020-08-22T10:24:56,882 [crux-polling-tx-consumer] DEBUG crux.tx - Indexing tx-id: 10
2020-08-22T10:24:56,884 [crux-polling-tx-consumer] DEBUG crux.tx - Indexing tx-id: 14
2020-08-22T10:24:56,937 [crux-polling-tx-consumer] DEBUG crux.tx - Indexing tx-id: 15
2020-08-22T10:24:56,938 [crux-polling-tx-consumer] DEBUG crux.tx - Indexing tx-id: 16
2020-08-22T10:24:56,939 [crux-polling-tx-consumer] DEBUG crux.tx - Indexing tx-id: 18
2020-08-22T10:24:56,977 [crux-polling-tx-consumer] DEBUG crux.tx - Indexing tx-id: 19
2020-08-22T10:24:56,980 [crux-polling-tx-consumer] DEBUG crux.tx - Indexing tx-id: 20
...
given these conditions:
- there are/will be millions of transactions
- the startup time is important, currently, without crux, it is in a matter of seconds
- crux needs to run embedded (as a lib), can't currently manage a separate cluster of crux instances
what would be the recommended approach? i.e. can the index loading be lazy; can it be loaded on demand; is it something not to worry and mute these crux-polling-tx-consumer
debug messages; etc.