Skip to content

Instantly share code, notes, and snippets.

@StephanU
Created October 1, 2013 10:01
Show Gist options
  • Save StephanU/6e0677f41e0da2a3334c to your computer and use it in GitHub Desktop.
Save StephanU/6e0677f41e0da2a3334c to your computer and use it in GitHub Desktop.
Couchdb Lucene index function
function(doc) {
if (!doc.type || doc.type !== 'calendarday') {
return null;
}
var result = new Array(),
freeTimeFrames = getFreeTimeFrames(doc);
for (var i = 0; i < freeTimeFrames.length; ++i) {
var ret = new Document();
ret.add(doc.org.id, {"field":"location", "store":"yes"});
for (var j = 0; j < doc.topic.length; ++j) {
ret.add(doc.topic[j].name, {"field":"topic", "store":"yes"});
}
ret.add(freeTimeFrames[i].duration, {"field":"duration", "store":"yes"});
ret.add(freeTimeFrames[i].dtstart, {"field":"from", "store":"yes"});
ret.add(freeTimeFrames[i].dtend, {"field":"to", "store":"yes"});
result.push(ret);
}
return result;
function getFreeTimeFrames(doc) {
var sortedEvents = getSortedEvents(doc),
timeFrames = new Array(),
day = parseDay(doc._id),
currentStart = day + "T000000",
currentEnd = day + "T240000";
log.info(currentStart);
log.info(currentEnd);
for (var i = 0; i < sortedEvents.length; ++i) {
var event = sortedEvents[i];
if (event.dtstart > currentStart) {
timeFrames.push({
"dtstart": currentStart,
"dtend": event.dtstart,
"duration": durationInMin(currentStart, event.dtstart)
});
}
currentStart = event.dtend;
}
return timeFrames;
}
function durationInMin(startDate, endDate) {
// just take hours and minutes (4 characters) from the time of the date (last 6 characters)
var startTime = startDate.substr(startDate.length - 6,4),
endTime = endDate.substr(endDate.length - 6,4);
return timeToMinutes(endTime) - timeToMinutes(startTime);
}
function timeToMinutes(time) {
return time.substr(0,2) * 60 + time.substr(2,2) * 1;
}
function parseDay(id) {
var day = id.match(/[0-9]{4}-[0-9]{2}-[0-9]{2}/);
if (day.length > 0) {
return day[0].replace(/-/g, '');
}
return null;
}
function getSortedEvents(doc) {
var events = new Array();
for (var key in doc.events) {
events.push(doc.events[key]);
}
events.sort(sortByDtStart);
return events;
}
function sortByDtStart(a, b) {
if (a.dtstart < b.dtstart) {
return -1;
}
if (a.dtstart === b.dtstart) {
return 0;
}
return 1;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment