示例#1
0
        public RelationAdvancedOrderedEnumerator(RelationDBManipulator <TValue> manipulator,
                                                 ByteBuffer prefixBytes, uint prefixFieldCount,
                                                 EnumerationOrder order,
                                                 KeyProposition startKeyProposition, ByteBuffer startKeyBytes,
                                                 KeyProposition endKeyProposition, ByteBuffer endKeyBytes, bool initKeyReader = true)
        {
            _prefixFieldCount = prefixFieldCount;
            _manipulator      = manipulator;
            _tr        = manipulator.Transaction;
            _ascending = order == EnumerationOrder.Ascending;

            _keyValueTr            = _tr.KeyValueDBTransaction;
            _keyValueTrProtector   = _tr.TransactionProtector;
            _prevProtectionCounter = _keyValueTrProtector.ProtectionCounter;

            _keyBytes = prefixBytes;
            _keyValueTr.SetKeyPrefix(_keyBytes);

            long startIndex;
            long endIndex;

            if (endKeyProposition == KeyProposition.Ignored)
            {
                endIndex = _keyValueTr.GetKeyValueCount() - 1;
            }
            else
            {
                switch (_keyValueTr.Find(endKeyBytes))
                {
                case FindResult.Exact:
                    endIndex = _keyValueTr.GetKeyIndex();
                    if (endKeyProposition == KeyProposition.Excluded)
                    {
                        endIndex--;
                    }
                    break;

                case FindResult.Previous:
                    endIndex = _keyValueTr.GetKeyIndex();
                    break;

                case FindResult.Next:
                    endIndex = _keyValueTr.GetKeyIndex() - 1;
                    break;

                case FindResult.NotFound:
                    endIndex = -1;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            if (startKeyProposition == KeyProposition.Ignored)
            {
                startIndex = 0;
            }
            else
            {
                switch (_keyValueTr.Find(startKeyBytes))
                {
                case FindResult.Exact:
                    startIndex = _keyValueTr.GetKeyIndex();
                    if (startKeyProposition == KeyProposition.Excluded)
                    {
                        startIndex++;
                    }
                    break;

                case FindResult.Previous:
                    startIndex = _keyValueTr.GetKeyIndex() + 1;
                    break;

                case FindResult.Next:
                    startIndex = _keyValueTr.GetKeyIndex();
                    break;

                case FindResult.NotFound:
                    startIndex = 0;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            _count      = (uint)Math.Max(0, endIndex - startIndex + 1);
            _startPos   = (uint)(_ascending ? startIndex : endIndex);
            _pos        = 0;
            _seekNeeded = true;

            if (initKeyReader)
            {
                var primaryKeyFields       = manipulator.RelationInfo.ClientRelationVersionInfo.GetPrimaryKeyFields();
                var advancedEnumParamField = primaryKeyFields.ToList()[(int)_prefixFieldCount];
                if (advancedEnumParamField.Handler.NeedsCtx())
                {
                    throw new BTDBException("Not supported.");
                }
                _keyReader = (Func <AbstractBufferedReader, IReaderCtx, TKey>)manipulator.RelationInfo
                             .GetSimpleLoader(new RelationInfo.SimpleLoaderType(advancedEnumParamField.Handler, typeof(TKey)));

                _lengthOfNonDataPrefix = ObjectDB.AllRelationsPKPrefix.Length + PackUnpack.LengthVUInt(manipulator.RelationInfo.Id);
            }
        }
示例#2
0
        public RelationAdvancedOrderedSecondaryKeyEnumerator(RelationDBManipulator <TValue> manipulator,
                                                             ByteBuffer prefixBytes, uint prefixFieldCount, EnumerationOrder order,
                                                             KeyProposition startKeyProposition, ByteBuffer startKeyBytes,
                                                             KeyProposition endKeyProposition, ByteBuffer endKeyBytes,
                                                             uint secondaryKeyIndex)
            : base(manipulator, prefixBytes, prefixFieldCount, order,
                   startKeyProposition, startKeyBytes,
                   endKeyProposition, endKeyBytes, false)
        {
            _secondaryKeyIndex = secondaryKeyIndex;
            var secKeyFields           = manipulator.RelationInfo.ClientRelationVersionInfo.GetSecondaryKeyFields(secondaryKeyIndex);
            var advancedEnumParamField = secKeyFields.ToList()[(int)_prefixFieldCount];

            if (advancedEnumParamField.Handler.NeedsCtx())
            {
                throw new BTDBException("Not supported.");
            }
            _keyReader = (Func <AbstractBufferedReader, IReaderCtx, TKey>)manipulator.RelationInfo
                         .GetSimpleLoader(new RelationInfo.SimpleLoaderType(advancedEnumParamField.Handler, typeof(TKey)));
        }
示例#3
0
        public RelationAdvancedEnumerator(
            RelationDBManipulator <T> manipulator,
            ByteBuffer prefixBytes, uint prefixFieldCount,
            EnumerationOrder order,
            KeyProposition startKeyProposition, ByteBuffer startKeyBytes,
            KeyProposition endKeyProposition, ByteBuffer endKeyBytes)
        {
            _prefixFieldCount = prefixFieldCount;
            _manipulator      = manipulator;

            _ascending = order == EnumerationOrder.Ascending;

            _tr                    = manipulator.Transaction;
            _keyValueTr            = _tr.KeyValueDBTransaction;
            _keyValueTrProtector   = _tr.TransactionProtector;
            _prevProtectionCounter = _keyValueTrProtector.ProtectionCounter;

            _keyBytes = prefixBytes;
            _keyValueTr.SetKeyPrefix(_keyBytes);

            _relationInfo            = manipulator.RelationInfo;
            _prevModificationCounter = _relationInfo.ModificationCounter;

            long startIndex;
            long endIndex;

            if (endKeyProposition == KeyProposition.Ignored)
            {
                endIndex = _keyValueTr.GetKeyValueCount() - 1;
            }
            else
            {
                switch (_keyValueTr.Find(endKeyBytes))
                {
                case FindResult.Exact:
                    endIndex = _keyValueTr.GetKeyIndex();
                    if (endKeyProposition == KeyProposition.Excluded)
                    {
                        endIndex--;
                    }
                    break;

                case FindResult.Previous:
                    endIndex = _keyValueTr.GetKeyIndex();
                    break;

                case FindResult.Next:
                    endIndex = _keyValueTr.GetKeyIndex() - 1;
                    break;

                case FindResult.NotFound:
                    endIndex = -1;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            if (startKeyProposition == KeyProposition.Ignored)
            {
                startIndex = 0;
            }
            else
            {
                switch (_keyValueTr.Find(startKeyBytes))
                {
                case FindResult.Exact:
                    startIndex = _keyValueTr.GetKeyIndex();
                    if (startKeyProposition == KeyProposition.Excluded)
                    {
                        startIndex++;
                    }
                    break;

                case FindResult.Previous:
                    startIndex = _keyValueTr.GetKeyIndex() + 1;
                    break;

                case FindResult.Next:
                    startIndex = _keyValueTr.GetKeyIndex();
                    break;

                case FindResult.NotFound:
                    startIndex = 0;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            _count                 = (uint)Math.Max(0, endIndex - startIndex + 1);
            _startPos              = (uint)(_ascending ? startIndex : endIndex);
            _pos                   = 0;
            _seekNeeded            = true;
            _lengthOfNonDataPrefix = ObjectDB.AllRelationsPKPrefix.Length + PackUnpack.LengthVUInt(manipulator.RelationInfo.Id);
        }
示例#4
0
 public IAsyncEnumerable <IRow> Enumerate(ReadOnlyMemory <byte> startsWith, EnumerationOrder order = EnumerationOrder.Ordered)
 {
     return(new DeferredAsyncEnumerable(GetTrie(), t => t.EnumerateStartsWith(startsWith, order)));
 }
示例#5
0
 public IAsyncEnumerable <IRow> Enumerate(string?startsWith = null, EnumerationOrder order = EnumerationOrder.Ordered)
 {
     return(new DeferredAsyncEnumerable(GetTrie(), t => t.EnumerateStartsWith(startsWith ?? string.Empty, order)));
 }
示例#6
0
 public AdvancedEnumeratorParam(EnumerationOrder order)
 {
     Order            = order;
     StartProposition = KeyProposition.Ignored;
     EndProposition   = KeyProposition.Ignored;
 }
 public double[] As1DArray(EnumerationOrder order = EnumerationOrder.ByRow)
 {
     switch (order)
     {
         case EnumerationOrder.ByColumn:
             return _enumerateByColumn();
         case EnumerationOrder.ByRow:
             return _enumerateByRow();
         default:
             throw new NotSupportedException();
     }
 }
 /// <summary>
 /// Construct a matrix from a 1 Dimensional array either building row by row, or column by column.
 /// </summary>
 public Matrix(double[] array, int numRows, int numCols, EnumerationOrder order = EnumerationOrder.ByColumn)
 {
     this._matrix = DenseMatrix.OfColumnMajor(numRows, numCols, array);
     if (order == EnumerationOrder.ByRow)
     {
         this._matrix = _matrix.Transpose();
     }
 }