/* * 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.exoplatform.services.jcr.impl.core.query.lucene; import java.io.IOException; import java.util.BitSet; /** * A <code>DocId</code> that contains a document number and the creation tick * of the index segment. */ final class ForeignSegmentDocId extends DocId { /** * Empty array of {@link ForeignSegmentDocId}s. */ static final ForeignSegmentDocId[] EMPTY_ARRAY = new ForeignSegmentDocId[0]; /** * The document number. */ private final int docNumber; /** * The creation tick of the index segment. */ private final long creationTick; /** * Creates a <code>DocId</code> based on a document number in the index * segment with the given <code>creationTick</code>. * * @param docNumber the lucene document number. * @param creationTick the creation tick of the index segment. */ ForeignSegmentDocId(int docNumber, long creationTick) { this.docNumber = docNumber; this.creationTick = creationTick; } /** * @return the document number in the foreign index segment. */ int getDocNumber() { return docNumber; } /** * @return the creation tick of the foreign index segment. */ long getCreationTick() { return creationTick; } /** * {@inheritDoc} */ int[] getDocumentNumbers(MultiIndexReader reader, int[] docNumbers) throws IOException { int doc = reader.getDocumentNumber(this); if (doc == -1) { return EMPTY; } else { if (docNumbers.length == 1) { docNumbers[0] = doc; return docNumbers; } else { return new int[]{doc}; } } } /** * This implementation will return <code>this</code>. Document number is * not known until resolved in {@link DocId#getDocumentNumbers(MultiIndexReader,int[])}. * * {@inheritDoc} */ DocId applyOffset(int offset) { return this; } /** * Always returns <code>true</code> because this calls is in context of the * index segment where this DocId lives. Within this segment this DocId is * always valid. Whether the target of this DocId is valid can only be * checked in the method {@link DocId#getDocumentNumbers(MultiIndexReader,int[])}. * * @param deleted the deleted documents in the segment where this DocId * lives. * @return always <code>true</code>. */ boolean isValid(BitSet deleted) { return true; } }