www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

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>