Package net.sf.joafip.btreeplus.entity

Examples of net.sf.joafip.btreeplus.entity.LeafPage


    super.tearDown();
  }

  public void testAppendPageRecordable() throws HeapException {
    btreePlusElementMgr.openTransaction();
    final LeafPage leafPage = new LeafPage(1, true);
    leafPage.setEntry(0, 0, new DataRecordIdentifier());
    leafPage.updateByteSize();
    IPageRecordable pageRecordable = leafPage;
    assertNull(MUST_BE_NOT_STORED, pageRecordable.getPageRecord());
    btreePlusElementMgr.appendPageRecordable(pageRecordable);
    pageRecordable.setValueIsChangedValueToSave();
    IPageRecord pageRecord = pageRecordable.getPageRecord();
View Full Code Here


        .getPageNumberOfFirstFreePage());
    btreePlusElementMgr.closeTransaction();
  }

  private IPageRecordable newLeafPage() throws HeapException {
    final LeafPage pageRecordable = new LeafPage(1, true);
    pageRecordable.setEntry(0, 0, new DataRecordIdentifier());
    pageRecordable.updateByteSize();
    return pageRecordable;
  }
View Full Code Here

    while (pageRecordable != null) {
      elementMgr.clearReadCache();
      final EnumRecordType recordType = pageRecordable.getRecordType();
      switch (recordType) {// NOPMD
      case LEAF_PAGE: {
        final LeafPage leafPage = (LeafPage) pageRecordable;

        // check keys
        DataRecordIdentifier currentKey = leafPage.getKey(0);
        for (int kindex = 1; kindex < leafPage.getNumberOfKeyEntries(); kindex++) {
          final DataRecordIdentifier nextKey = leafPage
              .getKey(kindex);
          if (compare(currentKey, nextKey) >= 0) {
            throw new HeapException("bad keys");
          }
          currentKey = nextKey;
        }

        // check leaf page value range
        final DataRecordIdentifier firstKey = leafPage.getFirstKey();
        // final long firstKeyValue = leafPage.getFirstKey().value;
        final DataRecordIdentifier lastKey = leafPage.getLastKey();
        // final long lastKeyValue = leafPage.getLastKey().value;
        state = stack.peek();
        if (/* state.minValue >= firstKeyValue */
        compare(state.minKey, firstKey) >= 0 || /*
                             * state.maxValue <
                             * lastKeyValue
                             */
        compare(state.maxKey, lastKey) < 0) {
          throw new HeapException("not have " + state.minKey
              + "(min value)<" + firstKey + "(first key value)  "
              + lastKey + "(last key value) <=" + state.maxKey
              + "(max value)");
        }

        // check well formed
        // if (currentDepth != 0 && !leafPage.wellFilled()) {
        // throw new
        // HeapException("not well filled "+leafPage.getByteSize());
        // }

        // check chaining
        if (currentLeafPagePosition != leafPage.getPositionInFile()) {
          throw new HeapException(
              "bad current leaf page position\nexpected="
                  + currentLeafPagePosition
                  + ", currentLeafPage="
                  + leafPage.getPositionInFile());
        }
        currentLeafPagePosition = leafPage.getNext();

        // check depth, all leaf page must be at same depth
        if (depth == -1) {
          depth = currentDepth;
        } else if (depth != currentDepth) {
          throw new HeapException("bad leaf page depth "
              + currentDepth + " first leaf apge depth is "
              + depth);
        }

        // count entries
        entriesCount += leafPage.getNumberOfKeyEntries();

        // count leaf page
        leafPageCount++;

        // go up
        pageRecordable = leafPage.getParentPage();
        index = leafPage.getInParentIndex() + 1;
        currentDepth--;
        stack.pop();
      }
        break;
      case NON_TERMINAL_PAGE: {
View Full Code Here

  @Override
  protected boolean writeDataRecordImpl(
      final DataRecordIdentifier dataRecordIdentifier, final byte[] data)
      throws HeapException {
    final IPageRecordable root = btreePlusElementMgr.getRoot();
    final LeafPage leafPage = leafPage(root, dataRecordIdentifier);
    final boolean created;
    if (leafPage == null) {
      // no existing data because no leaf page for key
      created = true;
      final IDataBlock dataBlock = btreePlusElementMgr
          .createDataBlock(data);
      btreePlusElementMgr
          .newRootLeafPage(dataRecordIdentifier, dataBlock);
      btreePlusElementMgr.incrementNumberOfDataRecord();
    } else {
      // existing leaf page for key
      final long dataBlockPosition = leafPage
          .getDataBlockPosition(dataRecordIdentifier);
      if (dataBlockPosition == -1) {
        // data record not found
        created = true;
        final IDataBlock dataBlock = btreePlusElementMgr
            .createDataBlock(data);
        if (!leafPage.add(dataRecordIdentifier, dataBlock)) {
          final NonTerminalPage nonTerminalPage = (NonTerminalPage) leafPage
              .getParentPage();
          if (nonTerminalPage == null) {
            splitLeafPage(leafPage, dataRecordIdentifier,
                nonTerminalPage, dataBlock);
          } else if (tryBalanceOrMerge(leafPage, nonTerminalPage)) {
            if (!leafPage.add(dataRecordIdentifier, dataBlock)) {
              splitLeafPage(leafPage, dataRecordIdentifier,
                  nonTerminalPage, dataBlock);
            }
          } else {
            splitLeafPage(leafPage, dataRecordIdentifier,
                nonTerminalPage, dataBlock);
          }
        }
        btreePlusElementMgr.incrementNumberOfDataRecord();
      } else {
        // data record found
        created = false;
        final IDataBlock dataBlock = btreePlusElementMgr
            .getDataBlock(dataBlockPosition);
        if (data.length >= dataBlock.getMinDataSize()
            && data.length <= dataBlock.getMaxDataSize()) {
          dataBlock.setData(data);
        } else {
          final int index = dataBlock.getIndexInDataBlockPage();
          btreePlusElementMgr.remove(dataBlock);
          final IDataBlock newDataBlock = btreePlusElementMgr
              .createDataBlock(data);
          leafPage.setDataBlock(index, newDataBlock);
        }
      }
    }
    return created;
  }
View Full Code Here

   */
  private void splitLeafPage(final LeafPage leafPage,
      final DataRecordIdentifier dataRecordIdentifier,
      final NonTerminalPage nonTerminalPage, final IDataBlock dataBlock)
      throws HeapException {
    final LeafPage newLeafPage = leafPage.split(dataRecordIdentifier,
        dataBlock);
    btreePlusElementMgr.appendPageRecordable(newLeafPage);
    newLeafPage.setValueIsChangedValueToSave();
    newLeafPage.setNext(leafPage.getNext());
    leafPage.setNext(newLeafPage.getPositionInFile());

    if (nonTerminalPage == null) {
      btreePlusElementMgr.newRootNonTerminalPage(leafPage, newLeafPage);
    } else {
      if (!nonTerminalPage.add(leafPage, newLeafPage)) {
View Full Code Here

    final IDataBlock dataBlock = dataBlock(dataRecordIdentifier);
    if (dataBlock == null) {
      deleted = false;
    } else {
      deleted = true;
      final LeafPage leafPage = dataBlock.getParentLeafPage();
      final int indexInLeafPage = dataBlock.getIndexInLeafPage();
      btreePlusElementMgr.remove(dataBlock);
      leafPage.remove(indexInLeafPage);
      final NonTerminalPage nonTerminalPage = (NonTerminalPage) leafPage
          .getParentPage();
      if (nonTerminalPage == null) {
        if (leafPage.getNumberOfKeyEntries() == 0) {
          btreePlusElementMgr.freePage(leafPage.getPageRecord());
          btreePlusElementMgr.removeRoot();
        }
      } else {
        if (leafPage.wellFilled()) {
          final int leafPageInParentIndex = leafPage
              .getInParentIndex();
          if (leafPageInParentIndex != nonTerminalPage
              .getNumberOfKeyEntries()
              && !nonTerminalPage.setKey(leafPageInParentIndex,
                  leafPage.getLastKey())) {
            split(nonTerminalPage);
          }
        } else {
          tryBalanceOrMerge(leafPage, nonTerminalPage);
        }
View Full Code Here

      result = 2;
    } else {
      final int leftLeafPageInParentIndex = leafPageInParentIndex - 1;
      final long leftLeafPagePosition = leafPageParentNonTerminalPage
          .getPagePointer(leftLeafPageInParentIndex);
      final LeafPage leftLeafPage = (LeafPage) btreePlusElementMgr
          .getPage(leftLeafPagePosition,
              leafPageParentNonTerminalPage,
              leftLeafPageInParentIndex);
      result = leftLeafPage.tryBalanceOrMerge(leafPage);
      if (result == 0) {
        // leaf page merged in left leaf page
        btreePlusElementMgr.freePage(leafPage.getPageRecord());
        leafPageParentNonTerminalPage.remove(leafPageInParentIndex);
        if (leafPageParentNonTerminalPage.setKey(
            leftLeafPageInParentIndex, leftLeafPage.getLastKey())) {
          if (!leafPageParentNonTerminalPage.wellFilled()) {
            tryBalance(leafPageParentNonTerminalPage);
          }
        } else {
          split(leafPageParentNonTerminalPage);
        }
      } else if (result == 1
          && !leafPageParentNonTerminalPage.setKey(
              leftLeafPageInParentIndex,
              leftLeafPage.getLastKey())) {
        split(leafPageParentNonTerminalPage);

      }
    }

    if (result == 2
        && leafPageInParentIndex != leafPageParentNonTerminalPage
            .getNumberOfKeyEntries()) {
      final int rightLeafPageinParentIndex = leafPageInParentIndex + 1;
      final long rightLeafPagePosition = leafPageParentNonTerminalPage
          .getPagePointer(rightLeafPageinParentIndex);
      final LeafPage rightLeafPage = (LeafPage) btreePlusElementMgr
          .getPage(rightLeafPagePosition,
              leafPageParentNonTerminalPage,
              rightLeafPageinParentIndex);
      result = leafPage.tryBalanceOrMerge(rightLeafPage);
      if (result == 0) {
        // right leaf page merged in leaf page
        btreePlusElementMgr.freePage(rightLeafPage.getPageRecord());
        leafPageParentNonTerminalPage
            .remove(rightLeafPageinParentIndex);
        if (leafPageParentNonTerminalPage.setKey(leafPageInParentIndex,
            leafPage.getLastKey())) {
          if (!leafPageParentNonTerminalPage.wellFilled()) {
View Full Code Here

      while (!EnumRecordType.LEAF_PAGE.equals(page.getRecordType())) {
        final NonTerminalPage nonTerminalPage = (NonTerminalPage) page;
        final long pagePosition = nonTerminalPage.getPagePointer(0);
        page = btreePlusElementMgr.getPage(pagePosition, page, 0);
      }
      final LeafPage leafPage = (LeafPage) page;
      first = leafPage.getFirstKey();
      final boolean deleted = deleteDataRecordImpl(first);
      // ASSRTX
      assert deleted;
    }
    return first;
View Full Code Here

  private long dataBlockPosition(final IPageRecordable root,
      final DataRecordIdentifier dataRecordIdentifier)
      throws HeapException {
    final long dataBlockPosition;
    final LeafPage leafPage = leafPage(root, dataRecordIdentifier);
    if (leafPage == null) {
      dataBlockPosition = -1L;
    } else {
      dataBlockPosition = leafPage
          .getDataBlockPosition(dataRecordIdentifier);
    }
    return dataBlockPosition;
  }
View Full Code Here

  private IDataBlock dataBlock(final IPageRecordable root,
      final DataRecordIdentifier dataRecordIdentifier)
      throws HeapException {
    final IDataBlock dataBlock;
    final LeafPage leafPage = leafPage(root, dataRecordIdentifier);
    if (leafPage == null) {
      dataBlock = null;
    } else {
      final long dataBlockPosition = leafPage
          .getDataBlockPosition(dataRecordIdentifier);
      if (dataBlockPosition == -1L) {
        dataBlock = null;
      } else {
        final int indexinLeafPage = leafPage.getIndex();
        dataBlock = btreePlusElementMgr.getDataBlock(dataBlockPosition);
        dataBlock.setParent(leafPage, indexinLeafPage);
      }
    }
    return dataBlock;
View Full Code Here

TOP

Related Classes of net.sf.joafip.btreeplus.entity.LeafPage

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.