/** * diqube: Distributed Query Base. * * Copyright (C) 2015 Bastian Gloeckle * * This file is part of diqube. * * diqube 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 org.diqube.server.util; import java.util.List; import java.util.Map.Entry; import org.diqube.data.table.TableShard; import org.diqube.execution.ColumnVersionManager; import org.diqube.execution.ExecutablePlan; import org.diqube.executionenv.ExecutionEnvironment; import org.diqube.executionenv.querystats.QueryableColumnShard; import org.diqube.queries.QueryStats; import org.diqube.queries.QueryStatsManager; /** * Util for publishsing some {@link QueryStats} after execution of an {@link ExecutablePlan} has been completed. * * @author Bastian Gloeckle */ public class ExecutablePlanQueryStatsUtil { /** * Publish some query stats. * * This method can be called multiple times - for each {@link ExecutablePlan} of a {@link TableShard} once for example * - the values will be summed up accordingly. * * @param queryStats * The {@link QueryStats} object that should be adjusted * @param plan * The plan that has been executed. */ public void publishQueryStats(QueryStatsManager queryStats, ExecutablePlan plan) { ExecutionEnvironment lastEnv; ColumnVersionManager columnVersionManager = plan.getColumnVersionManager(); if (columnVersionManager != null && columnVersionManager.getLastVersionedExecutionEnvironment() != null) lastEnv = columnVersionManager.getLastVersionedExecutionEnvironment(); else lastEnv = plan.getDefaultExecutionEnvironment(); int numberOfPages = queryStats.getNumberOfPages() + // lastEnv.getAllNonTemporaryColumnShards().values().stream() .filter(colShard -> lastEnv.getPureStandardColumnShard(colShard.getName()) != null) .mapToInt(colShard -> lastEnv.getPureStandardColumnShard(colShard.getName()).getPages().size()).sum(); queryStats.setNumberOfPages(numberOfPages); int numberOfTempPages = queryStats.getNumberOfTemporaryPages() + lastEnv.getAllTemporaryColumnShards().values().stream().flatMap(listOfPages -> listOfPages.stream()) .filter(colShard -> lastEnv.getPureStandardColumnShard(colShard.getName()) != null) .mapToInt(colShard -> lastEnv.getPureStandardColumnShard(colShard.getName()).getPages().size()).sum(); queryStats.setNumberOfTemporaryPages(numberOfTempPages); for (Entry<String, List<QueryableColumnShard>> tempE : lastEnv.getAllTemporaryColumnShards().entrySet()) { int numberOfTempVersions = queryStats.getNumberOfTemporaryVersionsPerColName().getOrDefault(tempE.getKey(), 0) + tempE.getValue().size(); queryStats.setNumberOfTemporaryVersionsOfColumn(tempE.getKey(), numberOfTempVersions); } } }