exabugs/node-searcher

View on GitHub
index.js

Summary

Maintainability
C
1 day
Test Coverage
/*

 */

"use strict";

var MongoClient = require("mongodb").MongoClient
  , text = require('./lib/text')
  , frequency = require('./lib/text/frequency')
  ;

function Searcher(db, collection, freq) {
  if ('string' == typeof db) {
    this.url = db; // 'mongodb://127.0.0.1:27017/test'
  } else {
    this.db = db;
  }
  this.collection = collection;
  this.field = ['k', 'c', 'v']; // 
  this.freq = freq; // freq = {'meta.tf': COLL_OF};
  return this;
}

Searcher.prototype.open = function (callback) {
  if (this.db) {
    return callback(null, this.db);
  } else {
    MongoClient.connect(this.url, function (err, db) {
      callback(err, db);
    });
  }
};

// 引数チェック
Searcher.prototype.check = function (params) {
  params.collection = params.collection || this.collection;
};

/**
 *
 * @param src
 * @param condition
 * @param attribute
 * @param callback

 var FIELD = ['k', 'c', 'w'];

 var URL = 'mongodb://127.0.0.1:27017/test';

 var source = {
        collection: 'mails.files',
        attribute: 'metadata.tf',
        option: {
          condition: {
            'contentType': 'text/plain'
          }
        }
      };

 var searcher = new Searcher(URL, FIELD);

 searcher.parse(source, function (err, count) {

 */
Searcher.prototype.parse = function (source, callback) {
  var field = this.field;
  var freq = this.freq;
  this.check(source);
  this.open(function (err, db) {
    if (err) {
      callback(err);
    } else {
      text.batch(db, source, field, function (err, count) {
        if (err) {
          db.close();
          callback(err);
        } else {
          frequency.tfiof(db, source, freq, field, function (err) {
            db.close();
            callback(err);
          });
        }
      });
    }
  });
};

/**
 *
 * @param target
 * @param source
 * @param callback

 var FREQ = {'tf': 'mails.of'};

 var target = {
      collection: 'mails',
      attribute: 'tf',
      option: {
        condition: {}
      }
    };

 var source = {
      collection: 'mails.files',
      attribute: 'metadata.tf',
      key: 'metadata.parent',
      option: {
        condition: {}
      }
    };

 var searcher = new Searcher(URL, FIELD, FREQ);

 searcher.indexing(target, source, function (err) {

 */
Searcher.prototype.indexing = function (target, source, callback) {
  var freq = this.freq;
  var field = this.field;
  this.check(target);
  this.check(source);
  this.open(function (err, db) {
    if (err) {
      callback(err);
    } else {
      frequency.countup(db, target, source, field, function (err) {
        if (err) {
          db.close();
          callback(err);
        } else {
          frequency.object_frequency(db, target, freq, field, function (err) {
            if (err) {
              db.close();
              callback(err);
            } else {
              frequency.tfiof(db, target, freq, field, function (err) {
                db.close();
                callback(err);
              });
            }
          });
        }
      });
    }
  });
};

/**
 *
 * @param collection
 * @param condition
 * @param option
 * @param callback

 var target = {
      collection: 'mails',
      option: {
        condition: {
          'tf': '先日フジテレビでラーメン'
        },
        copy: ['subject'],
        out: 'mails.search.result'
      }
    };

 var searcher = new Searcher(URL, FIELD, FREQ);

 searcher.search(collection, condition, option, function (err) {

 */
Searcher.prototype.search = function (target, callback) {
  var freq = this.freq;
  var field = this.field;
  this.check(target);
  this.open(function (err, db) {
    if (err) {
      callback(err);
    } else {
      text.search(db, target, freq, field, function (err) {
        db.close();
        callback(err);
      });
    }
  });
};

/**
 * 相互類似度
 * @param source
 * @param callback

 var source = {
      collection: 'mails',
      attribute: 'tf',
      option: {
        out: 'mails.mutual'
      }
    };

 */
Searcher.prototype.mutualize = function (source, callback) {
  var field = this.field;
  this.check(source);
  this.open(function (err, db) {
    if (err) {
      callback(err);
    } else {
      frequency.mutualize(db, source, field, function (err) {
        db.close();
        callback(err);
      });
    }
  });
};

/**
 * 主座標分析
 * →「R」が実行可能な場合、類似検索結果に対して主座標分析を行うことができる。
 * @param target 検索結果コレクション ({x, y}アトリビュート指定)
 * @param source ofコレクション
 * @param callback

 var target = {
      collection: 'mails.search.result',
      attribute: 'tf',
      option: {
        field: ['x, 'y']
      }
    };

 var source = {
      collection: 'mails.mutual',
      option: {
      }
    };


 */
Searcher.prototype.cmdscale = function (target, source, callback) {
  this.check(target);
  this.check(source);
  this.open(function (err, db) {
    if (err) {
      callback(err);
    } else {
      frequency.cmdscale(db, target, source, function (err) {
        db.close();
        callback(err);
      });
    }
  });
};

module.exports = Searcher;