UNPKG

waterline-postgresql

Version:
67 lines (60 loc) 1.72 kB
'use strict' var extend = require('xtend/mutable') module.exports = PostgresInterval function PostgresInterval (raw) { if (!(this instanceof PostgresInterval)) { return new PostgresInterval(raw) } extend(this, parse(raw)) } var properties = ['seconds', 'minutes', 'hours', 'days', 'months', 'years'] PostgresInterval.prototype.toPostgres = function () { var filtered = properties.filter(this.hasOwnProperty, this) if (filtered.length === 0) return '0' return filtered .map(function (property) { return this[property] + ' ' + property }, this) .join(' ') } var NUMBER = '([+-]?\\d+)' var YEAR = NUMBER + '\\s+years?' var MONTH = NUMBER + '\\s+mons?' var DAY = NUMBER + '\\s+days?' var TIME = '([+-])?([\\d]*):(\\d\\d):(\\d\\d):?(\\d\\d\\d)?' var INTERVAL = new RegExp([YEAR, MONTH, DAY, TIME].map(function (regexString) { return '(' + regexString + ')?' }) .join('\\s*')) // Positions of values in regex match var positions = { years: 2, months: 4, days: 6, hours: 9, minutes: 10, seconds: 11, milliseconds: 12 } // We can use negative time var negatives = ['hours', 'minutes', 'seconds'] function parse (interval) { if (!interval) return {} var matches = INTERVAL.exec(interval) var isNegative = matches[8] === '-' return Object.keys(positions) .reduce(function (parsed, property) { var position = positions[property] var value = matches[position] // no empty string if (!value) return parsed value = parseInt(value, 10) // no zeros if (!value) return parsed if (isNegative && ~negatives.indexOf(property)) { value *= -1 } parsed[property] = value return parsed }, {}) }