Skip to content

Instantly share code, notes, and snippets.

@klehmann
Created July 2, 2024 15:15
Show Gist options
  • Save klehmann/b5254e91918ba0431f7fb4822959749a to your computer and use it in GitHub Desktop.
Save klehmann/b5254e91918ba0431f7fb4822959749a to your computer and use it in GitHub Desktop.
package com.mindoo.domino.virtualviewtest;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.mindoo.domino.jna.NotesDatabase;
import com.mindoo.domino.jna.gc.NotesGC;
import com.mindoo.domino.jna.utils.NotesMarkdownTable;
import com.mindoo.domino.jna.virtualviews.VirtualView;
import com.mindoo.domino.jna.virtualviews.VirtualViewColumn;
import com.mindoo.domino.jna.virtualviews.VirtualViewColumn.Category;
import com.mindoo.domino.jna.virtualviews.VirtualViewColumn.ColumnSort;
import com.mindoo.domino.jna.virtualviews.VirtualViewColumn.Hidden;
import com.mindoo.domino.jna.virtualviews.VirtualViewColumn.Total;
import com.mindoo.domino.jna.virtualviews.VirtualViewEntryData;
import com.mindoo.domino.jna.virtualviews.VirtualViewNavigator;
import com.mindoo.domino.jna.virtualviews.VirtualViewNavigator.SelectedOnly;
import com.mindoo.domino.jna.virtualviews.VirtualViewNavigator.WithCategories;
import com.mindoo.domino.jna.virtualviews.VirtualViewNavigator.WithDocuments;
import com.mindoo.domino.jna.virtualviews.dataprovider.NotesSearchVirtualViewDataProvider;
import com.mindoo.domino.jna.virtualviews.security.ViewEntryAccessCheck;
import lotus.domino.NotesException;
import lotus.domino.NotesFactory;
import lotus.domino.NotesThread;
import lotus.domino.Session;
public class VirtualViewTest {
public static final String DBPATH_FAKENAMES_NSF = "fakenames.nsf";
public static void main(String[] args) {
VirtualViewTest app = new VirtualViewTest();
int exitCode = 0;
NotesThread.sinitThread();
try {
app.run();
}
catch (Exception e) {
e.printStackTrace();
exitCode = -1;
}
finally {
NotesThread.stermThread();
System.exit(exitCode);
}
}
public void run() throws Exception {
NotesGC.runWithAutoGC(() -> {
Session session = NotesFactory.createSession();
Map<String,String> someExternalData = new HashMap<>();
someExternalData.put("Revoco", "Revoco Street 5, Los Angeles");
someExternalData.put("Omnis", "Omnis Boulevard 12, New York");
VirtualView view = new VirtualView(
new VirtualViewColumn("Origin DB", "Origin",
Category.YES, Hidden.NO, ColumnSort.ASCENDING,
Total.NONE,
(origin, itemName, columnValues)-> {
return origin;
}),
new VirtualViewColumn("Readers", "Readers",
Category.YES, Hidden.NO, ColumnSort.ASCENDING,
Total.NONE,
(origin, itemName, columnValues)-> {
List<String> readers = columnValues.getAsStringList("$C1$", null);
if (readers==null || readers.isEmpty()) {
return "All";
} else {
return readers;
}
}),
new VirtualViewColumn("Creation Date", "CreationDate",
Category.NO, Hidden.NO, ColumnSort.ASCENDING,
Total.NONE,
"@Created"),
new VirtualViewColumn("Total Sum", "TotalSum",
Category.NO, Hidden.NO, ColumnSort.NONE,
Total.SUM,
(origin, itemName, columnValues)-> {
return 10;
}),
new VirtualViewColumn("Total Average", "TotalAverage",
Category.NO, Hidden.NO, ColumnSort.NONE,
Total.AVERAGE,
(origin, itemName, columnValues)-> {
return 10;
}),
new VirtualViewColumn("Lastname", "Lastname",
Category.NO, Hidden.NO, ColumnSort.ASCENDING,
Total.NONE,
"Lastname"),
new VirtualViewColumn("Firstname", "Firstname",
Category.NO, Hidden.NO, ColumnSort.ASCENDING,
Total.NONE,
"Firstname"),
new VirtualViewColumn("Company Address", "CompanyAddress",
Category.NO, Hidden.NO, ColumnSort.NONE,
Total.NONE,
(origin, itemName, columnValues)-> {
//add some data from an external source (poor man's join)
String companyName = columnValues.getAsString("CompanyName", "");
return someExternalData.getOrDefault(companyName, "");
})
);
//add data from one database to the virtual view
NotesDatabase dbFakenames = getFakeNamesDb(session);
//test with small dataset first
Set<Integer> noteIdFilter = new HashSet<>();
// noteIdFilter.addAll(Arrays.asList(166938, 166950, 170498, 102862, 47322));
noteIdFilter.addAll(Arrays.asList(170498, 102862, 47322));
// noteIdFilter.addAll(Arrays.asList(102862, 47322));
noteIdFilter = null;
long update_t0=System.currentTimeMillis();
NotesSearchVirtualViewDataProvider dataProvider = new NotesSearchVirtualViewDataProvider(view,
"myfakenames1",
dbFakenames,
"Form=\"Person\"",
null,
noteIdFilter);
// pump all data into the view (incremental updates are also possible)
dataProvider.update();
long update_t1=System.currentTimeMillis();
System.out.println("Time to generate view structure: "+(update_t1-update_t0)+"ms");
ViewEntryAccessCheck accessCheck = ViewEntryAccessCheck
.forUser(session.getEffectiveUserName())
.addDbUserNamesListForOrigins(dbFakenames, "myfakenames1");
StringWriter sWriter = new StringWriter();
PrintWriter pWriter = new PrintWriter(sWriter);
long nav_t0=System.currentTimeMillis();
VirtualViewNavigator nav = view.createViewNavFromCategory("myfakenames1\\[ReadAll]",
WithCategories.YES, WithDocuments.YES, accessCheck);
nav.expandAll();
// nav.expandLevel(2);
new NotesMarkdownTable(nav, pWriter)
.addColumn(NotesMarkdownTable.EXPANDSTATE)
.addColumn(NotesMarkdownTable.CHILDCOUNT)
.addColumn(NotesMarkdownTable.SIBLINGCOUNT)
.addColumn(NotesMarkdownTable.DESCENDANTCOUNT)
.addColumn(NotesMarkdownTable.POS)
.addColumn("category", 40, (table, entry) -> {
if (entry instanceof VirtualViewEntryData) {
return String.valueOf(((VirtualViewEntryData) entry).getCategoryValue());
}
else {
return "";
}
})
.addColumn(NotesMarkdownTable.NOTEID)
.addColumn(NotesMarkdownTable.UNID)
.addAllViewColumns()
.setColumnWidth("Origin DB (Origin)", 20)
.setColumnWidth("Readers (Readers)", 60)
.printHeader()
.printRows(nav.entriesForward(SelectedOnly.NO))
.printFooter();
long nav_t1=System.currentTimeMillis();
System.out.println("Time to navigate view structure: "+(nav_t1-nav_t0)+"ms");
System.out.println(sWriter);
return null;
});
}
public NotesDatabase getFakeNamesDb(Session session) throws NotesException {
NotesDatabase db = new NotesDatabase(session, "", DBPATH_FAKENAMES_NSF);
return db;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment