001package io.ebeaninternal.server.autotune;
002
003import io.ebean.bean.ObjectGraphOrigin;
004import io.ebeaninternal.server.querydefn.OrmQueryDetail;
005
006import java.util.ArrayList;
007import java.util.List;
008
009/**
010 * Profiling information collected.
011 */
012public class AutoTuneCollection {
013
014  final List<Entry> entries = new ArrayList<>();
015
016  public Entry add(ObjectGraphOrigin origin, OrmQueryDetail detail, String sourceQuery) {
017    Entry entry = new Entry(origin, detail, sourceQuery);
018    entries.add(entry);
019    return entry;
020  }
021
022  public List<Entry> getEntries() {
023    return entries;
024  }
025
026  /**
027   * Profiling entry at a given origin point.
028   */
029  public static class Entry {
030
031    /**
032     * Profiling origin point.
033     */
034    private final ObjectGraphOrigin origin;
035
036    /**
037     * The tuned query detail.
038     */
039    private final OrmQueryDetail detail;
040
041    /**
042     * The original/existing query detail.
043     */
044    private final String originalQuery;
045
046    /**
047     * Summary execution statistics for queries related to this origin point.
048     */
049    private final List<EntryQuery> queries = new ArrayList<>();
050
051    public Entry(ObjectGraphOrigin origin, OrmQueryDetail detail, String originalQuery) {
052      this.origin = origin;
053      this.detail = detail;
054      this.originalQuery = originalQuery;
055    }
056
057    public void addQuery(EntryQuery entryQuery) {
058      queries.add(entryQuery);
059    }
060
061    public ObjectGraphOrigin getOrigin() {
062      return origin;
063    }
064
065    public OrmQueryDetail getDetail() {
066      return detail;
067    }
068
069    public String getOriginalQuery() {
070      return originalQuery;
071    }
072
073    public List<EntryQuery> getQueries() {
074      return queries;
075    }
076
077  }
078
079  /**
080   * Summary query execution statistics for the origin point.
081   */
082  public static class EntryQuery {
083
084    final String path;
085    final long exeCount;
086    final long totalBeanLoaded;
087    final long totalMicros;
088
089    public EntryQuery(String path, long exeCount, long totalBeanLoaded, long totalMicros) {
090      this.path = path;
091      this.exeCount = exeCount;
092      this.totalBeanLoaded = totalBeanLoaded;
093      this.totalMicros = totalMicros;
094    }
095
096    /**
097     * Return the relative path with empty string for the origin query.
098     */
099    public String getPath() {
100      return path;
101    }
102
103    public long getExeCount() {
104      return exeCount;
105    }
106
107    public long getTotalBeanLoaded() {
108      return totalBeanLoaded;
109    }
110
111    public long getTotalMicros() {
112      return totalMicros;
113    }
114  }
115}