UNPKG

lib-jsl

Version:

JSL is a JSON based logic programming library meant for embedded use

166 lines (149 loc) 4.06 kB
var JSL = require('lib-jsl'); var offers = [ [{ type : 'offer', offerer : 'sandeep', bidder : '$bidder', symbol : 'ABC', price : 18, qty : 100 }], [{ type : 'offer', offerer : 'ruchir', bidder : '$bidder', symbol : 'ABC', price : 20, qty : 100 }], [{ type : 'offer', offerer : 'prachi', bidder : '$bidder', symbol : 'ABC', price : 16, qty : 100 }], [{ type : 'offer', offerer : 'avantika', bidder : '$bidder', symbol : 'ABC', price : null, qty : 200 }] ] var bids = [ [{ type : 'bid', offerer : '$offerer', bidder : 'kavi', symbol : 'ABC', price : 20, qty : 100 }], [{ type : 'bid', offerer : '$offerer', bidder : 'pradeep', symbol : 'ABC', price : 21, qty : 100 }], [{ type : 'bid', offerer : '$offerer', bidder : 'taran', symbol : 'ABC', price : 20, qty : 200 }], [{ type : 'bid', offerer : '$offerer', bidder : 'naveen', symbol : 'ABC', price : 26, qty : 100 }], [{ type : 'bid', offerer : '$offerer', bidder : 'prashant', symbol : 'ABC', price : 25, qty : 200 }], [{ type : 'bid', offerer : '$offerer', bidder : 'shipu', symbol : 'ABC', price : null, qty : 200 }] ] var rules = [ [ { match : {offerer : '$offerer', bidder : '$bidder', symbol : '$symbol', price : '$price', qty : '$qty'}}, { $query : [ [{ accumulateBestMatches : '$x'}], null, '$y'] }, { type : 'bid', bidder : '$bidder', symbol : '$symbol', qty : '$qty'}, { $call : [ 'getBestMatch', '$bidder', ['$offerer', '$bidPrice', '$price'] ] } ], [ { accumulateBestMatches : '$x'}, { type : 'bid', bidder : '$bidder', symbol : '$symbol', price : '$bidPrice', qty : '$qty'}, { type : 'offer', offerer : '$offerer', symbol : '$symbol', price : '$offerPrice', qty : '$qty'}, { $call : [ 'accumulateMatch', '$bidder', '$bidPrice', '$offerer', '$offerPrice' ] } ] ] var bestOffers = {}; var offersConsumed = {}; var callbacks = { accumulateMatch : function(bidder, bidPrice, offerer, offerPrice) { if (!offersConsumed[offerer]) { if (bestOffers[bidder] == null) { if (offerPrice != null && bidPrice != null && bidPrice - offerPrice > 0) { bestOffers[bidder] = [offerer, bidPrice, offerPrice]; offersConsumed[offerer] = true; } else if (offerPrice == null && bidPrice != null) { bestOffers[bidder] = [offerer, bidPrice, bidPrice] offersConsumed[offerer] = true; } else if (offerPrice != null && bidPrice == null) { bestOffers[bidder] = [offerer, offerPrice, offerPrice] offersConsumed[offerer] = true; } } else { var spread = bestOffers[bidder][1] - bestOffers[bidder][2]; if (offerPrice != null && bidPrice != null && bidPrice - offerPrice > spread) { offersConsumed[bestOffers[bidder][0]] = false; bestOffers[bidder] = [offerer, bidPrice, offerPrice]; offersConsumed[offerer] = true; } else if (offerPrice != null && bidPrice == null && offerPrice < bestOffers[bidder][2]) { bestOffers[bidder] = [offerer, offerPrice, offerPrice] } } } return true; // accumulation always succeeds }, getBestMatch : function(bidder) { var result = null; if (bestOffers[bidder] != null) { result = bestOffers[bidder] } return result; } } var jsl = new JSL({ rules: rules.concat(bids, offers), query: [{match: '$match'}], callbacks : callbacks, transform: '$match' }); var response = jsl.run(); console.log('matches: ', response); module.exports = response;