Reduce startup time from retraction key caching
This commit is contained in:
parent
693cd926d5
commit
cae2aab70f
2 changed files with 78 additions and 50 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue