Skip to content

Latest commit

 

History

History
198 lines (179 loc) · 4.32 KB

File metadata and controls

198 lines (179 loc) · 4.32 KB

MapReduce

DBCollection inputCollection = getDatastore().getCollection(Artist.class);
String outputCollection = "dataCache";
DBObject query = new BasicDBObject();

String mapFunction = StringLoader.loadFromResource("/js/mapArtistCountry.js");
String reduceFunction = StringLoader.loadFromResource("/js/reduceArtistCountry.js");

MapReduceCommand mapReduce = new MapReduceCommand(
		inputCollection,
		mapFunction, reduceFunction,
		outputCollection,
		MapReduceCommand.OutputType.REDUCE,
		query);

return inputCollection.mapReduce(mapReduce);

Map

function() {
	var cacheDataPrefix = 'artist.count_';
	var cacheType = 'artist.count';
	var now = new Date();
	var artist = this;

	//counter for all
	var all = {
		type					: cacheType,
		coverage				: '_ALL',
		date					: now,
		indexed					: 1,
		country					: 0,
		tracked					: 0,
		image					: 0,
		bio						: 0,
		facebook				: 0,
		youtube					: 0,
		instagram				: 0,
		spotify					: 0,
		similarArtist			: 0,
		trackedImage			: 0,
		trackedBio				: 0,
		trackedFacebook			: 0,
		trackedYoutube			: 0,
		trackedInstagram		: 0,
		trackedSpotify			: 0,
		trackedSimilarArtist	: 0
	};

	//counter by coverage (country or none)
	var cvg = {
		type					: cacheType,
		coverage				: '_NONE',
		date					: now,
		indexed					: 1,
		country					: 0,
		tracked					: 0,
		image					: 0,
		bio						: 0,
		facebook				: 0,
		youtube					: 0,
		instagram				: 0,
		spotify					: 0,
		similarArtist			: 0,
		trackedImage			: 0,
		trackedBio				: 0,
		trackedFacebook			: 0,
		trackedYoutube			: 0,
		trackedInstagram		: 0,
		trackedSpotify			: 0,
		trackedSimilarArtist	: 0
	};

	var isNotUndefined = function(value) {
		return !(typeof value === 'undefined') && !(value === null);
	};

	var isNotEmpty = function(value) {
		return isNotUndefined(value) && value.toString().trim().length > 0;
	};
	
	var isTracked = function(artist) {
		return isNotUndefined(artist.tracked) && artist.tracked;
	}(artist);

	if (isNotUndefined(artist.country) && isNotUndefined(artist.country.country)) {
		cvg.coverage = artist.country.country;
		all.country = 1;
		cvg.country = 1;
	}

	if (isTracked) {
		cvg.tracked = 1;
		all.tracked = 1;
	}

	if (isNotEmpty(artist.photoUrl)) {
		cvg.image = 1;
		all.image = 1;
		if(isTracked) {
			cvg.trackedImage = 1;
			all.trackedImage = 1;
		}
	}

	if (isNotEmpty(artist.bio)) {
		cvg.bio = 1;
		all.bio = 1;
		if(isTracked) {
			cvg.trackedBio = 1;
			all.trackedBio = 1;
		}
	}
	
	var hasSocialMedia = function(a) {
		var socialMedia = {};
		if (isNotEmpty(a.referenceEntries)) {
			a.referenceEntries.forEach(function(referenceEntry) {
				socialMedia[(referenceEntry.type)] = 1;
			});
		}
		return function(referenceEntry){
			return isNotEmpty(socialMedia[referenceEntry]);
		}
	}(artist);
	
	var toTitleCase = function(str) {
	    return str.replace(/\w\S*/g, function(txt){
	    	return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
	    });
	}
	
	['FACEBOOK', 'YOUTUBE', 'INSTAGRAM', 'SPOTIFY'].forEach(function(social) {
		if (hasSocialMedia(social)) {
			cvg[social.toLowerCase()] = 1;
			all[social.toLowerCase()] = 1;
			if(isTracked) {
				cvg['tracked' + toTitleCase(social)] = 1;
				all['tracked' + toTitleCase(social)] = 1;
			}
		}
	});
	
	if (isNotUndefined(artist.lastfmInfo) && isNotUndefined(artist.lastfmInfo.similarArtists)) {
		cvg.similarArtist = 1;
		all.similarArtist = 1;
		if (isTracked) {
			cvg.trackedSimilarArtist = 1;
			all.trackedSimilarArtist = 1;
		}
	}

	emit(cacheDataPrefix+all.coverage, all);
	emit(cacheDataPrefix+cvg.coverage, cvg);
}

Reduce

function(key, values) {
	var sum = values.reduce(function(a,b){
		var c = {
			type					: b.type,
			coverage				: b.coverage,
			date					: a.date.getTime() > b.date.getTime() ? a.date : b.date,
		};
		for(var p in b) {
			if (['type', 'coverage', 'date'].includes(p)) continue;
			c[p] = a[p] + b[p];
		}
		return c;
	}, {
			type					: cacheType,
			coverage				: '_ALL',
			date					: new Date(),
			indexed					: 0,
			country					: 0,
			tracked					: 0,
			image					: 0,
			bio						: 0,
			facebook				: 0,
			youtube					: 0,
			instagram				: 0,
			spotify					: 0,
			similarArtist			: 0,
			trackedImage			: 0,
			trackedBio				: 0,
			trackedFacebook			: 0,
			trackedYoutube			: 0,
			trackedInstagram		: 0,
			trackedSpotify			: 0,
			trackedSimilarArtist	: 0
		});
	return sum;
}