/* * Copyright 2014 Red Hat, Inc. and/or its affiliates. * * Licensed 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.dashbuilder.dataset.engine.index.stats; import org.dashbuilder.dataset.engine.index.DataSetFilterIndex; import org.dashbuilder.dataset.engine.index.DataSetFunctionIndex; import org.dashbuilder.dataset.engine.index.DataSetGroupIndex; import org.dashbuilder.dataset.engine.index.DataSetIndex; import org.dashbuilder.dataset.engine.index.DataSetIndexElement; import org.dashbuilder.dataset.engine.index.DataSetSortIndex; import org.dashbuilder.dataset.engine.index.visitor.DataSetIndexVisitor; /** * A DataSetIndex stats */ public class DataSetIndexStatsImpl implements DataSetIndexStats, DataSetIndexVisitor { private DataSetIndex index; private transient long buildTime = 0; private transient long reuseTime = 0; private transient long indexSize = 0; private transient int numberOfGroupOps = 0; private transient int numberOfFilterOps = 0; private transient int numberOfSortOps = 0; private transient int numberOfAggFunctions = 0; private transient DataSetIndexElement longestBuild; private transient DataSetIndexElement shortestBuild; private transient DataSetIndexElement lessReused; private transient DataSetIndexElement mostReused; public DataSetIndexStatsImpl(DataSetIndex index) { this.index = index; index.acceptVisitor(this); } public void visit(DataSetIndexElement element) { buildTime += element.getBuildTime(); reuseTime += element.getReuseTime(); indexSize += element.getEstimatedSize(); if (longestBuild == null || element.getBuildTime() > longestBuild.getBuildTime()) { longestBuild = element; } if (shortestBuild == null || element.getBuildTime() > shortestBuild.getBuildTime()) { shortestBuild = element; } if (lessReused == null || element.getReuseHits() > lessReused.getReuseHits()) { lessReused = element; } if (mostReused == null || element.getReuseHits() > mostReused.getReuseHits()) { mostReused = element; } if (element instanceof DataSetGroupIndex) { numberOfGroupOps++; } if (element instanceof DataSetFilterIndex) { numberOfFilterOps++; } if (element instanceof DataSetSortIndex) { numberOfSortOps++; } if (element instanceof DataSetFunctionIndex) { numberOfAggFunctions++; } } public double getReuseRate() { if (buildTime == 0) return 0; return reuseTime/buildTime; } public long getBuildTime() { return buildTime; } public long getReuseTime() { return reuseTime; } public DataSetIndexElement getLongestBuild() { return longestBuild; } public DataSetIndexElement getShortestBuild() { return shortestBuild; } public DataSetIndexElement getLessReused() { return lessReused; } public DataSetIndexElement getMostReused() { return mostReused; } public long getIndexSize() { return indexSize; } public int getNumberOfGroupOps() { return numberOfGroupOps; } public int getNumberOfFilterOps() { return numberOfFilterOps; } public int getNumberOfSortOps() { return numberOfSortOps; } public int getNumberOfAggFunctions() { return numberOfAggFunctions; } public String toString() { return toString(" "); } public String toString(String sep) { StringBuilder out = new StringBuilder(); out.append("Index size=").append(MemSizeFormatter.formatSize(getIndexSize())).append(sep); out.append("Build time=").append(((double) getBuildTime() / 1000000)).append(" (secs)").append(sep); out.append("Reuse time=").append(((double) getReuseTime() / 1000000)).append(" (secs)").append(sep); out.append("Reuse rate=").append(getReuseRate()).append(sep); out.append("#Group ops=").append(getNumberOfGroupOps()).append(sep); out.append("#Filter ops=").append(getNumberOfFilterOps()).append(sep); out.append("#Sort ops=").append(getNumberOfSortOps()).append(sep); out.append("#Agg funcs=").append(getNumberOfAggFunctions()).append(sep); return out.toString(); } }