Created
July 2, 2024 15:15
-
-
Save klehmann/b5254e91918ba0431f7fb4822959749a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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