001package io.ebeaninternal.server.autotune.service;
002
003import io.ebeaninternal.api.SpiQuery;
004import io.ebeaninternal.server.autotune.model.Origin;
005import io.ebeaninternal.server.querydefn.OrmQueryDetail;
006import io.ebeaninternal.server.querydefn.OrmQueryDetailParser;
007
008import java.io.Serializable;
009
010/**
011 * Holds tuned query information. Is immutable so this represents the tuning at
012 * a given point in time.
013 */
014public class TunedQueryInfo implements Serializable {
015
016  private static final long serialVersionUID = 8661702592481810396L;
017
018  private final Origin origin;
019
020  private final OrmQueryDetail tunedDetail;
021
022  public TunedQueryInfo(Origin origin) {
023    this.origin = origin;
024    this.tunedDetail = new OrmQueryDetailParser(origin.getDetail()).parse();
025  }
026
027  /**
028   * Return the origin entry (includes call stack and bean type).
029   */
030  public Origin getOrigin() {
031    return origin;
032  }
033
034  /**
035   * Return the tuned detail (for comparison with profiling information).
036   */
037  public OrmQueryDetail getTunedDetail() {
038    return tunedDetail;
039  }
040
041  /**
042   * Tune the query by replacing its OrmQueryDetail with a tuned one.
043   *
044   * @return true if the query was tuned, otherwise false.
045   */
046  public boolean tuneQuery(SpiQuery<?> query) {
047    if (tunedDetail == null) {
048      return false;
049    }
050
051    boolean tuned;
052    if (query.isDetailEmpty()) {
053      tuned = true;
054      // tune by 'replacement'
055      query.setDetail(tunedDetail.copy());
056    } else {
057      // tune by 'addition'
058      tuned = query.tuneFetchProperties(tunedDetail);
059    }
060    if (tuned) {
061      query.setAutoTuned(true);
062    }
063    return tuned;
064  }
065
066  @Override
067  public String toString() {
068    return tunedDetail.toString();
069  }
070
071}