syncany-team team mailing list archive
-
syncany-team team
-
Mailing list archive
-
Message #00588
Re: Long ids
Hi Gregor,
you forgot to hit "reply all" again :-)
I'll leave everything in there, so that everyone can read what you wrote
On Thu, Dec 5, 2013 at 10:17 AM, Gregor Trefs <gregor.trefs@xxxxxxxxx>wrote:
> Hi Philipp, hi Fabrice,
>
> I read your mails yesterday and what I in particular did not understood
> was that imposing of a type hierachy over an ID and the corresponding Use
> Case:
>
> >> (then you cannot mistakingly search for a file using a chunk id, for
> instance)
>
> I don't get myself used to the idea to use the ID to distinguish different
> class types (e.g. Multichunk, FileContent). If an instance of a class has
> an ID, then the type information is already encoded in the instance. Under
> the assumption (and I have the impression) that you want to use the ID as a
> standalone concept (e.g. storing in an Index to avoid fetching all
> multichunk information) then you may use a weak reference from the id to
> your instance.
>
Although I did not fully understand what you wrote here, I hope this
captures what you meant: You're wondering why we need an extra ObjectId
class (and FileId, MultiChunkId, ...), because you *assume* that the ID
cannot appear anywhere in the code without a corresponding instance (e.g. a
FileHistory carries its own ID, so there is no need for a special class
FileId).
However, this assumption is wrong. IDs can appear in database files and
code as references to the actual object.
Example:
The <multichunk> tag contains <chunkRef> tags, thereby referencing a Chunk
--> this translates to ChunkId, not Chunk
The reason for this indirect referencing in the XML is clear: A chunk can
be referenced in a certain database file, but it does not need to appear in
this particular database version. Instead, it could have been initially
appeared in a previous database version:
<databaseVersion>
<chunks>
<chunk id="ab1fdf" size="512" />
</chunks>
</databaseVersion>
<databaseVersion>
<multiChunks>
<multiChunk>
<chunkRef ref="ab1fdf" />
</multiChunk>
</chunks>
</databaseVersion>
To carry over this indirection to the code is not so clear, because in
theory, these references could be resolved: if you encounter a <chunkRef>
in the database, query it and get the corresponding Chunk object:
database.getChunk(new ChunkId("ab1fdf"))
However, this cannot always be done, because sometimes, there is only a
partial database in the memory, so having a reference of the object is a
better (and more memory-conserving way. Using a ChunkId, FileId, etc. is
just a way to make sure that you cannot select a Chunk using a FileId, so
database.getChunk(new FileId("ab1fdf")) is not possible.
You would be able to stay typesafe without imposing an own inheritance
> structure upon ObjectID which I assume to be rather flat. This satisfies
> point a. For point b and c I thought about UTF which has this dynamic size
> concept (as far as I remember). Only use that amount of memory that is
> really needed. This is a trade-off beteen a flexible size and a low memory
> footprint.
>
You totally lost me here! What's a, b, c?
>
> Regards
> Gregor
>
Best regards,
Philipp
Follow ups
References