GeoKnow/Jassa-Core

View on GitHub
lib/service/lookup_service/LookupServiceFallback.js

Summary

Maintainability
A
0 mins
Test Coverage
var Class = require('../../ext/Class');
var LookupServiceBase = require('./LookupServiceBase');

var HashMap = require('../../util/collection/HashMap');

var shared = require('../../util/shared');
var Promise = shared.Promise;


/**
 * Lookup Service which draws data from a function.
 * Keys will be omitted if undefined is returned.
 */
var LookupServiceFallback = Class.create(LookupServiceBase, {
    initialize: function(primaryLookupService, fallbackLookupService, acceptFn, resolveFn) {
        this.primaryLookupService = primaryLookupService;
        this.fallbackLookupService = fallbackLookupService;
        this.acceptFn = acceptFn || function(val, key) { return val != null; };
        this.resolveFn = resolveFn || function(fallback, primary, key) { return fallback; };
    },

    lookup: function(keys) {
        var self = this;

        var result = this.primaryLookupService.lookup(keys).then(function(m1) {

            var fallbackKeys = keys.filter(function(key) {
                var val = m1.get(key);
                var r = self.acceptFn(val, key);
                return r;
            });

            var r = self.fallbackLookupService.lookup(fallbackKeys).then(function(m2) {
                var r = new HashMap();

                r.putEntries(m1.entries());

                var entries = m2.entries();
                fallbackKeys.forEach(function(key) {
                    var primary = m1.get(key);
                    var fallback = m2.get(key);

                    var val = self.resolveFn(fallback, primary, key);

                    r.put(key, val);
                });

                return r;
            });

            return r;
        });

        return result;
    }

});

module.exports = LookupServiceFallback;