Source: lib/stats.js

var parent_dir = process.getAbsolutePath(__dirname);
var proto = require(parent_dir + '/lib/proto.js');
JSONX = proto["JSONX"]; //JSON for regex support in .json files
process.getAbsolutePath = proto.getAbsolutePath;
var check = require("check-types")

/**
	Used for cluster stats for the web app.
	@constructor
	@author Tilak Patidar <tilakpatidar@gmail.com>
	@param {Message} message_obj

*/

var Stats = function(message_obj) {
    var message = message_obj;
    var pool = message.get('pool');
    var config = message.get('config');
    var cluster = message.get('cluster');

    /**
    	Returns cluster info.
    	@public
    	@param {Function} fn - callback

    */
    this.clusterInfo = function(fn) {

        var id_name = config.getConfig('cluster_name');
        pool.stats.cluster_info(id_name, function(err, results) {
            return fn(err, results);
        });
    };
    /**
    	Returns active bots info.
    	@public
    	@param {Function} fn - callback

    */
    this.activeBots = function(fn) {
        var d = {};
        d['db_type'] = config.getConfig('db_type');
        d['db'] = config.getConfig(config.getConfig('db_type'));
        pool.stats.activeBots(function(err, docs) {
            return fn([docs, d]);
        });
    };

    /**
    	Returns crawled stats info.
    	@public
    	@param {Function} fn - callback

    */
    this.crawlStats = function(fn) {

        pool.stats.crawlStats(function(dic) {
            return fn(dic);
        });

    };

    /**
    	Returns log data.
    	@public
    	@param {String} bot_name
    	@param {String} type
    	@param {Number} lines
    	@param {Function} fn - callback

    */
    this.readLog = function(bot_name, type, lines, fn) {

        cluster.send(bot_name, {
            "readLog": {
                "type": type,
                "n": lines
            }
        }, function(status, response) {
            return fn(status, response);
        });
    };


    /**
    	Returns terminal data.
    	@public
    	@param {String} bot_name
    	@param {Function} fn - callback

    */
    this.readTerminal = function(bot_name, fn) {
        cluster.send(bot_name, {
            "readTerminal": true
        }, function(status, response) {
            return fn(status, response);
        });
    };


    /**
    	Returns config of particular bot in the cluster.
    	@public
    	@param {String} bot_name
    	@param {Function} fn - callback

    */
    this.getConfig = function(bot_name, fn) {
        pool.cluster.getBotConfig(bot_name, function(err, results) {

            try {

                return fn(err, results.config);
            } catch (err) {

                return fn(err, {});
            }
        });
    };


    /**
    	Returns seed data from cluster.
    	@public
    	@param {Function} fn - callback

    */
    this.getSeed = function(fn) {
        pool.cluster.getSeed(function(err, results) {
            try {
                return fn(err, results);
            } catch (err) {

                return fn(err, {});
            }
        });
    };


    /**
    	Returns crawled pages for API.
    	@public
    	@param {String} bot_name
    	@param {Number} i - offset
    	@param {Number} len - length
    	@param {String} sort_key
    	@param {String} sort_type
    	@param {Function} fn - callback

    */
    this.getCrawledPages = function(bot_name, i, len, sort_key, sort_type, fn) {
        if (bot_name === "master") {
            var d = {
                "crawled": {
                    $exists: true
                }
            };
        } else {
            var d = {
                "updatedBy": bot_name,
                "crawled": {
                    $exists: true
                }
            };
        }
        var sor = {};
        if (!check.assigned(sort_key)) {
            sor['lastModified'] = -1;
        } else {
            sor[sort_key] = sort_type;
        }
        pool.stats.getCrawledPages(d, len, i, sor, function(err, results, c) {
            try {

                return fn(err, results, c);
            } catch (err) {

                return fn(err, {});
            }
        });
    };

    /**
    	Returns failed pages for API.
    	@public
    	@param {String} bot_name
    	@param {Number} i - offset
    	@param {Number} len - length
    	@param {String} sort_key
    	@param {String} sort_type
    	@param {Function} fn - callback

    */
    this.getFailedPages = function(bot_name, i, len, sort_key, sort_type, fn) {
        if (bot_name === "master") {
            var d = {
                "abandoned": true
            };
        } else {
            var d = {
                "updatedBy": bot_name,
                "abandoned": true
            };
        }
        var sor = {};
        if (!check.assigned(sort_key)) {
            sor['lastModified'] = -1;
        } else {
            sor[sort_key] = sort_type;
        }
        pool.stats.getFailedPages(d, len, i, sor, function(err, results, c) {
            try {

                return fn(err, results, c);
            } catch (err) {

                return fn(err, {});
            }
        });
    };


    /**
    	Returns total buckets for API.
    	@public
    	@param {String} bot_name
    	@param {Number} i - offset
    	@param {Number} len - length
    	@param {String} sort_key
    	@param {String} sort_type
    	@param {Function} fn - callback

    */
    this.getTotalBuckets = function(bot_name, i, len, sort_key, sort_type, fn) {
        if (bot_name === "master") {
            var d = {};
        } else {
            var d = {
                "insertedBy": bot_name
            }
        }
        var sor = {};
        if (!check.assigned(sort_key)) {
            sor['lastModified'] = -1;
        } else {
            sor[sort_key] = sort_type;
        }
        pool.stats.getTotalBuckets(d, len, i, sor, function(err, results, c) {
            try {

                return fn(err, results, c);
            } catch (err) {

                return fn(err, {});
            }
        });
    };


    /**
    	Returns processed buckets for API.
    	@public
    	@param {String} bot_name
    	@param {Number} i - offset
    	@param {Number} len - length
    	@param {String} sort_key
    	@param {String} sort_type
    	@param {Function} fn - callback

    */
    this.getProcessedBuckets = function(bot_name, i, len, sort_key, sort_type, fn) {
        if (bot_name === "master") {
            var d = {
                "processingBot": {
                    $exists: true
                }
            };
        } else {
            var d = {
                "processingBot": bot_name
            }
        }
        var sor = {};
        if (!check.assigned(sort_key)) {
            sor['lastModified'] = -1;
        } else {
            sor[sort_key] = sort_type;
        }
        pool.stats.getProcessedBuckets(d, len, i, sor, function(err, results, c) {
            try {

                return fn(err, results, c);
            } catch (err) {

                return fn(err, {});
            }
        });
    };


    /**
    	Creates mongodb index for certain collection.
    	@public
    	@param {String} collection_name
    	@param {String} index_name
    	@param {Function} fn - callback

    */
    this.indexField = function indexField(collection_name, index_name, fn) {
        var d = {};
        d[index_name] = "text";
        pool[collection_name].createIndex(d, function(err, results) {
            try {

                return fn(err, results);
            } catch (err) {

                return fn(err, {});
            }
        });
    };

    /**
    	Set config for particular bot in the cluster.
    	@param {String} bot_name
    	@param {Object} js
    	@param {Function} fn
    	@public
    */
    this.setConfig = function(bot_name, js, fn) {
        //updates the config changes done from local machine to db
        //console.log(bot_name);
        //console.log(js);
        pool.stats.updateConfig(bot_name, js, function setConfig(err, results) {
            return fn(err, results);
        });
    };
    /**
    	Set seed file for cluster.
    	@param {Object} js
    	@param {Function} fn
    	@public
    */
    this.setSeed = function setSeed(js, fn) {
        //updates the seed changes done from local machine to db

        pool.stats.updateSeed(js, function(err, results) {
            return fn(err, results);
        });
    };

    /**
    	Get certain  crawled/uncrawled page for API.
    	@param {String} url
    	@param {Function} fn
    	@public
    */
    this.getPage = function getpage(url, fn) {
        pool.stats.getPage(url, function(err, data) {
            return fn(err, data);
        });
    };

    /**
    	Get certain bucket for API.
    	@param {String} url
    	@param {Function} fn
    	@public
    */
    this.getBucket = function getBucket(url, fn) {
        pool.stats.getBucket(url, function(err, data) {
            return fn(err, data);
        });
    };

    /**
    	Text search on crawled data for API.
    	@param {String} query
    	@param {Number} i - length
    	@param {Function} fn
    	@public
    */
    this.search = function search(query, i, fn) {
        pool.stats.search(query, i, function(err, results) {
            return fn(err, results);
        })
    };

    function msg() {
        log.put(arguments[0], arguments[1], __filename.split('/').pop(), arguments.callee.caller.name.toString());
    }


};

module.exports = Stats;