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}