Commit graph

158 commits

Author SHA1 Message Date
Orion Henry
b5742315ef move op observer into transaction 2022-09-29 15:59:08 -05:00
Alex Good
f586c82557 OpSet::visualise: add argument to filter by obj ID
Occasionally one needs to debug problems in a document with a large
number of objects. In this case it is unhelpful to print a graphviz of
the whole opset because there are too many objects. Add a
`Option<Vec<ObjId>>` argument to `OpSet::visualise` to filter the
objects which are visualised.
2022-09-08 12:48:53 +01:00
Alex Good
eba7038bd2 Allow for empty head indices when decoding doc
The compressed document format includes at the end of the document chunk
the indicies of the heads of the document. Older versions of the
javascript implementation do not include these indicies so we allow them
to be omitted when decoding.

Whilst we're here add some tracing::trace logs to make it easier to
understand where parsing is failing.
2022-09-02 14:59:51 +01:00
Alex Good
9ac8827219
Remove storage-v2 feature flag
Signed-off-by: Alex Good <alex@memoryandthought.me>
2022-08-22 21:21:21 +01:00
Alex Good
252a7eb8a5
Add automerge::Automerge::save_nocompress
For some usecases the overhead of compressed columns in the document
format is not worth it. Add `Automerge::save_nocompress` to save without
compressing columns.

Signed-off-by: Alex Good <alex@memoryandthought.me>
2022-08-22 21:16:47 +01:00
Alex Good
34e919a4c8
Plumb in storage-v2
This is achieved by liberal use of feature flags. Main additions are:

* Build the OpSet more efficiently when loading from compressed
  document storage using a DocObserver as implemented in
  `automerge::op_tree::load`
* Reimplement the parsing login in the various types in
  `automerge::sync`

There are numerous other small changes required to get the types to line
up.

Signed-off-by: Alex Good <alex@memoryandthought.me>
2022-08-22 21:16:47 +01:00
Alex Good
3a3df45b85
Access change fields through field accessors
The representation of changes in storage-v2 is different to the existing
representation so add accessor methods to the fields of `Change` and
make all accesses go through them. This allows the change representation
in storage-v2 to be a drop-in.

Signed-off-by: Alex Good <alex@memoryandthought.me>
2022-08-22 21:16:42 +01:00
Alex Good
d71a734e49 Add OpIds to enforce ordering of Op::succ and Op::pred
The ordering of opids in the successor and predecessors of an op is
relevant when encoding because inconsistent ordering changes the
hashgraph. This means we must maintain the invariant that opids are
encoded in ascending lamport order. We have been maintaining this
invariant in the encoding implementation - however, this is not ideal
because it requires allocating for every op in the change when we commit
a transaction.

Add `types::OpIds` and use it in place of `Vec<OpId>` for `Op::succ` and
`Op::pred`. `OpIds` maintains the invariant that the IDs it contains
must be ordered with respect to some comparator function - which is
always `OpSetMetadata::lamport_cmp`. Remove the sorting of opids in
SuccEncoder::append.
2022-07-17 20:58:47 +01:00
Andrew Jeffery
6ea5982c16 Change parents to return result if objid is not an object
There is easy confusion when calling parents with the id of a scalar,
wanting it to get the parent object first but that is not implemented.
To get the parent object of a scalar id would mean searching every
object for the OpId which may get too expensive when lots of objects are
around, this may be reconsidered later but the result would still be
useful to indicate when the id doesn't exist in the document vs has no
parents.
2022-07-12 18:36:47 +01:00
Andrew Jeffery
a569611d83 Use clock_at for filter_changes 2022-05-26 19:03:09 +01:00
Orion Henry
c353abfe4e
Merge pull request #375 from jeffa5/get-changes-opt
Get changes opt
2022-05-22 10:30:24 -07:00
Andrew Jeffery
2c1a71e143 Use expect for getting clock 2022-05-20 18:01:46 +01:00
Andrew Jeffery
8b1c3c73cd Use BTreeSet for sync::State to allow deriving Hash 2022-05-20 16:13:10 +01:00
Andrew Jeffery
1355a024a7 Use actor_index to get state in update_history 2022-05-20 10:05:08 +01:00
Andrew Jeffery
e5b527e17d Remove old functions 2022-05-20 10:05:08 +01:00
Andrew Jeffery
36857e0f6b Store seq in clock to remove binary_search_by_key 2022-05-20 10:05:08 +01:00
Andrew Jeffery
b7c50e47b9 Just use get_changes_clock 2022-05-20 10:05:08 +01:00
Andrew Jeffery
933bf5ee07 Return an error when getting clock for missing hash 2022-05-20 10:05:08 +01:00
Andrew Jeffery
c2765885fd Maintain incremental clocks 2022-05-20 10:05:08 +01:00
Andrew Jeffery
0de37d292d Sort change results from clock search 2022-05-20 10:05:08 +01:00
Andrew Jeffery
b9a6b3129f Add method to get changes by clock 2022-05-20 10:05:08 +01:00
Andrew Jeffery
7d5eaa0b7f Move automerge unit tests to new file for clarity 2022-05-05 14:58:22 +01:00
Andrew Jeffery
5b15a04516 Some tidies 2022-05-05 14:52:01 +01:00
Orion Henry
a728b8216b range -> map_range(), added list_range() values() works on both 2022-05-03 19:27:51 -04:00
Orion Henry
0d3eb07f3f fix key/elemid bug and rename range to map_range 2022-05-02 13:30:59 -04:00
Orion Henry
9e6044c128 fixed panic in doc.values() - fixed concurrency bugs in range 2022-04-29 15:11:07 -04:00
Andrew Jeffery
af951f324a Run cargo fix 2022-04-23 11:06:39 +01:00
Andrew Jeffery
d667552a98 Add increment observation for observer 2022-04-20 14:44:04 +01:00
Andrew Jeffery
aa3c32cea3 Add ApplyOptions 2022-04-19 18:15:22 +01:00
Andrew Jeffery
76a19185b7 Add separate functions for with op_observer 2022-04-19 17:48:11 +01:00
Andrew Jeffery
702a0ec172 Add lifetimes to transact_with and fixup watch example 2022-04-19 17:30:06 +01:00
Andrew Jeffery
b6fd7ac26e Add op_observer to documents and transactions
This replaces the built-in patches with a more generic mechanism, and
includes a convenience observer which uses the old patches.
2022-04-19 17:30:05 +01:00
Orion Henry
696adb5005
Merge pull request #342 from automerge/doublequeue
duplicate changes in the queue could corrupt internal state
2022-04-19 10:31:35 -04:00
Orion Henry
6872e3fa9b
Merge pull request #338 from jeffa5/experiment-double-ended-range
Add double ended iterator for Range and Values
2022-04-18 17:28:03 -04:00
Orion Henry
5923d67bea duplicate changes in the queue could corrupt internal state 2022-04-18 16:31:13 -04:00
Andrew Jeffery
a65838076d Add parents iterator
This allows users to have the convenience of getting all of the parents
of an object, whilst allowing them to terminate early when they have
found what they need.
2022-04-18 16:15:29 +01:00
Andrew Jeffery
122b227101 Borrow the key 2022-04-15 20:47:02 +01:00
Andrew Jeffery
fb3b740a57 Make range just be over maps 2022-04-15 15:01:28 +01:00
Andrew Jeffery
cdfc2d056f Add double ended iterator for Range and Values 2022-04-15 14:39:44 +01:00
Orion Henry
965240d8f6 Merge remote-tracking branch 'origin/experiment' into wasm_readme 2022-04-08 18:07:44 -04:00
Andrew Jeffery
07553195fa Update wasm and js with new names 2022-04-08 18:23:56 +01:00
Andrew Jeffery
bcf191bea3 Add values_at 2022-04-08 18:18:48 +01:00
Andrew Jeffery
baa56b0b57 Add range_at 2022-04-08 18:18:48 +01:00
Andrew Jeffery
decd03a5d7 Add values iterator 2022-04-08 18:18:47 +01:00
Andrew Jeffery
1ca49cfa9b Add range to transactable and rename value to get
Also changes values to get_conflicts for more clarity on what it does
and opening up the name for iterating over values.
2022-04-08 18:18:22 +01:00
Andrew Jeffery
4406a5b208 Add range query
This is a way of efficiently getting just the keys and values in a
range.
2022-04-08 18:17:54 +01:00
Orion Henry
609234bb9d
Merge pull request #330 from jeffa5/experiment-graphemes
Remove grapheme splitting internally
2022-04-08 12:54:54 -04:00
Andrew Jeffery
94a122478d Add object replacement character in text_at 2022-04-08 10:13:52 +01:00
Andrew Jeffery
1bbcd4c151 Test that we can insert long strings into text 2022-04-08 09:36:48 +01:00
Andrew Jeffery
e4e9e9a691 Add tests for inserting into text
This ensures that we can still insert entire graphemes (small strings)
and break them into chars automatically.
2022-04-08 09:36:47 +01:00