blob: 4f199b2fc2bb19a4124d5a4bcf5240f6776303e9 [file] [log] [blame]
/*
* 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.drill.exec.physical.resultSet.impl;
import org.apache.drill.exec.vector.ValueVector;
import org.apache.drill.exec.vector.accessor.impl.HierarchicalFormatter;
/**
* Handles batch and overflow operation for a (possibly compound) vector.
* <p>
* The data model is the following:
* <ul>
* <li>Column model<ul>
* <li>Value vector itself</li>
* <li>Column writer</li>
* <li>Column schema</li>
* <li>Column coordinator (this class)</li>
* </ul></li></ul>
* The vector state coordinates events between the result set loader
* on the one side and the vectors, writers and schema on the other.
* For example:
* <pre><code>
* Result Set Vector
* Loader <--> State <--> Vectors
* </code></pre>
* Events from the row set loader deal with allocation, roll-over,
* harvesting completed batches and so on. Events from the writer,
* via the tuple model deal with adding columns and column
* overflow.
*/
public interface VectorState {
/**
* Allocate a new vector with the number of elements given. If the vector
* is an array, then the cardinality given is the number of arrays.
* @param cardinality number of elements desired in the allocated
* vector
*
* @return the number of bytes allocated
*/
int allocate(int cardinality);
/**
* A vector has overflowed. Create a new look-ahead vector of the given
* cardinality, then copy the overflow values from the main vector to the
* look-ahead vector.
*
* @param cardinality the number of elements in the new vector. If this
* vector is an array, then this is the number of arrays
* @return the new next write position for the vector index associated
* with the writer for this vector
*/
void rollover(int cardinality);
/**
* A batch is being harvested after an overflow. Put the full batch
* back into the main vector so it can be harvested.
*/
void harvestWithLookAhead();
/**
* A new batch is starting while an look-ahead vector exists. Move
* the look-ahead buffers into the main vector to prepare for writing
* the rest of the batch.
*/
void startBatchWithLookAhead();
/**
* Clear the vector(s) associated with this state.
*/
void close();
/**
* Underlying vector: the one presented to the consumer of the
* result set loader.
*/
<T extends ValueVector> T vector();
/**
* Report whether this column is projected (has materialized vectors),
* or is unprojected (has no materialized backing.)
*
* @return true if the column is projected to the output, false if
* not
*/
boolean isProjected();
void dump(HierarchicalFormatter format);
}