data_generator.html (3755B)
1 <html> 2 <head> 3 <script src="../include.js"></script> 4 <script> 5 var generateData = Zotero.Promise.coroutine(function* (options = {}) { 6 var chunkSize = options.chunkSize; 7 var numItems = options.numItems; 8 var runs = Math.ceil(numItems / chunkSize); 9 var created = 0; 10 var itemTypes = Zotero.ItemTypes.getAll() 11 // Don't create attachments, notes, or custom item types 12 .filter(x => x.name != 'attachment' && x.name != 'note' && x.id < 10000); 13 var accessDateFieldID = Zotero.ItemFields.getID('accessDate'); 14 for (let i = 0; i < runs; i++) { 15 yield Zotero.DB.executeTransaction(function* () { 16 for (let i = 0; i < chunkSize && created++ < numItems; i++) { 17 let { id: itemTypeID, name: itemType } = 18 itemTypes[Math.floor(Math.random() * itemTypes.length)]; 19 let item = new Zotero.Item(itemType); 20 item.setField('title', randStr(5, 200)); 21 let fieldIDs = Zotero.ItemFields.getItemTypeFields(itemTypeID); 22 // Creators 23 if (rand(1, 10) > 2) { 24 let numCreators = rand(1, 5); 25 let creators = []; 26 let primaryCreatorTypeID = Zotero.CreatorTypes.getPrimaryIDForType(itemTypeID); 27 // Add primary type for most items 28 if (rand(1, 10) > 2) { 29 let creatorType = Zotero.CreatorTypes.getName(primaryCreatorTypeID); 30 addCreatorOfType(creators, creatorType); 31 } 32 // Add other types 33 let creatorTypes = Zotero.CreatorTypes.getTypesForItemType(itemTypeID) 34 .map(type => type.name); 35 let max = rand(0, 8); 36 for (let i = 0; i < max; i++) { 37 addCreatorOfType( 38 creators, 39 creatorTypes[Math.floor(Math.random() * creatorTypes.length)] 40 ); 41 } 42 item.setCreators(creators); 43 } 44 // Fill a random set of fields with random data 45 fieldIDs = getRandomSubarray(fieldIDs, Zotero.Utilities.rand(1, 10)); 46 for (let fieldID of fieldIDs) { 47 // Avoid warning from invalid access date 48 if (fieldID == accessDateFieldID) continue; 49 50 item.setField(fieldID, randStr(1, 200)); 51 } 52 // Add tags to 1 in 4 items 53 if (Zotero.Utilities.rand(1, 4) == 1) { 54 let numTags = rand(1, 10); 55 for (let i = 0; i < numTags; i++) { 56 item.addTag( 57 randStr(4, 40), 58 // Make 1/4 of tags automatic 59 rand(1, 4) == 1 ? 1 : 0 60 ); 61 } 62 } 63 yield item.save(); 64 } 65 }); 66 } 67 }); 68 69 // From http://stackoverflow.com/a/11935263 70 function getRandomSubarray(arr, size) { 71 var shuffled = arr.slice(0), i = arr.length, temp, index; 72 while (i--) { 73 index = Math.floor((i + 1) * Math.random()); 74 temp = shuffled[index]; 75 shuffled[index] = shuffled[i]; 76 shuffled[i] = temp; 77 } 78 return shuffled.slice(0, size); 79 } 80 81 var rand = Zotero.Utilities.rand; 82 function randStr(min, max) { 83 var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 84 + "éØü" 85 + "漢字" 86 + " " 87 do { 88 var rnd = Zotero.Utilities.randomString(rand(min, max), chars); 89 } 90 // Make sure string isn't all spaces 91 while (rnd.trim().length == 0); 92 return rnd; 93 } 94 95 function addCreatorOfType(creators, creatorType) { 96 if (rand(1, 2) == 1) { 97 creators.push({ 98 creatorType, 99 firstName: randStr(0, 10), 100 lastName: randStr(3, 20) 101 }); 102 } 103 else { 104 creators.push({ 105 creatorType, 106 name: randStr(3, 40) 107 }); 108 } 109 } 110 </script> 111 </head> 112 <body> 113 <!-- TODO: Add text fields for numItems and chunkSize --> 114 <button onclick="generateData({ numItems: 10000, chunkSize: 50 })">Generate Data</button> 115 </body> 116 </html>