Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.weblog.getNextPostAfterDate
on getNextPostAfterDate (adrBlog=radio.weblog.init (), d, adrAdrPost, catname=nil) {
<<Get the post after the specified date.
<<Changes:
<<11/29/01; 5:28:29 PM by JES
<<Only include category posts in the binary search, if the post exsts.
<<11/28/01; 10:54:20 AM by JES
<<Fixed two errors, one when the category has no posts, and one when the category has only a single post.
<<11/28/01; 12:20:09 AM by JES
<<Do a binary search on posts for categories. There was already a catname parameter for this, but it was never referenced.
<<11/16/01; 5:55:28 PM by JES
<<New optional parameter, catname.
<<2/23/01; 9:51:32 PM by JES
<<Fixed an error if there were no posts in the weblog.
<<2/22/01; 3:52:15 PM by PBS
<<Created.
local (adrPosts = @adrBlog^.posts);
local (sizeTable = sizeOf (adrPosts^));
local (flFound = false, adrPost);
if catname == nil {
if sizeOf (adrPosts^) != 0 { //02/23/2001 JES: don't cause an error if there are no posts
if adrPosts^ [1].when >= d { //optimization: check first post
adrPost = @adrPosts^ [1];
flFound = true};
if adrPosts^ [sizeTable].when < d { //optimization: check last post
return (false)};
local (ix = sizeTable / 2, lastIx = 0);
local (currentLess = 0, currentGreater = 0);
if ix > 0 {
loop {
if ix == sizeTable { //no posts after the date
return (false)};
if ix == 1 and adrPosts^ [ix].when >= d { //the first post is after the date
adrPost = @adrPosts^ [ix];
flFound = true;
break};
if adrPosts^ [ix].when < d and adrPosts^ [ix + 1].when >= d { //found it?
adrPost = @adrPosts^ [ix + 1];
flFound = true;
break};
if adrPosts^ [ix + 1].when < d {
currentLess = ix + 1;
ix = ix + ((sizeTable - ix) / 2);
if ix == lastIx {
ix++};
if (currentGreater != 0) and (ix > currentGreater) {
ix = currentGreater}}
else {
if adrPosts^ [ix + 1].when > d {
currentGreater = ix + 1;
ix = ix / 2;
if ix == lastIx {
ix--};
if (currentLess != 0) and (ix < currentLess) {
ix = currentLess}}};
lastIx = ix}}}}
else { //categories have a different search algorithm
local (adrcat = @adrBlog^.categories.[catname]);
local (catPostsTable);
bundle { //build a sorted catPostsTable
new (tableType, @catPostsTable);
local (postnum);
for postnum in adrcat^.storyList {
local (postname = string.padWithZeros (postnum, 8));
if defined (adrblog^.posts.[postname]) {
catPostsTable.[postname] = postname}}};
local (ctPosts = sizeOf (catPostsTable));
if ctPosts > 0 {
on getPost (n) {
return (@adrPosts^.[string.padWithZeros (n, 8)])};
if getPost (catPostsTable [1])^.when >= d { //optimization: check first post
adrPost = getPost (catPostsTable [1]);
flFound = true};
if getPost (catPostsTable [ctPosts])^.when < d { //optimization: check last post
return (false)};
local (ix = ctPosts / 2, lastIx = 0);
if ix > 0 {
local (currentLess = 0, currentGreater = 0);
loop {
if ix == ctPosts { //no posts after the date
return (false)};
if ix == 1 and getPost (catPostsTable [ix])^.when >= d { //the first post is after the date
adrPost = getPost (catPostsTable [ix]);
flFound = true;
break};
if getPost (catPostsTable [ix])^.when < d and getPost (catPostsTable [ix + 1])^.when >= d { //found it?
adrPost = getPost (catPostsTable [ix + 1]);
flFound = true;
break};
if getPost (catPostsTable [ix + 1])^.when < d {
currentLess = ix + 1;
ix = ix + ((ctPosts - ix) / 2);
if ix == lastIx {
ix++};
if (currentGreater != 0) and (ix > currentGreater) {
ix = currentGreater}}
else {
if getPost (catPostsTable [ix + 1])^.when > d {
currentGreater = ix + 1;
ix = ix / 2;
if ix == lastIx {
ix--};
if (currentLess != 0) and (ix < currentLess) {
ix = currentLess}}};
lastIx = ix}}}};
if flFound {
adrAdrPost^ = adrPost};
return (flFound)}
<<bundle //test code
<<local (adrPost)
<<if getNextPostAfterDate (d:date ("1/26/2001"), adrAdrPost:@adrPost)
<<edit (adrPost)
<<bundle //more test code
<<local (adrPost, d = date ("11/01/2001"))
<<if getNextPostAfterDate (d:d, adrAdrPost:@adrPost, catname:"Jake's other test channel")
<<edit (adrPost)
<<else {dialog.notify ("No post after " + d)}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.