Fix Zotero.ItemFields.getBaseIDFromTypeAndField()

Closes #741
This commit is contained in:
Dan Stillman 2015-05-27 05:01:48 -04:00
parent 80d5b74cf3
commit 7eaa57562f
2 changed files with 50 additions and 6 deletions

View file

@ -36,6 +36,7 @@ Zotero.ItemFields = new function() {
var _baseMappedFields = []; var _baseMappedFields = [];
var _typeFieldIDsByBase = {}; var _typeFieldIDsByBase = {};
var _typeFieldNamesByBase = {}; var _typeFieldNamesByBase = {};
var _baseFieldIDsByTypeAndField = {};
// Privileged methods // Privileged methods
this.getName = getName; this.getName = getName;
@ -288,13 +289,13 @@ Zotero.ItemFields = new function() {
var typeFieldID = this.getID(typeField); var typeFieldID = this.getID(typeField);
if (!itemTypeID) { if (!itemTypeID) {
throw ("Invalid item type '" + itemType + "' in ItemFields.getBaseIDFromTypeAndField()"); throw new Error("Invalid item type '" + itemType + "'");
} }
_fieldCheck(typeField, 'getBaseIDFromTypeAndField'); _fieldCheck(typeField, 'getBaseIDFromTypeAndField');
if (!this.isValidForType(typeFieldID, itemTypeID)) { if (!this.isValidForType(typeFieldID, itemTypeID)) {
throw ("'" + typeField + "' is not a valid field for '" + itemType + "' in ItemFields.getBaseIDFromTypeAndField()"); throw new Error("'" + typeField + "' is not a valid field for '" + itemType + "'");
} }
// If typeField is already a base field, just return that // If typeField is already a base field, just return that
@ -302,8 +303,8 @@ Zotero.ItemFields = new function() {
return typeFieldID; return typeFieldID;
} }
return Zotero.DB.valueQuery("SELECT baseFieldID FROM baseFieldMappingsCombined " if (!_baseFieldIDsByTypeAndField[itemTypeID]) return false;
+ "WHERE itemTypeID=? AND fieldID=?", [itemTypeID, typeFieldID]); return _baseFieldIDsByTypeAndField[itemTypeID][typeFieldID] || false;
} }
@ -466,16 +467,25 @@ Zotero.ItemFields = new function() {
} }
_baseTypeFields = fields; _baseTypeFields = fields;
var sql = "SELECT baseFieldID, fieldID, fieldName " var sql = "SELECT itemTypeID, baseFieldID, fieldID, fieldName "
+ "FROM baseFieldMappingsCombined JOIN fieldsCombined USING (fieldID)"; + "FROM baseFieldMappingsCombined JOIN fieldsCombined USING (fieldID)";
var rows = yield Zotero.DB.queryAsync(sql); var rows = yield Zotero.DB.queryAsync(sql);
for each(var row in rows) { for (let i = 0; i < rows.length; i++) {
let row = rows[i];
// Type fields by base
if (!_typeFieldIDsByBase[row['baseFieldID']]) { if (!_typeFieldIDsByBase[row['baseFieldID']]) {
_typeFieldIDsByBase[row['baseFieldID']] = []; _typeFieldIDsByBase[row['baseFieldID']] = [];
_typeFieldNamesByBase[row['baseFieldID']] = []; _typeFieldNamesByBase[row['baseFieldID']] = [];
} }
_typeFieldIDsByBase[row['baseFieldID']].push(row['fieldID']); _typeFieldIDsByBase[row['baseFieldID']].push(row['fieldID']);
_typeFieldNamesByBase[row['baseFieldID']].push(row['fieldName']); _typeFieldNamesByBase[row['baseFieldID']].push(row['fieldName']);
// Base fields by type and field
if (!_baseFieldIDsByTypeAndField[row.itemTypeID]) {
_baseFieldIDsByTypeAndField[row.itemTypeID] = {};
}
_baseFieldIDsByTypeAndField[row.itemTypeID][row.fieldID] = row.baseFieldID;
} }
// Get all fields mapped to base types // Get all fields mapped to base types

View file

@ -0,0 +1,34 @@
"use strict";
describe("Zotero.ItemFields", function () {
describe("#getBaseIDFromTypeAndField()", function () {
it("should return the base field id for an item type and base-mapped field", function* () {
assert.equal(
Zotero.ItemFields.getBaseIDFromTypeAndField('audioRecording', 'label'),
Zotero.ItemFields.getID('publisher')
);
// Accept ids too
assert.equal(
Zotero.ItemFields.getBaseIDFromTypeAndField(
Zotero.ItemTypes.getID('audioRecording'),
Zotero.ItemFields.getID('label')
),
Zotero.ItemFields.getID('publisher')
);
})
it("should return the base field id for an item type and base field", function* () {
assert.equal(
Zotero.ItemFields.getBaseIDFromTypeAndField('book', 'publisher'),
Zotero.ItemFields.getID('publisher')
);
})
it("should return false for an item type and non-base-mapped field", function* () {
assert.isFalse(
Zotero.ItemFields.getBaseIDFromTypeAndField('audioRecording', 'runningTime')
);
})
})
})