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
if (json.extra) {
let pmid = this._extractPMID(json.extra);
let pmid = this._extractExtraFields(json.extra).pmid;
if (pmid) {
valuesToCheck.push({
type: this.TYPE_PMID,
@ -681,14 +681,17 @@ Zotero.Retractions = {
},
_getItemPMID: function (item) {
// TEMP
return this._extractPMID(item.getField('extra')) || null;
return this._extractExtraFields(item.getField('extra')).pmid;
},
// TEMP
_extractPMID: function (str) {
_extractExtraFields: function (str) {
var fields = {
doi: null,
pmid: null
};
if (!str) {
return false;
return fields;
}
var lines = str.split(/\n+/g);
for (let line of lines) {
@ -705,11 +708,18 @@ Zotero.Retractions = {
.replace(/{:([^:]+):([^}]+)}/);
value = value.trim();
if (field == 'pmid' || field == 'pubmedid') {
return value;
if (field == 'doi' && !fields.doi) {
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) {
@ -747,54 +757,61 @@ Zotero.Retractions = {
},
_cacheKeyMappings: async function () {
await this._cacheDOIMappings();
await this._cachePMIDMappings();
},
_cacheDOIMappings: async function () {
this._keyItems[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._itemKeys[this.TYPE_PMID] = 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('extra'));
var doiFieldID = Zotero.ItemFields.getID('DOI');
var extraFieldID = 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) {
/*
let { fields } = Zotero.Utilities.Internal.extractExtraFields(row.value);
let pmid = fields.get('pmid') || fields.get('pubmedID');
if (!pmid) continue;
this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id);
*/
let pmid = this._extractPMID(row.value);
if (!pmid) continue;
this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id);
// 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 pmid = fields.get('pmid') || fields.get('pubmedID');
if (!pmid) continue;
this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id);
*/
//let pmid = this._extractPMID(row.value);
if (pmid) {
this._addItemKeyMapping(this.TYPE_PMID, pmid, row.id);
}
}
}
},

View file

@ -258,6 +258,17 @@ describe("Retractions", function() {
var indexes = await Zotero.Retractions.getRetractionsFromJSON(json);
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]);
});
});