Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 1x 1x 1x 1x | const _ = require('lodash')
const { getDataTypeFromValue } = require('../helpers')
const chalk = require('chalk')
function logWarnings (geojson, format) {
const { metadata = {}, features } = geojson
const esriFormat = format !== geojson
if (esriFormat && !metadata.idField) {
console.warn(chalk.yellow('WARNING: requested provider has no "idField" assignment. You will get the most reliable behavior from ArcGIS clients if the provider assigns the "idField" to a property that is an unchanging 32-bit integer. Koop will create an OBJECTID field in the absence of an "idField" assignment.'))
}
if (esriFormat && hasMixedCaseObjectIdKey(metadata.idField)) {
console.warn(chalk.yellow('WARNING: requested provider\'s "idField" is a mixed-case version of "OBJECTID". This can cause errors in ArcGIS clients.'))
}
// Compare provider metadata fields to feature properties
// TODO: refactor
if (metadata.fields && _.has(features, '[0].properties')) {
warnOnMetadataFieldDiscrepancies(geojson.metadata.fields, geojson.features[0].properties)
}
}
function hasMixedCaseObjectIdKey (idField = '') {
return idField.toLowerCase() === 'objectid' && idField !== 'OBJECTID'
}
/**
* Compare fields generated from metadata to properties of a data feature.
* Warn if differences discovered
* @param {*} metadataFields
* @param {*} properties
*/
function warnOnMetadataFieldDiscrepancies (metadataFields, featureProperties) {
// build a comparison collection from the data samples properties
const featureFields = Object.keys(featureProperties).map(name => {
return {
name,
type: getDataTypeFromValue(featureProperties[name])
}
})
// compare metadata to feature properties; identifies fields defined in metadata that are not found in feature properties
// or that have a metadata type definition inconsistent with feature property's value
metadataFields.forEach(field => {
// look for a defined field in the features properties
const featureField = _.find(featureFields, ['name', field.name]) || _.find(featureFields, ['name', field.alias])
if (!featureField || (field.type !== featureField.type && !(field.type === 'Date' && featureField.type === 'Integer') && !(field.type === 'Double' && featureField.type === 'Integer'))) {
console.warn(chalk.yellow(`WARNING: requested provider's metadata field "${field.name} (${field.type})" not found in feature properties)`))
}
})
// compare feature properties to metadata fields; identifies fields found on feature that are not defined in metadata field array
featureFields.forEach(field => {
const noNameMatch = _.find(metadataFields, ['name', field.name])
const noAliasMatch = _.find(metadataFields, ['alias', field.name])
// Exclude warnings on feature fields named OBJECTID because OBJECTID may have been added by winnow in which case it should not be in the metadata fields array
if (!(noNameMatch || noAliasMatch) && field.name !== 'OBJECTID') {
console.warn(chalk.yellow(`WARNING: requested provider's features have property "${field.name} (${field.type})" that was not defined in metadata fields array)`))
}
})
}
module.exports = { logWarnings }
|