/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.query.processor.relational; import java.util.ArrayList; import java.util.List; /** * @since 4.2 */ public class RelationalNodeStatistics { // Statistics static final int BATCHCOMPLETE_STOP = 0; static final int BLOCKEDEXCEPTION_STOP = 1; private boolean setNodeStartTime; // The total amount of rows output by this node private long nodeOutputRows; // Start and End system time for the node private long nodeStartTime; private long nodeEndTime; // Start and End system time for each batch private long batchStartTime; private long batchEndTime; // The processing time for the node (does not include child processing) private long nodeNextBatchProcessingTime; // the total processing time for the node (indcludes child processing (lastEndTime - firstStartTime) private long nodeCumulativeProcessingTime; // The total processing time of the nextBatch method for this node (includes child processing) private long nodeCumulativeNextBatchProcessingTime; // The total amount of calls to next batch in this node private int nodeNextBatchCalls; // The amount of times a Block or Componenet Exception occurs for this node private int nodeBlocks; public RelationalNodeStatistics() { this.setNodeStartTime = false; } public void startBatchTimer() { this.batchStartTime = System.currentTimeMillis(); } void setBatchStartTime(long batchStartTime) { this.batchStartTime = batchStartTime; } public void stopBatchTimer() { this.batchEndTime = System.currentTimeMillis(); } void setBatchEndTime(long batchEndTime) { this.batchEndTime = batchEndTime; } public void collectCumulativeNodeStats(Long rowCount, int stopType) { this.nodeNextBatchCalls++; if(!this.setNodeStartTime) { this.nodeStartTime = this.batchStartTime; this.setNodeStartTime = true; } this.nodeCumulativeNextBatchProcessingTime += (this.batchEndTime - this.batchStartTime); switch (stopType) { case BATCHCOMPLETE_STOP: this.nodeOutputRows += rowCount; break; case BLOCKEDEXCEPTION_STOP: this.nodeBlocks++; break; } } public void collectNodeStats(RelationalNode[] relationalNodes) { // set nodeEndTime to the time gathered at the end of the last batch this.nodeEndTime = this.batchEndTime; this.nodeCumulativeProcessingTime = this.nodeEndTime - this.nodeStartTime; this.nodeNextBatchProcessingTime = this.nodeCumulativeNextBatchProcessingTime; for (int i = 0; i < relationalNodes.length; i++) { if (relationalNodes[i] == null) { break; } this.nodeNextBatchProcessingTime -= relationalNodes[i].getNodeStatistics().getNodeCumulativeNextBatchProcessingTime(); } } public List<String> getStatisticsList() { ArrayList<String> statisticsList = new ArrayList<String>(6); statisticsList.add("Node Output Rows: " + this.nodeOutputRows); //$NON-NLS-1$ statisticsList.add("Node Next Batch Process Time: " + this.nodeNextBatchProcessingTime); //$NON-NLS-1$ statisticsList.add("Node Cumulative Next Batch Process Time: " + this.nodeCumulativeNextBatchProcessingTime); //$NON-NLS-1$ statisticsList.add("Node Cumulative Process Time: " + this.nodeCumulativeProcessingTime); //$NON-NLS-1$ statisticsList.add("Node Next Batch Calls: " + this.nodeNextBatchCalls); //$NON-NLS-1$ statisticsList.add("Node Blocks: " + this.nodeBlocks); //$NON-NLS-1$ return statisticsList; } /** * @return Returns the nodeBlocks. * @since 4.2 */ public int getNodeBlocks() { return this.nodeBlocks; } /** * @return Returns the nodeCumulativeNextBatchProcessingTime. * @since 4.2 */ public long getNodeCumulativeNextBatchProcessingTime() { return this.nodeCumulativeNextBatchProcessingTime; } /** * @return Returns the nodeCumulativeProcessingTime. * @since 4.2 */ public long getNodeCumulativeProcessingTime() { return this.nodeCumulativeProcessingTime; } /** * @return Returns the nodeEndTime. * @since 4.2 */ public long getNodeEndTime() { return this.nodeEndTime; } /** * @return Returns the nodeNextBatchCalls. * @since 4.2 */ public int getNodeNextBatchCalls() { return this.nodeNextBatchCalls; } /** * @return Returns the nodeOutputRows. * @since 4.2 */ public Long getNodeOutputRows() { return this.nodeOutputRows; } /** * @return Returns the nodeProcessingTime. * @since 4.2 */ public long getNodeNextBatchProcessingTime() { return this.nodeNextBatchProcessingTime; } /** * @return Returns the nodeStartTime. * @since 4.2 */ public long getNodeStartTime() { return this.nodeStartTime; } /** * @return Returns the batchEndTime. * @since 4.2 */ public long getBatchEndTime() { return this.batchEndTime; } /** * @return Returns the batchStartTime. * @since 4.2 */ public long getBatchStartTime() { return this.batchStartTime; } }