<commit_before>'use strict';

module.exports = DataSource;

var util = require('util');

var Model       = require('../Model');
var Application = require('../Application/Application');
var Page        = require('../Page/Page');
var Form        = require('../Form/Form');

util.inherits(DataSource, Model);

////////////////////////////////////////////////////////////////////////////////////////////////////
function DataSource(data, parent) {
    DataSource.super_.prototype.constructor.call(this, data, parent);
    this.keyColumns       = [];
    this.parentKeyColumns = [];
    this.dataAdapter      = null;
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.init = function(callback) {
    var self = this;
    DataSource.super_.prototype.init.call(this, function() {
        self.keyColumns = Object.keys(self.data.keyColumns);
        if (self.data.parentKeyColumns) {
            self.parentKeyColumns = Object.keys(self.data.parentKeyColumns);
        }
        callback();
    });
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.fill = function(params, newMode, callback) {
    var self = this;
    DataSource.super_.prototype.fill.call(this, params, newMode, function(response) {
        response.keyColumns = self.keyColumns;
        if (self.parentKeyColumns.length > 0) {
            response.parentKeyColumns = self.parentKeyColumns;
        }
        if (newMode) {
            response.rows = [];
            callback(response);
        } else {
            self.dataAdapter.select(params, function(rows) {
                response.rows = rows;
                callback(response);
            });
        }
    });
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.refill = function(params, callback) {
    this.dataAdapter.select(params, function(rows) {
        callback({
            rows:rows
        });
    });
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.update = function(row, callback) {
    this.dataAdapter.update(row, callback);
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.insert = function(row, callback) {
    this.dataAdapter.insert(row, function(key) {
        callback(key);
    });
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.delete = function(row, callback) {
    this.dataAdapter.delete(row, callback);
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getApp = function() {
    if (this.parent instanceof Application) {
        return this.parent;
    } else if (this.parent instanceof Page) {
        return this.parent.parent;
    } else if (this.parent instanceof Form) {
        return this.parent.parent.parent;
    } else {
        throw new Error('wrong parent');
    }
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getPage = function() {
    if (this.parent instanceof Page) {
        return this.parent;
    } else if (this.parent instanceof Form) {
        return this.parent.parent;
    } else {
        return null;
    }
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getForm = function() {
    return this.parent instanceof Form ? this.parent : null;
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getPool = function() {
    return this.getApp().getPool(this.data['@attributes'].database);
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getRowKeyValues = function(row) {
    var values = {};
    this.keyColumns.forEach(function(column) {
        values[column] = row[column];
    });
    return values;
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getRowNonKeyValues = function(row) {
    var values = {};
    for (var column in row) {
        if (this.keyColumns.indexOf(column) === -1) {
            values[column] = row[column];
        }
    }
    return values;
};<commit_msg>data source key columns check<commit_after>'use strict';

module.exports = DataSource;

var util = require('util');

var Model       = require('../Model');
var Application = require('../Application/Application');
var Page        = require('../Page/Page');
var Form        = require('../Form/Form');

util.inherits(DataSource, Model);

////////////////////////////////////////////////////////////////////////////////////////////////////
function DataSource(data, parent) {
    DataSource.super_.prototype.constructor.call(this, data, parent);
    this.keyColumns       = [];
    this.parentKeyColumns = [];
    this.dataAdapter      = null;
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.init = function(callback) {
    var self = this;
    DataSource.super_.prototype.init.call(this, function() {
        if (self.data.keyColumns === undefined || Object.keys(self.data.keyColumns).length === 0) {
            throw new Error('[' + self.getLocation() + ']: Data Source must have at least one key column.');
        }
        self.keyColumns = Object.keys(self.data.keyColumns);
        if (self.data.parentKeyColumns) {
            self.parentKeyColumns = Object.keys(self.data.parentKeyColumns);
        }
        callback();
    });
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.fill = function(params, newMode, callback) {
    var self = this;
    DataSource.super_.prototype.fill.call(this, params, newMode, function(response) {
        response.keyColumns = self.keyColumns;
        if (self.parentKeyColumns.length > 0) {
            response.parentKeyColumns = self.parentKeyColumns;
        }
        if (newMode) {
            response.rows = [];
            callback(response);
        } else {
            self.dataAdapter.select(params, function(rows) {
                response.rows = rows;
                callback(response);
            });
        }
    });
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.refill = function(params, callback) {
    this.dataAdapter.select(params, function(rows) {
        callback({
            rows:rows
        });
    });
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.update = function(row, callback) {
    this.dataAdapter.update(row, callback);
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.insert = function(row, callback) {
    this.dataAdapter.insert(row, function(key) {
        callback(key);
    });
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.delete = function(row, callback) {
    this.dataAdapter.delete(row, callback);
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getApp = function() {
    if (this.parent instanceof Application) {
        return this.parent;
    } else if (this.parent instanceof Page) {
        return this.parent.parent;
    } else if (this.parent instanceof Form) {
        return this.parent.parent.parent;
    } else {
        throw new Error('wrong parent');
    }
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getPage = function() {
    if (this.parent instanceof Page) {
        return this.parent;
    } else if (this.parent instanceof Form) {
        return this.parent.parent;
    } else {
        return null;
    }
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getForm = function() {
    return this.parent instanceof Form ? this.parent : null;
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getPool = function() {
    return this.getApp().getPool(this.data['@attributes'].database);
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getRowKeyValues = function(row) {
    var values = {};
    this.keyColumns.forEach(function(column) {
        values[column] = row[column];
    });
    return values;
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getRowNonKeyValues = function(row) {
    var values = {};
    for (var column in row) {
        if (this.keyColumns.indexOf(column) === -1) {
            values[column] = row[column];
        }
    }
    return values;
};

////////////////////////////////////////////////////////////////////////////////////////////////////
DataSource.prototype.getLocation = function() {
    var pageName = this.getPage() !== null ? this.getPage().name : '';
    var formName = this.getForm() !== null ? this.getForm().name : '';
    return pageName + '.' + formName + '.' + this.name;
};
{'fraction_non_alphanumeric': 0.37723076923076926, 'fraction_numerical': 0.0005128205128205128, 'mean_word_length': 1.101961629661565, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5826128', 'n_tokens_mistral': 2035, 'n_tokens_neox': 2020, 'n_words': 394}