/*
 * Copyright (c) 2008-2014 MongoDB, Inc.
 *
 * Licensed 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 com.mongodb.connection;

import com.mongodb.MongoNamespace;
import com.mongodb.ServerAddress;
import com.mongodb.ServerCursor;

import java.util.List;

/**
 * A batch of query results.
 *
 * @param <T> the type of document to decode query results to
 * @since 3.0
 */
public class QueryResult<T> {
    private final MongoNamespace namespace;
    private final List<T> results;
    private final long cursorId;
    private final ServerAddress serverAddress;

    /**
     * Construct an instance.
     *
     * @param namespace    the namespace
     * @param results       the query results
     * @param cursorId      the cursor id
     * @param serverAddress the server address
     */
    public QueryResult(final MongoNamespace namespace, final List<T> results, final long cursorId, final ServerAddress serverAddress) {
        this.namespace = namespace;
        this.results = results;
        this.cursorId = cursorId;
        this.serverAddress = serverAddress;
    }

    /**
     * Construct an instance.
     *
     * @param namespace    the namespace
     * @param replyMessage the reply message
     * @param address      the server address
     */
    QueryResult(final MongoNamespace namespace, final ReplyMessage<T> replyMessage, final ServerAddress address) {
        this(namespace, replyMessage.getDocuments(), replyMessage.getReplyHeader().getCursorId(), address
            );
    }

    /**
     * Gets the namespace.
     *
     * @return the namespace
     */
    public MongoNamespace getNamespace() {
        return namespace;
    }

    /**
     * Gets the cursor.
     *
     * @return the cursor, which may be null if it's been exhausted
     */
    public ServerCursor getCursor() {
        return cursorId == 0 ? null : new ServerCursor(cursorId, serverAddress);
    }

    /**
     * Gets the results.
     *
     * @return the results
     */
    public List<T> getResults() {
        return results;
    }

    /**
     * Gets the server address.
     *
     * @return the server address
     */
    public ServerAddress getAddress() {
        return serverAddress;
    }
}
