package gw.rating.rtm.query

uses gw.api.profiler.Profiler
uses gw.api.rating.RatingException
uses gw.api.system.PCLoggerCategory

/**
 * Factory class that creates <code>AbstractFactorQuery</code> implementations
 */
@ReadOnly
class QueryStrategyFactory {

  /**
   * Create a table query implementation based on the table definition.
   * Currently only
   *
   * @param table the <code>RateTable</code> to query
   * @return <code>RatingQuery</code> implementation based on the strategy defined for the table
   */
  function getFactorQuery(table : RateTable) : RatingQuery {
    var frame = Profiler.push(gw.api.profiler.PCProfilerTag.RTM_LOOKUP)
    var q : RatingQuery = null

    switch (table.QueryStrategy) {
      case FactorQueryStrategy.TC_DATABASE:
        q = new StatelessDBQuery(table)
        break

      case FactorQueryStrategy.TC_MEMORY:
        q = new StatelessMemoryQuery(table)
        break

      default:
        Profiler.pop(frame)
        throw new RatingException("Invalid Query Strategy for table ${table.Definition.TableCode}: ${table.QueryStrategy}")
    }
    Profiler.pop(frame)
    PCLoggerCategory.RTM.trace("getFactorQuery(table:" + table.Definition.TableCode + ") strategy: " + table.QueryStrategy)
    return q
  }
}
