Mohan
Mohan

Reputation: 221

Is there any way I can ask queries to Notes Database

I am working on fetching meetings given two dates: e.g. fetch all the meetings that are in the current month.

Suppose that I have around 45 meetings in the specified period. My web service is taking a lot of time. This is how I'm doing it right now:

  1. I fetch all the documents in the calendar view.

  2. Check all the documents for the start Date and end date.

  3. If any of the meetings fall in the specified period i am constructing an array and i am returning that array.

Is this correct?

Upvotes: 0

Views: 1219

Answers (3)

Dave Delay
Dave Delay

Reputation: 1320

If you are using Notes / Domino 9.0 or later, you should use the built-in calendar classes. These are available either from LotusScript or Java. Here's an example using Java. Given a database object and a date range, it prints all the entries in the range:

private static void printRange(Database database, DateTime start, DateTime end) throws NotesException {

    // Get the calendar object from the database
    NotesCalendar calendar = database.getParent().getCalendar(database);
    if ( calendar != null ) {

        // Get a list of calendar entries
        Vector<NotesCalendarEntry> entries = calendar.getEntries(start, end);
        if ( entries != null ) {

            // For each entry ...
            Iterator<NotesCalendarEntry> iterator = entries.iterator();
            while (iterator.hasNext()) {
                NotesCalendarEntry entry = iterator.next();

                // Read the iCalendar representation
                String icalendar = entry.read();

                // Get the Notes UNID
                Document doc = entry.getAsDocument();
                String unid = doc.getUniversalID();

                // Print UNID and iCalendar to console
                System.out.println("Entry UNID: " + unid);
                System.out.println(icalendar);
            }
        }
    }
}

The NotesCalendar and NotesCalendarEntry interfaces are in the lotus.domino package. If you are using LotusScript, there are classes of the same name and with the same methods.

A couple of warnings about the above code:

  1. It doesn't handle the nuances of repeating entries. You can have multiple instances of a repeating entry in the same time range. In Notes these entries might have the same UNID. You should test your code with repeating entries to make sure you understand the nuances.
  2. The example doesn't recycle the Document, NotesCalendarEntry and NotesCalendar objects as it should. I skipped this for simplicity, but if you are using the Notes Java classes, you definitely need to use recycle() correctly. It will save headaches down the road.

Upvotes: 0

Tode
Tode

Reputation: 12060

This way is correct, but very inefficient. Better use the NotesDatabase- Class and create a Query to use with the search- method: Here an example in LotusScript (as you do not specify a language)

Dim ses as New NotesSession
Dim db as NotesDatabase
Dim dc as NotesDocumentCollection
Dim strQuery as String


Set db = ses.CurrentDatabase
strQuery = {Form = "Appointment" & _
(StartDate >= [01.01.2014] & StartDate < [01.02.2014]) | _
(EndDate >= [01.01.2014] & EndDate < [01.02.2014])}
Set dc = db.Search( strQuery , Nothing, 0 )
'- Cycle through this collection...

Of course you need to dynamically adjust the strQuery by building it from todays date... But this will be much more performant than your version.

Upvotes: 3

PeterMmm
PeterMmm

Reputation: 24630

It is correct, but not very performant when you have a lot of documents. Basically you will create a view with first column the meeting (start)date, sorted. In LotusScript you can acces the view, set the "cursor" of the first meeting that matches the starting date and then step thru the view until you reach a date after the end date.

Read about view´s GetDocumentByKey method. Further here: http://publib.boulder.ibm.com/infocenter/domhelp/v8r0/index.jsp?topic=%2Fcom.ibm.designer.domino.main.doc%2FH_LOCATING_DOCUMENTS_WITHIN_A_VIEW_OR_FOLDER.html

Hmmm ... thinking a litlle further, what happens if you have a start date but no matching meeting ... so refer to FTSearch() method.

Upvotes: 0

Related Questions