YUKI Hiroshi
null+****@clear*****
Wed Nov 21 20:34:46 JST 2012
YUKI Hiroshi 2012-11-21 20:34:46 +0900 (Wed, 21 Nov 2012) New Revision: f5489e33a23972fa68399449c4859ab915c6da4b https://github.com/groonga/gcs/commit/f5489e33a23972fa68399449c4859ab915c6da4b Log: Don't output index field options if the field has no custom value Modified files: lib/api/2011-02-01/configuration.js lib/database/index-field.js Modified: lib/api/2011-02-01/configuration.js (+65 -35) =================================================================== --- lib/api/2011-02-01/configuration.js 2012-11-21 20:20:17 +0900 (5899b0f) +++ lib/api/2011-02-01/configuration.js 2012-11-21 20:34:46 +0900 (376fb4b) @@ -232,27 +232,54 @@ handlers.DescribeDomains = function(context, request, response, config) { }; function createIndexFieldOptionStatus(field) { + var hasOption = false; switch (field.type) { case 'text': var textOptions = xmlbuilder.create(); - textOptions.begin('TextOptions', { version: '1.0' }) - .element('DefaultValue').up() - .element('FacetEnabled').text(field.facetEnabled).up() - .element('ResultEnabled').text(field.resultEnabled); - return textOptions; + var textOptionsFragment = textOptions.begin('TextOptions', { version: '1.0' }); + if (field.hasDefaultValue) { + hasOption = true; + textOptionsFragment.element('DefaultValue').text(field.defaultValue); + } + if (field.hasFacetEnabled) { + hasOption = true; + textOptionsFragment.element('FacetEnabled').text(field.facetEnabled); + } + if (field.hasResultEnabled) { + hasOption = true; + textOptionsFragment.element('ResultEnabled').text(field.resultEnabled); + } + return hasOption ? textOptions : null; + case 'uint': var uintOptions = xmlbuilder.create(); - uintOptions.begin('UIntOptions', { version: '1.0' }) - .element('DefaultValue').text(field.defaultValue); - return uintOptions; + var uintOptionsFragment = uintOptions.begin('UIntOptions', { version: '1.0' }); + if (field.hasDefaultValue) { + hasOption = true; + uintOptionsFragment.element('DefaultValue').text(field.defaultValue); + } + return hasOption ? uintOptions : null; + case 'literal': var literalOptions = xmlbuilder.create(); - literalOptions.begin('LiteralOptions', { version: '1.0' }) - .element('DefaultValue').up() - .element('FacetEnabled').text(field.facetEnabled).up() - .element('ResultEnabled').text(field.resultEnabled).up() - .element('SearchEnabled').text(field.searchEnabled); - return literalOptions; + var literalOptionsFragment = literalOptions.begin('LiteralOptions', { version: '1.0' }); + if (field.hasDefaultValue) { + hasOption = true; + literalOptionsFragment.element('DefaultValue').text(field.defaultValue); + } + if (field.hasFacetEnabled) { + hasOption = true; + literalOptionsFragment.element('FacetEnabled').text(field.facetEnabled); + } + if (field.hasResultEnabled) { + hasOption = true; + literalOptionsFragment.element('ResultEnabled').text(field.resultEnabled); + } + if (field.hasSearchEnabled) { + hasOption = true; + literalOptionsFragment.element('SearchEnabled').text(field.searchEnabled); + } + return hasOption ? literalOptions : null; } } @@ -326,7 +353,21 @@ function getFieldOption(option, request, type) { return request.query[optionName]; } -function assertHaveNoMismatchedTypeOption(request, type) { +handlers.DefineIndexField = function(context, request, response, config) { + var domainName = request.query.DomainName || ''; + var domain = handleDomanValidationError(function() { + return new Domain(domainName, context).validate(); + }); + if (!domain || !domain.exists()) + throw new errors.ResourceNotFoundError('Domain not found: ' + domainName); + + var fieldName = request.query['IndexField.IndexFieldName'] || ''; + var fieldType = request.query['IndexField.IndexFieldType'] || ''; + var field = handleIndexFieldValidationError(function() { + return domain.getIndexField(fieldName).setType(fieldType).validate(); + }); + + var textOptions = Object.keys(request.query).filter(function(name) { return name.indexOf('IndexField.TextOptions.') == 0; }); @@ -337,29 +378,17 @@ function assertHaveNoMismatchedTypeOption(request, type) { return name.indexOf('IndexField.UIntOptions.') == 0; }); - if (type == 'text' && (literalOptions.length || uintOptions.length)) + if (fieldType == 'text' && (literalOptions.length || uintOptions.length)) throw new errors.FieldOptionConflictError('A text IndexField may only specify textOptions'); - if (type == 'literal' && (textOptions.length || uintOptions.length)) + if (fieldType == 'literal' && (textOptions.length || uintOptions.length)) throw new errors.FieldOptionConflictError('A literal IndexField may only specify literalOptions'); - if (type == 'uint' && (textOptions.length || literalOptions.length)) + if (fieldType == 'uint' && (textOptions.length || literalOptions.length)) throw new errors.FieldOptionConflictError('A uint IndexField may only specify uintOptions'); -} -handlers.DefineIndexField = function(context, request, response, config) { - var domainName = request.query.DomainName || ''; - var domain = handleDomanValidationError(function() { - return new Domain(domainName, context).validate(); - }); - if (!domain || !domain.exists()) - throw new errors.ResourceNotFoundError('Domain not found: ' + domainName); - - var fieldName = request.query['IndexField.IndexFieldName'] || ''; - var fieldType = request.query['IndexField.IndexFieldType'] || ''; - var field = handleIndexFieldValidationError(function() { - return domain.getIndexField(fieldName).setType(fieldType).validate(); - }); + var outputOptions = fieldType == 'text' ? textOptions : + fieldType == 'literal' ? literalOptions : + uintOptions; - assertHaveNoMismatchedTypeOption(request, fieldType); var facetEnabled = getFieldOption('FacetEnabled', request, fieldType); if (facetEnabled !== undefined) @@ -376,8 +405,9 @@ handlers.DefineIndexField = function(context, request, response, config) { field.saveSync(); var result = createIndexFieldStatus({ - field: field, - state: 'RequiresIndexDocuments' + field: field, + outputOptions: outputOptions, + state: 'RequiresIndexDocuments' }); response.contentType('application/xml'); response.send(createGenericResponse('DefineIndexField', result, request.id)); Modified: lib/database/index-field.js (+15 -0) =================================================================== --- lib/database/index-field.js 2012-11-21 20:20:17 +0900 (346a5a6) +++ lib/database/index-field.js 2012-11-21 20:34:46 +0900 (e393d9c) @@ -261,6 +261,12 @@ IndexField.prototype = { return 0; return null; }, + get hasDefaultValue() { + return this.domain.getConfiguration(this.defaultValueConfigurationKey) !== null; + }, + get defaultValueConfigurationKey() { + return 'column_' + this.name + '_option_default_value'; + }, get facetEnabled() { // uint fields cannot be drilldowned by groonga... @@ -285,6 +291,9 @@ IndexField.prototype = { this.facetEnabled = value; return this; }, + get hasFacetEnabled() { + return this.domain.getConfiguration(this.facetEnabledConfigurationKey) !== null; + }, get facetEnabledConfigurationKey() { return 'column_' + this.name + '_option_facet_enabled'; }, @@ -311,6 +320,9 @@ IndexField.prototype = { this.resultEnabled = value; return this; }, + get hasResultEnabled() { + return this.domain.getConfiguration(this.resultEnabledConfigurationKey) !== null; + }, get resultEnabledConfigurationKey() { return 'column_' + this.name + '_option_result_enabled'; }, @@ -338,6 +350,9 @@ IndexField.prototype = { this.searchEnabled = value; return this; }, + get hasSearchEnabled() { + return this.domain.getConfiguration(this.searchEnabledConfigurationKey) !== null; + }, get searchEnabledConfigurationKey() { return 'column_' + this.name + '_option_search_enabled'; }, -------------- next part -------------- HTML����������������������������... Download