jl
Version:
Command-line JSON manipulation library
127 lines (101 loc) • 3.21 kB
JavaScript
function SortUtil() {
SortUtil.super_.call(this, [
['n', 'numeric', 'numeric sort'],
['r', 'reverse', 'reverse (descending order)'],
['m', 'merge', 'merge already sorted files'],
['s', 'stable', 'stable sort'],
['u', 'unique', 'unique'],
['T', 'tmp-dir=DIR', 'use DIR for temporaries'],
['S', 'buffer-size=SIZE', 'use SIZE for main memory buffer (bytes)'],
], 'KEYDEF');
};
require('util').inherits(SortUtil, require('../Util.js').Util);
SortUtil.prototype.run = function() {
var jp = this.jp;
var separator = '\t';
var sortOptions = {
numeric: this.getOption('numeric'),
reverse: this.getOption('reverse'),
merge: this.getOption('merge'),
stable: this.getOption('stable'),
unique: this.getOption('unique'),
tmpDir: this.getOption('tmp-dir'),
bufferSize: this.getOption('buffer-size')
};
var keyGenerator = this.needArgumentFunction(0);
this.shiftArguments();
var keyStringGenerator;
if(sortOptions.numeric) {
keyStringGenerator = function(obj, env) {
var key = keyGenerator(obj, env);
return ('' + key).match(/^[0-9]*/)[0];
};
} else {
keyStringGenerator = function(obj, env) {
var key = keyGenerator(obj, env);
return JSON.stringify(key);
};
}
/**
* Входной поток - сырые данные
* @param {type} stream
* @returns {unresolved}
*/
var convertFromRaw = function(stream) {
return convertFromLines(stream.pipe(jp.splitLines()));
};
/**
* Если входной поток уже поделен на строки
* @param {type} stream
* @returns {unresolved}
*/
var convertFromLines = function(stream) {
var exportKey = function(line, env) {
var obj = JSON.parse(' ' + line);
var keyString = keyStringGenerator(obj, env);
return keyString + separator + line;
};
return stream.pipe(jp.map(exportKey));
};
/**
* Если входной поток поделен на объекты
* @param {type} stream
* @returns {unresolved}
*/
var convertFromObjects = function(stream) {
var exportKey = function(obj, env) {
var keyString = keyStringGenerator(obj, env);
if(stream.constElements) {
if(obj.___jp_originalJsonLine)
return keyString + separator + obj.___jp_originalJsonLine;
} else {
if(obj.___jp_originalJsonLine)
delete obj.___jp_originalJsonLine;
}
return keyString + separator + JSON.stringify(obj);
};
return stream.pipe(jp.map(exportKey));
};
var streams = this.getInputStreams();
for(var i = 0; i < streams.length; i++) {
var stream = streams[i];
if(stream.elementsType === 'line')
stream = convertFromLines(stream);
else if(stream.elementsType === 'object')
stream = convertFromObjects(stream);
else
stream = convertFromRaw(stream);
stream = stream.pipe(jp.joinLines());
streams[i] = stream;
}
sortOptions.separator = separator;
sortOptions.key = '1,1';
sortOptions.path = __dirname + '/../wrapper/helpers/sort.sh';
if(this.output === process.stdout) {
sortOptions.outputStream = process.stdout;
new (require('../wrapper/Sort.js').Sort)(streams, sortOptions);
} else {
return new (require('../wrapper/Sort.js').Sort)(streams, sortOptions);
}
};
exports.SortUtil = SortUtil;