All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jackrabbit.oak.plugins.segment.RecordType Maven / Gradle / Ivy

There is a newer version: 1.62.0
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.jackrabbit.oak.plugins.segment;

/**
 * The type of a record in a segment.
 */
public enum RecordType {

    /**
     * A leaf of a map (which is a HAMT tree). This contains
     * 
    *
  • the size (int)
  • *
  • for each entry, the hash code of the key (4 bytes), then the record id of * the key and the record id of the value
  • *
*/ LEAF, /** * A branch of a map (which is a HAMT tree). This contains *
    *
  • level within the HAMT structure (4 most significant bits), plus size * of the that branch of the map
  • *
  • bitmap (4 bytes)
  • *
  • record ids of the buckets of the next level of the map
  • *
* There is a special case: if the first int (level/size) is -1, then it's a * diff record, to handle the common case of when exactly one existing child * node was modified. This is common because whenever one node was changed, * we need to propagate that up to the root. *
    *
  • -1 (int)
  • *
  • hash code of the key that was changed (4 bytes)
  • *
  • the record id of the key
  • *
  • the record id of the value
  • *
  • the record id of the (base version of the) modified map
  • *
* There is only ever one single diff record for a map. */ BRANCH, /** * A bucket (a list of references). It always includes at least 2 elements, * up to 255 entries (because each entry could in theory point to a * different segment, in which case this couldn't be stored in a segement). * This contains just the record ids. The size of the list is not stored, as * it is stored along with the reference to this record. */ BUCKET, /** * A list including the size (an int). This could be 0, in which case there * is no reference. If the size is 1, then reference points to the value of * the list. If the size is larger, then a record id follows, which points * to a bucket with the actual record ids. If there are more than 255 * entries in the list, then the list is partitioned into sublists of 255 * entries each, which are stored kind of recursively. */ LIST, /** * A value (for example a string, or a long, or a blob). The format is: * length (variable length encoding, one byte if shorter than 128, else more * bytes), then the data as a byte array, or, for large values, a record id * of the top level bucket that contains the list of block record ids of the * actual binary data. *

* Therefore, a value can reference other records. */ VALUE, /** * A block of bytes (a binary value, or a part of a binary value, or part of * large strings). It only contains the raw data. */ BLOCK, /** * A template (the "hidden class" of a node; inspired by the Chrome V8 * Javascript engine). This includes a list of property templates. Format: *

    *
  • head (int), which is: 1 bit (most significant one) whether the node * has a single valued jcr:primaryType property. 1 bit whether it has * mixins, in which case 10 bits (27 to 18) are used for the number of * mixins. 1 bit whether the node has no child nodes. 1 bit whether the node * has more than one child nodes. 18 bits (0 to 17) the number of properties * (0 to 262143).
  • *
  • The record ids of: if needed, record id of the primary type (a * value), record ids of the mixin names (value records), for single child * node: the name of the child node
  • *
  • The list of record ids of property names (which are stored before the * template in separate value records), and the property type (negative * values for multi-value properties).
  • *
*/ TEMPLATE, /** * A JCR node, which contains a list of record ids: *
    *
  • the record id of the template
  • *
  • depending on the template, the record id of the map of the ids of the * child node name(s) and child node record id(s), or if there is just one * child node, the child node record id
  • *
  • the record ids of the property values (for multi-valued property a * pointer to the list record)
  • *
*/ NODE }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy