Hey Michael,
the -2 for the cluster-id states a "null record", see:
private static final ORecordId NULL_RECORD_ID = new ORecordId(-2,
ORID.CLUSTER_POS_INVALID);
Cheers,
Chris
Am Samstag, 14. Februar 2015 21:02:56 UTC+1 schrieb Michael Peterson:
>
> Hi Chris,
>
> Thanks for the quick reply and pointer to the code - I believe that
> answers my first and third questions
> 1. Was my interpretation of the serialization formats correct? *Yes*
> 3. How do I tell the difference between the two forms? The answer is
> *whether
> the zigzag-decoded length at the start of each header entry is positive
> (you have a property) or negative (you have a Document).*
>
> I would still like to know what the meaning of "-2" is for the cluster-id
> for a property - it seems to be hard coded for properties. And the long
> val that comes after that (cluster-pos) is not hardcoded. Does that value
> refer to an actual cluster-pos or is it just an incrementing counter for
> the property "rows" being returned?
>
> And finally I'm still wondering what Emanuel meant when he said that the
> "schemafull serialization over network" will probably be removed soon. I
> don't know what serialization format that is referring to? Is it the one
> that is being used for Properties (but not Documents)?
>
> Thanks very much,
> Michael
>
>
> On Saturday, February 14, 2015 at 10:57:20 AM UTC-5, Christian Kramer
> wrote:
>>
>> Hey,
>>
>> so from my point of view on the one the hand you query a record/document
>> and on the other hand you query a property. So the result on the first
>> query is represented as records and on the second as Property.
>> See
>> orientdb/core/src/main/java/com/orientechnologies/orient/core/serialization/serializer/record/binary/ORecordSerializerBinaryV0.java#deserialize
>>
>> method
>>
>> if (len == 0) {
>> // SCAN COMPLETED
>> break;
>> } else if (len > 0) {
>> // PARSE FIELD NAME
>> fieldName = new String(bytes.bytes, bytes.offset, len, utf8);
>> bytes.skip(len);
>> valuePos = readInteger(bytes);
>> type = readOType(bytes);
>> } else {
>> // LOAD GLOBAL PROPERTY BY ID
>> OGlobalProperty prop = getGlobalProperty(document, len);
>> fieldName = prop.getName();
>> valuePos = readInteger(bytes);
>> if (prop.getType() != OType.ANY)
>> type = prop.getType();
>> else
>> type = readOType(bytes);
>> }
>>
>>
>>
>>
>> Cheers,
>> Chris
>>
>> Am Samstag, 14. Februar 2015 14:52:43 UTC+1 schrieb Michael Peterson:
>>>
>>> Hello,
>>>
>>> I am continuing to work on a Go client and trying to implement the
>>> Network Binary Protocol, but I've hit another server response I don't
>>> understand.
>>>
>>> I am doing a query using REQUEST_COMMAND (synchronous) and querying a
>>> Document (not using Graphs yet). When I query for the full document the
>>> serialized record seems to be of a slightly different format than when I
>>> query for a field of the record.
>>>
>>> For background, here's the query in the Java shell:
>>>
>>> orientdb {db=cars}> select * from Carz;
>>> ----+-----+------+---------+------
>>> # |@RID |@CLASS|make |model
>>> ----+-----+------+---------+------
>>> 0 |#13:0|Carz |Honda |Accord
>>> 1 |#13:1|Carz |Chevrolet|Tahoe
>>> ----+-----+------+---------+------
>>>
>>> 2 item(s) found. Query executed in 0.006 sec(s).
>>> orientdb {db=cars}> select make from Carz;
>>> ----+------+---------
>>> # |@CLASS|make
>>> ----+------+---------
>>> 0 |null |Honda
>>> 1 |null |Chevrolet
>>> ----+------+---------
>>>
>>>
>>> When I do a REQUEST_COMMAND query with the query "select * from Carz" I
>>> get back a serialized record that does not quite follow the Schemaless
>>> Serialization (
>>> https://raw.githubusercontent.com/wiki/orientechnologies/orientdb/Record-Schemaless-Binary-Serialization.md).
>>>
>>> Instead I get back the "alternative" serialization format I outlined in my
>>> previous posting:
>>> https://groups.google.com/d/msg/orient-database/IDItY72Ze6U/pP4lgfT8S1UJ
>>>
>>> But when I do a REQUEST_COMMAND query with the query that selects a
>>> field of the record: "select make from Carz", I now get back a serialized
>>> record that looks like it exactly matches the documented Schemaless
>>> Serialization, rather than the "alternative" serialization format (I don't
>>> know what else to call it, since it appears to be undocumented?)
>>>
>>> Why is there an inconsistency? It's unclear to me what is going on.
>>>
>>> Here's the breakdown with what the server is sending back:
>>>
>>> For query: select * from Carz
>>>
>>> Read 39 bytes: q select * from Carz���� [OChannelBinaryServer]
>>> Writing byte (1 byte): 0 [OChannelBinaryServer] ->
>>> status
>>> Writing int (4 bytes): 87 [OChannelBinaryServer] ->
>>> session
>>> Writing byte (1 byte): 108 [OChannelBinaryServer] -> result-type:
>>> 'l' (Collection)
>>> Writing int (4 bytes): 2 [OChannelBinaryServer] ->
>>> result-set-size: 2
>>> Writing short (2 bytes): 0 [OChannelBinaryServer] -> short=0 (means
>>> "record", not null or "RID")
>>> Writing byte (1 byte): 100 [OChannelBinaryServer] -> record-type =
>>> 'd'
>>> Writing short (2 bytes): 13 [OChannelBinaryServer]-> cluster-id (13)
>>> Writing long (8 bytes): 0 [OChannelBinaryServer] -> cluster-pos ,
>>> so rid is #13:0
>>> Writing int (4 bytes): 1 [OChannelBinaryServer] ->
>>> record-version
>>> Writing bytes (4+30=34 bytes):
>>> [0, 8, 67, 97, 114, 122, 47, 0, 0, 0, 17, 49, 0, 0, 0, 23, 0, 10,
>>> 72, 111, 110, 100, 97, 12, 65, 99, 99, 111, 114, 100] [OChannelBinaryServer]
>>> Writing short (2 bytes): 0 [OChannelBinaryServer]
>>> Writing byte (1 byte): 100 [OChannelBinaryServer]
>>> Writing short (2 bytes): 13 [OChannelBinaryServer]
>>> Writing long (8 bytes): 1 [OChannelBinaryServer]
>>> Writing int (4 bytes): 1 [OChannelBinaryServer]
>>> Writing bytes (4+33=37 bytes):
>>> [0, 8, 67, 97, 114, 122, 47, 0, 0, 0, 17, 49, 0, 0, 0, 27, 0, 18,
>>> 67, 104, 101, 118, 114, 111, 108, 101, 116, 10, 84, 97, 104, 111, 101]
>>> [OChannelBinaryServer]
>>> Writing byte (1 byte): 0 [OChannelBinaryServer]
>>> Flush [OChannelBinaryServer]
>>>
>>>
>>> Analyzing the first serialized record, this is the "alternative"
>>> serialized format:
>>>
>>> Version
>>> |---|-----Classname------|--------------Header-----------------| ...
>>> len |---- string ---| PID <----ptr--> PID <----ptr---> EOH
>>> 4 C a r z n
>>> [0, 8, 67, 97, 114, 122, 47, 0, 0, 0, 17, 49, 0, 0, 0, 23, 0,
>>> idx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
>>>
>>> |---------------------------Data-------------------------|
>>> |len |-------string------| len |---------string----------|
>>> 5 H o n d a A c c o r d
>>> 10, 72, 111, 110, 100, 97, 12, 65, 99, 99, 111, 114, 100]
>>> 17 18 22 23 24 29
>>>
>>>
>>> The header here is the "alternative" one - instead of reguilar zigzag
>>> encoding it uses the formala:
>>>
>>> zigzagEncode( (fieldId+1) * -1 )
>>>
>>> to encode the Property/field ID, and does not include the name of the
>>> Property/field.
>>>
>>>
>>>
>>> Compare that to:
>>>
>>> select make from Carz
>>> Read 42 bytes: q select make from Carz���� [OChannelBinaryServer]
>>> Writing byte (1 byte): 0 [OChannelBinaryServer] -> status
>>> Writing int (4 bytes): 85 [OChannelBinaryServer] -> session
>>> Writing byte (1 byte): 108 [OChannelBinaryServer] -> result-type:
>>> 'l' (Collection)
>>> Writing int (4 bytes): 2 [OChannelBinaryServer] ->
>>> result-set-size: 2
>>> Writing short (2 bytes): 0 [OChannelBinaryServer] -> short=0 (means
>>> "record", not null or "RID")
>>> Writing byte (1 byte): 100 [OChannelBinaryServer] -> record-type =
>>> 'd'
>>> Writing short (2 bytes): -2 [OChannelBinaryServer] -> cluster-id -2
>>> => means ????
>>> Writing long (8 bytes): 0 [OChannelBinaryServer] -> cluster-pos ??
>>> Writing int (4 bytes): 0 [OChannelBinaryServer] ->
>>> record-version
>>> Writing bytes (4+19=23 bytes):
>>> V ? 4 m a k e <----ptr---> ? ? 5 H o
>>> n d a
>>> [0, 0, 8, 109, 97, 107, 101, 0, 0, 0, 13, 7, 0, 10, 72, 111, 110,
>>> 100, 97] [OChannelBinaryServer]
>>> idx 0 5 10 13
>>> Writing short (2 bytes): 0 [OChannelBinaryServer]
>>> Writing byte (1 byte): 100 [OChannelBinaryServer]
>>> Writing short (2 bytes): -2 [OChannelBinaryServer]
>>> Writing long (8 bytes): 1 [OChannelBinaryServer] -> cluster-pos ??
>>> Writing int (4 bytes): 0 [OChannelBinaryServer]
>>> Writing bytes (4+23=27 bytes):
>>> [0, 0, 8, 109, 97, 107, 101, 0, 0, 0, 13, 7, 0, 18, 67, 104, 101,
>>> 118, 114, 111, 108, 101, 116] [OChannelBinaryServer]
>>> Writing byte (1 byte): 0 [OChannelBinaryServer]
>>> Flush [OChannelBinaryServer]
>>>
>>>
>>> Analyzing the first serialized record, this looks like the serialization
>>> format documented at:
>>>
>>> https://raw.githubusercontent.com/wiki/orientechnologies/orientdb/Record-Schemaless-Binary-Serialization.md
>>>
>>> |-|--|--------------- Header -----------------|---------- Data
>>> ---------|
>>> V CN 4 m a k e <----ptr---> ? ? 5 H o n
>>> d a
>>> [0, 0, 8, 109, 97, 107, 101, 0, 0, 0, 13, 7, 0, 10, 72, 111, 110,
>>> 100, 97]
>>> idx 0 1 2 3 6 7 10 11 12 13
>>> 14 18
>>>
>>>
>>> idx 0 : serialization version (0)
>>> idx 1 : classname => string of length 0, no classname
>>> idx 2 : "normally" encoded varint (rather than the strange version
>>> used for the full Document), sz = 4
>>> idx 3-6 : bytes for "make" (the field name)
>>> idx 7-10: int - ptr to data
>>> idx 11 : data_type (7 = string)
>>> idx 12 : ? end of header, I guess
>>> idx 13 : "normally" encoded varint, sz = 5
>>> idx 14-18: bytes for "Honda", the value for field "make"
>>>
>>> So here the Header uses regular zigzag encoding and gives the field
>>> name, NOT the field id.
>>>
>>>
>>> So to summarize my questions:
>>>
>>> * is my interpretation of the serialized formats above correct?
>>> * why are we using two different serialization formats?
>>> * how is my driver to know which serialization format is being
>>> returned? The only difference is the cluster-id is -2. Is that the
>>> indicator? I haven't located any documentation as to what that value means.
>>> * In the previous discussion, Emanuel said "we probably will remove the
>>> schemafull serialization over network soon." Is one of these the
>>> "schemafull" schema?
>>>
>>> Thanks again for you help,
>>> -Michael
>>>
>>>
--
---
You received this message because you are subscribed to the Google Groups
"OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.