commit b732a82d556501e772c6ff3a19d21491732c7bca
parent f9ea0af4cf74f44127092546abbebd042b10cf7e
Author: Dan Stillman <dstillman@zotero.org>
Date: Thu, 9 Mar 2017 03:45:51 -0500
Script to generate random item data
For building up a big library and testing UI interaction during writes
To use, load chrome://zotero/content/tools/data_generator.html in
Firefox (for now).
Could be improved a bit to add other kinds of data (collections,
child items, relations)
Diffstat:
1 file changed, 111 insertions(+), 0 deletions(-)
diff --git a/chrome/content/zotero/tools/data_generator.html b/chrome/content/zotero/tools/data_generator.html
@@ -0,0 +1,111 @@
+<html>
+ <head>
+ <script src="../include.js"></script>
+ <script>
+ var generateData = Zotero.Promise.coroutine(function* (options = {}) {
+ var numItems = options.numItems || 100;
+ var created = 0;
+ var chunkSize = 50;
+ var runs = Math.ceil(numItems / chunkSize);
+ var itemTypes = Zotero.ItemTypes.getAll()
+ .filter(x => x.name != 'attachment' && x.name != 'note' && x.id < 10000);
+ var accessDateFieldID = Zotero.ItemFields.getID('accessDate');
+ for (let i = 0; i < runs; i++) {
+ yield Zotero.DB.executeTransaction(function* () {
+ for (let i = 0; i < chunkSize && created++ < numItems; i++) {
+ let { id: itemTypeID, name: itemType } =
+ itemTypes[Math.floor(Math.random() * itemTypes.length)];
+ let item = new Zotero.Item(itemType);
+ item.setField('title', randStr(5, 200));
+ let fieldIDs = Zotero.ItemFields.getItemTypeFields(itemTypeID);
+ // Creators
+ if (rand(1, 10) > 2) {
+ let numCreators = rand(1, 5);
+ let creators = [];
+ let primaryCreatorTypeID = Zotero.CreatorTypes.getPrimaryIDForType(itemTypeID);
+ // Add primary type for most items
+ if (rand(1, 10) > 2) {
+ let creatorType = Zotero.CreatorTypes.getName(primaryCreatorTypeID);
+ addCreatorOfType(creators, creatorType);
+ }
+ // Add other types
+ let creatorTypes = Zotero.CreatorTypes.getTypesForItemType(itemTypeID)
+ .map(type => type.name);
+ let max = rand(0, 8);
+ for (let i = 0; i < max; i++) {
+ addCreatorOfType(
+ creators,
+ creatorTypes[Math.floor(Math.random() * creatorTypes.length)]
+ );
+ }
+ item.setCreators(creators);
+ }
+ // Fill a random set of fields with random data
+ fieldIDs = getRandomSubarray(fieldIDs, Zotero.Utilities.rand(1, 10));
+ for (let fieldID of fieldIDs) {
+ // Avoid warning from invalid access date
+ if (fieldID == accessDateFieldID) continue;
+
+ item.setField(fieldID, randStr(1, 200));
+ }
+ // Add tags to 1 in 4 items
+ if (Zotero.Utilities.rand(1, 4) == 1) {
+ let numTags = rand(1, 10);
+ for (let i = 0; i < numTags; i++) {
+ item.addTag(
+ randStr(4, 40),
+ // Make 1/4 of tags automatic
+ rand(1, 4) == 1 ? 1 : 0
+ );
+ }
+ }
+ yield item.save();
+ }
+ });
+ }
+ });
+
+ // From http://stackoverflow.com/a/11935263
+ function getRandomSubarray(arr, size) {
+ var shuffled = arr.slice(0), i = arr.length, temp, index;
+ while (i--) {
+ index = Math.floor((i + 1) * Math.random());
+ temp = shuffled[index];
+ shuffled[index] = shuffled[i];
+ shuffled[i] = temp;
+ }
+ return shuffled.slice(0, size);
+ }
+
+ var rand = Zotero.Utilities.rand;
+ function randStr(min, max) {
+ return Zotero.Utilities.randomString(
+ rand(min, max),
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ + "éØü"
+ + "漢字"
+ + " "
+ );
+ }
+
+ function addCreatorOfType(creators, creatorType) {
+ if (rand(1, 2) == 1) {
+ creators.push({
+ creatorType,
+ firstName: randStr(0, 10),
+ lastName: randStr(3, 20)
+ });
+ }
+ else {
+ creators.push({
+ creatorType,
+ name: randStr(3, 40)
+ });
+ }
+ }
+ </script>
+ </head>
+ <body>
+ <button onclick="generateData({numItems: 10000})">Generate Data</button>
+ </body>
+</html>