/* * 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.jena.tdb.index.ext; import java.util.HashSet; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Set; import org.apache.jena.tdb.base.record.Record ; public class ExtHashIterator implements Iterator<Record> { // Need to know if a bucket has been seen before. // A directory may point several times to a HashBucket for different trie // hashes because that bucket is a bucket for a shorter part of the trie. private ExtHash extHash ; private int dictionaryIdx ; private Iterator<Record> rBuffIterator ; private Set<Integer> blockIds = new HashSet<>() ; public ExtHashIterator(ExtHash extHash) { this.extHash = extHash ; dictionaryIdx = 0 ; } @Override public boolean hasNext() { if ( dictionaryIdx < 0 ) return false ; while ( rBuffIterator == null || ! rBuffIterator.hasNext() ) { rBuffIterator = null ; if ( dictionaryIdx >= extHash.dictionarySize() ) break ; int blockId = extHash.getBucketId(dictionaryIdx) ; // Move on, always. dictionaryIdx++ ; if ( blockIds.contains(blockId) ) continue ; HashBucket b = extHash.getBucket(blockId) ; blockIds.add(blockId) ; rBuffIterator = b.getRecordBuffer().iterator() ; } if ( rBuffIterator == null ) { finish() ; return false ; } return true ; } private void finish() { blockIds = null ; rBuffIterator = null ; extHash = null ; dictionaryIdx = -99 ; } @Override public Record next() { if ( ! hasNext() ) throw new NoSuchElementException("ExtHashIterator") ; return rBuffIterator.next() ; } @Override public void remove() {} }