Reduce startup time from retraction key caching

This commit is contained in:
Dan Stillman 2020-09-23 22:49:25 -04:00
parent 693cd926d5
commit cae2aab70f
2 changed files with 78 additions and 50 deletions

View file

@ -206,7 +206,7 @@ Zotero.Retractions = {
// PMID // PMID
if (json.extra) { if (json.extra) {
let pmid = this._extractPMID(json.extra); let pmid = this._extractExtraFields(json.extra).pmid;
if (pmid) { if (pmid) {
valuesToCheck.push({ valuesToCheck.push({
type: this.TYPE_PMID, type: this.TYPE_PMID,
@ -681,14 +681,17 @@ Zotero.Retractions = {
}, },
_getItemPMID: function (item) { _getItemPMID: function (item) {
// TEMP return this._extractExtraFields(item.getField('extra')).pmid;
return this._extractPMID(item.getField('extra')) || null;
}, },
// TEMP // TEMP
_extractPMID: function (str) { _extractExtraFields: function (str) {
var fields = {
doi: null,
pmid: null
};
if (!str) { if (!str) {
return false; return fields;
} }
var lines = str.split(/\n+/g); var lines = str.split(/\n+/g);
for (let line of lines) { for (let line of lines) {
@ -705,11 +708,18 @@ Zotero.Retractions = {
.replace(/{:([^:]+):([^}]+)}/); .replace(/{:([^:]+):([^}]+)}/);
value = value.trim(); value = value.trim();
if (field == 'pmid' || field == 'pubmedid') { if (field == 'doi' && !fields.doi) {
return value; fields.doi = value;
}
else if ((field == 'pmid' || field == 'pubmedid') && !fields.pmid) {
fields.pmid = value;
}
if (fields.doi && fields.pmid) {
break;
} }
} }
return false; return fields;
}, },
_valueToKey: function (type, value) { _valueToKey: function (type, value) {
@ -747,55 +757,62 @@ Zotero.Retractions = {
}, },
_cacheKeyMappings: async function () { _cacheKeyMappings: async function () {
await this._cacheDOIMappings();
await this._cachePMIDMappings();
},
_cacheDOIMappings: async function () {
this._keyItems[this.TYPE_DOI] = new Map(); this._keyItems[this.TYPE_DOI] = new Map();
this._itemKeys[this.TYPE_DOI] = new Map(); this._itemKeys[this.TYPE_DOI] = new Map();
var sql = "SELECT itemID AS id, value FROM itemData "
+ "JOIN itemDataValues USING (valueID) WHERE fieldID=?";
var rows = await Zotero.DB.queryAsync(sql, Zotero.ItemFields.getID('DOI'));
for (let row of rows) {
let value = Zotero.Utilities.cleanDOI(row.value);
if (!value) continue;
this._addItemKeyMapping(this.TYPE_DOI, value, row.id);
}
// Extract from Extract field
sql = "SELECT itemID AS id, value FROM itemData "
+ "JOIN itemDataValues USING (valueID) WHERE fieldID=?";
rows = await Zotero.DB.queryAsync(sql, Zotero.ItemFields.getID('extra'));
for (let row of rows) {
let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value);
let doi = fields.get('DOI');
if (!doi) continue;
let value = Zotero.Utilities.cleanDOI(doi);
if (!value) continue;
this._addItemKeyMapping(this.TYPE_DOI, value, row.id);
}
},
_cachePMIDMappings: async function () {
this._keyItems[this.TYPE_PMID] = new Map(); this._keyItems[this.TYPE_PMID] = new Map();
this._itemKeys[this.TYPE_PMID] = new Map(); this._itemKeys[this.TYPE_PMID] = new Map();
var sql = "SELECT itemID AS id, value FROM itemData " var doiFieldID = Zotero.ItemFields.getID('DOI');
+ "JOIN itemDataValues USING (valueID) WHERE fieldID=?"; var extraFieldID = Zotero.ItemFields.getID('extra');
var rows = await Zotero.DB.queryAsync(sql, Zotero.ItemFields.getID('extra'));
var sql = "SELECT itemID AS id, fieldID, value FROM itemData "
+ "JOIN itemDataValues USING (valueID) WHERE fieldID IN (?, ?)";
var rows = await Zotero.DB.queryAsync(
sql,
[
doiFieldID,
extraFieldID
]
);
for (let row of rows) { for (let row of rows) {
// DOI field
if (row.fieldID == doiFieldID) {
let value = Zotero.Utilities.cleanDOI(row.value);
if (value) {
this._addItemKeyMapping(this.TYPE_DOI, value, row.id);
}
}
// Extra field
else {
// DOI
/*
let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value);
let doi = fields.get('DOI');
if (!doi) continue;
*/
let { doi, pmid } = this._extractExtraFields(row.value);
if (doi) {
let value = Zotero.Utilities.cleanDOI(doi);
if (value) {
this._addItemKeyMapping(this.TYPE_DOI, value, row.id);
}
}
// PMID
/* /*
let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value); let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value);
let pmid = fields.get('pmid') || fields.get('pubmedID'); let pmid = fields.get('pmid') || fields.get('pubmedID');
if (!pmid) continue; if (!pmid) continue;
this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id); this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id);
*/ */
let pmid = this._extractPMID(row.value); //let pmid = this._extractPMID(row.value);
if (!pmid) continue; if (pmid) {
this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id); this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id);
} }
}
}
}, },
_addItemKeyMapping: function (type, value, itemID) { _addItemKeyMapping: function (type, value, itemID) {

View file

@ -258,6 +258,17 @@ describe("Retractions", function() {
var indexes = await Zotero.Retractions.getRetractionsFromJSON(json); var indexes = await Zotero.Retractions.getRetractionsFromJSON(json);
assert.sameMembers(indexes, [0]); assert.sameMembers(indexes, [0]);
}); });
it("should identify object with retracted DOI on subsequent line in Extra", async function () {
var json = [
{
extra: `Foo: Bar\nDOI: ${retractedDOI}`
}
];
var indexes = await Zotero.Retractions.getRetractionsFromJSON(json);
assert.sameMembers(indexes, [0]);
});
}); });