/** * Copyright (C) 2009-2013 FoundationDB, LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.foundationdb.qp.operator; import com.foundationdb.qp.row.Row; import com.foundationdb.server.api.dml.ColumnSelector; /** * The first of the three complete implementations of the CursorBase * interface. * * The ChainedCursor works in the middle of the operator tree, taking * input from the input operator and passing along rows to the caller to next(). * * The ChainedCursor assumes nothing about the QueryBindings, * in general does not use them, and only passes them along to either * parent or child. * * @See LeafCursor * @see MultiChainedCursor * * Used by: * @see Aggregate_Partial * @see BranchLookup_Default * @see Buffer_Default * @see Count_Default * @see Delete_Returning * @see Distinct_Partial * @see Filter_Default * @see Flatten_HKeyOrdered * @see GroupLookup_Default (non-lookahead) * @see IfEmpty_Default * @see Insert_Returning * @see Limit_Default * @see Product_Nested * @see Project_Default * @see Select_BloomFilter (non-lookahead) * @see Select_HKeyOrdered * @see Sort_General * @see Sort_InsertLimited * @see Update_Returning * @see Using_BloomFilter * @see Using_HashTable * */ public class ChainedCursor extends OperatorCursor { protected final Cursor input; protected QueryBindings bindings; protected ChainedCursor(QueryContext context, Cursor input) { super(context); this.input = input; if (input == null) { throw new NullPointerException("Input to ChainedCursor"); } } public Cursor getInput() { return input; } @Override public void open() { super.open(); input.open(); } @Override public Row next() { return input.next(); } @Override public void jump(Row row, ColumnSelector columnSelector) { if (CURSOR_LIFECYCLE_ENABLED) { CursorLifecycle.checkIdleOrActive(this); } input.jump(row, columnSelector); state = CursorLifecycle.CursorState.ACTIVE; } @Override public void close() { try { input.close(); } finally { super.close(); } } @Override public void openBindings() { input.openBindings(); } @Override public QueryBindings nextBindings() { CursorLifecycle.checkClosed(this); bindings = input.nextBindings(); return bindings; } @Override public void closeBindings() { input.closeBindings(); } @Override public void cancelBindings(QueryBindings ancestor) { CursorLifecycle.checkClosed(this); input.cancelBindings(ancestor); } }