/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.apex.malhar.lib.appdata.query;

/**
 * This is a container object to be used by Queue Managers. It is a container for a query, the query's meta data,
 * and the query's queueing context.
 * @param <QUERY_TYPE> The type of the query.
 * @param <META_QUERY> The type of any meta data to be included with the query.
 * @param <QUEUE_CONTEXT> The context associated with the query when it was enqueued.
 * @since 3.0.0
 */
public class QueryBundle<QUERY_TYPE, META_QUERY, QUEUE_CONTEXT>
{
  protected QUERY_TYPE query;
  protected META_QUERY metaQuery;
  protected QUEUE_CONTEXT queueContext;

  public QueryBundle()
  {
  }

  public QueryBundle(QUERY_TYPE query, META_QUERY metaQuery, QUEUE_CONTEXT queueContext)
  {
    this.query = query;
    this.metaQuery = metaQuery;
    this.queueContext = queueContext;
  }

  public QUERY_TYPE getQuery()
  {
    return query;
  }

  public META_QUERY getMetaQuery()
  {
    return metaQuery;
  }

  public QUEUE_CONTEXT getQueueContext()
  {
    return queueContext;
  }
}
