/**
* @module mongodb/models/aggregation
*/
var mongoose = require('mongoose');
var deepPopulate = require('mongoose-deep-populate');
var Schema = mongoose.Schema;
var util = require('util');
var _ = require('underscore');
var mongooseApiQuery = require('mongoose-api-query');
/**
* Primary ad stats aggregation collection. Very flat schema for flexible aggregation.
*
* @class
* @type {Schema}
*/
var hourlyAdStatSchema = new Schema({
tstamp: { type: Date, default: Date.now },
hour: { type: Date, required: true, index: true },
publisher: { type: Schema.ObjectId, ref: 'Publisher' },
site: { type: Schema.ObjectId, ref: 'Site' },
page: { type: Schema.ObjectId, ref: 'Page' },
placement: { type: Schema.ObjectId, ref: 'Placement' },
advertiser: { type: Schema.ObjectId, ref: 'Advertiser' },
campaign: { type: Schema.ObjectId, ref: 'Campaign' },
creativegroup: { type: Schema.ObjectId, ref: 'CreativeGroup' },
creative: { type: Schema.ObjectId, ref: 'Creative' },
actionbeacon: { type: Schema.ObjectId, ref: 'ActionBeacon' },
pub_clique: { type: String, required: true, ref: 'Clique' },
adv_clique: { type: String, required: true, ref: 'Clique' },
bids: { type: Number, min: 0, required: true, default: 0 },
imps: { type: Number, min: 0, required: true, default: 0 },
defaults: { type: Number, min: 0, required: true, default: 0 },
spend: { type: Number, min: 0, required: true, default: 0 },
clicks: { type: Number, min: 0, required: true, default: 0 },
view_convs: { type: Number, min: 0, required: true, default: 0 },
click_convs: { type: Number, min: 0, required: true, default: 0 },
uniques: { type: Number, min: 0, required: true, default: 0 }
});
hourlyAdStatSchema.plugin(deepPopulate, {});
hourlyAdStatSchema.plugin(mongooseApiQuery);
var HourlyAdStat = mongoose.model('HourlyAdStat', hourlyAdStatSchema);
/**
* Geo ad stats aggregation collection. Flat schema for flexible aggregation, also includes
* geo-specific fields with refs to Geo collections for geo aggregation.
*
* @class
* @type {Schema}
*/
var geoAdStatSchema = new Schema({
tstamp: { type: Date, default: Date.now },
hour: { type: Date, required: true, index: true },
publisher: { type: Schema.ObjectId, ref: 'Publisher' },
site: { type: Schema.ObjectId, ref: 'Site' },
page: { type: Schema.ObjectId, ref: 'Page' },
advertiser: { type: Schema.ObjectId, ref: 'Advertiser' },
campaign: { type: Schema.ObjectId, ref: 'Campaign' },
pub_clique: { type: String, required: true },
adv_clique: { type: String, required: true },
country: { type: Schema.ObjectId, ref: 'Country' },
region: { type: Schema.ObjectId, ref: 'Region' },
dma: { type: Schema.ObjectId, ref: 'DMA' },
bids: { type: Number, min: 0, required: true, default: 0 },
imps: { type: Number, min: 0, required: true, default: 0 },
defaults: { type: Number, min: 0, required: true, default: 0 },
spend: { type: Number, min: 0, required: true, default: 0 },
clicks: { type: Number, min: 0, required: true, default: 0 },
view_convs: { type: Number, min: 0, required: true, default: 0 },
click_convs: { type: Number, min: 0, required: true, default: 0 },
uniques: { type: Number, min: 0, default: 0 }
});
geoAdStatSchema.plugin(deepPopulate, {});
geoAdStatSchema.plugin(mongooseApiQuery);
var GeoAdStat = mongoose.model('GeoAdStat', geoAdStatSchema);
/**
* Models wrapper to be instantiated w/ specific DB connection instance.
*
* @param {mongoose.connection} connection DB connection object
* @param {Object} options
* @constructor
*/
var AggregationModels = function(connection){
this.connection = connection;
this.DemoHourlyAdStat = this.connection.model('DemoHourlyAdStat', hourlyAdStatSchema);
this.HourlyAdStat = this.connection.model('HourlyAdStat');
this.GeoAdStat = this.connection.model('GeoAdStat');
};
exports.AggregationModels = AggregationModels;