コード例 #1
0
        private Maybe <BinaryData> GetHNIDBinaryData(NID[] nodePath, HNID hnid)
        {
            if (hnid.IsHID)
            {
                if (hnid.HID.Index == 0)
                {
                    return(Maybe <BinaryData> .NoValue());
                }

                var heapItem = heapOnNodeReader.GetHeapItem(nodePath, hnid.HID);

                return(Maybe <BinaryData> .OfValue(heapItem));
            }

            if (hnid.IsNID)
            {
                var subnodePath = new List <NID>(nodePath)
                {
                    hnid.NID
                };

                var generator = BinaryDataGenerator.New();

                foreach (var block in dataTreeReader.Read(subnodePath.ToArray(), Maybe <int> .NoValue()))
                {
                    generator.Append(block);
                }

                return(generator.GetData());
            }

            return(Maybe <BinaryData> .NoValue());
        }
コード例 #2
0
ファイル: RowMatrixReader.cs プロジェクト: phx255/PST
        public Maybe <TableRow> GetRow(NID[] nodePath, int rowIndex)
        {
            var hnHeader = heapOnNodeReader.GetHeapOnNodeHeader(nodePath);

            var userRootHeapItem = heapOnNodeReader.GetHeapItem(nodePath, hnHeader.UserRoot);

            var tcInfo = TCINFO.OfValue(userRootHeapItem);

            var cebStartingOffset = tcInfo.GroupsOffsets[2];

            var rowLength = tcInfo.GroupsOffsets[3];

            var rowMatrixHnid = HNID.OfValue(tcInfo.RowMatrix);

            if (rowMatrixHnid.IsZero)
            {
                return(Maybe <TableRow> .NoValue());
            }

            if (rowMatrixHnid.IsHID)
            {
                var heapItem = heapOnNodeReader.GetHeapItem(nodePath, rowMatrixHnid.HID);

                var encodedRows = heapItem.Slice(rowLength);

                var rowValues = rowValuesExtractor.Extract(encodedRows[rowIndex], tcInfo.ColumnDescriptors, cebStartingOffset);

                return(Maybe <TableRow> .OfValue(new TableRow(rowValues)));
            }
            else
            {
                var numberOfRowsPerBlock = (8 * 1024 - 16) / rowLength;

                var blockIndex = rowIndex / numberOfRowsPerBlock;

                var childNodePath = new List <NID>(nodePath)
                {
                    rowMatrixHnid.NID
                };

                var dataBlock = dataTreeReader.Read(childNodePath.ToArray(), blockIndex)[0];

                var encodedRows = dataBlock.Slice(rowLength);

                var rowValues = rowValuesExtractor.Extract(encodedRows[rowIndex], tcInfo.ColumnDescriptors, cebStartingOffset);

                return(Maybe <TableRow> .OfValue(new TableRow(rowValues)));
            }
        }
コード例 #3
0
        private Tuple <PropertyId, BinaryData> AllocatePropertyOnSubnode(
            PropertyTag propertyTag,
            PropertyValue propertyValue,
            InternalNIDAllocator nidAllocator,
            List <Tuple <NID, BID> > propertiesAllocatedOnSubnodes)
        {
            var dataTreeRootBlockId = dataTreeAllocator.Allocate(new[] { propertyValue.Value });

            var nid = nidAllocator.New();

            var hnid = new HNID(nid);

            propertiesAllocatedOnSubnodes.Add(Tuple.Create(nid, dataTreeRootBlockId));

            return(Tuple.Create(propertyTag.Id, hnidEncoder.Encode(hnid)));
        }
コード例 #4
0
        private Tuple <PropertyId, BinaryData> AllocatePropertyOnTheHN(
            PropertyTag propertyTag,
            PropertyValue propertyValue,
            IHeapOnNodeGenerator hnGenerator)
        {
            var propertyValueInHN =
                BinaryDataGenerator
                .New()
                .Append((short)propertyTag.Type.Value)
                .Append(propertyValue.Value)
                .GetData();

            var hid = hnGenerator.AllocateItem(propertyValueInHN);

            var hnid = new HNID(hid);

            return(Tuple.Create(propertyTag.Id, hnidEncoder.Encode(hnid)));
        }
コード例 #5
0
        public PropertyValue Read(NID[] nodePath, PropertyType propertyType, BinaryData propertyValue)
        {
            if (propertyType.IsFixedLength())
            {
                var size = propertyType.GetFixedLengthTypeSize();

                if (size <= 4)
                {
                    return(new PropertyValue(propertyValue));
                }

                var hnid = HNID.OfValue(propertyValue);

                var heapItem = heapOnNodeReader.GetHeapItem(nodePath, hnid.HID);

                return(new PropertyValue(heapItem));
            }

            if (propertyType.IsMultiValueFixedLength() || propertyType.IsVariableLength() || propertyType.IsMultiValueVariableLength())
            {
                var hnid = HNID.OfValue(propertyValue);

                var value = GetHNIDBinaryData(nodePath, hnid);

                if (value.HasNoValue)
                {
                    return(PropertyValue.Empty);
                }

                return(new PropertyValue(value.Value));
            }

            if (propertyType.Value == Constants.PtypObject)
            {
                var hnid = HNID.OfValue(propertyValue);

                var heapItem = heapOnNodeReader.GetHeapItem(nodePath, hnid.HID);

                return(new PropertyValue(heapItem));
            }

            return(PropertyValue.Empty);
        }