[Groonga-commit] groonga/gcs [master] Support literal type index fields

Back to archive index

null+****@clear***** null+****@clear*****
2012年 7月 9日 (月) 18:45:58 JST


SHIMODA Hiroshi	2012-07-09 18:45:58 +0900 (Mon, 09 Jul 2012)

  New Revision: e9c5f20cae474f394c319ce6899733242d3b6c72
  https://github.com/groonga/gcs/commit/e9c5f20cae474f394c319ce6899733242d3b6c72

  Log:
    Support literal type index fields

  Modified files:
    lib/api/2011-02-01/configuration.js
    test/api-configuration.test.js

  Modified: lib/api/2011-02-01/configuration.js (+22 -12)
===================================================================
--- lib/api/2011-02-01/configuration.js    2012-07-09 18:17:53 +0900 (08c8e8e)
+++ lib/api/2011-02-01/configuration.js    2012-07-09 18:45:58 +0900 (dd061ff)
@@ -162,6 +162,16 @@ function createIndexFieldOptionStatus(options) {
       return '<UIntOptions>' +
                '<DefaultValue/>' +
              '</UIntOptions>';
+    case 'literal':
+      return '<LiteralOptions>' +
+               '<DefaultValue/>' +
+               '<FacetEnabled>' + (options.facetEnabled || false) +
+                 '</FacetEnabled>' +
+               '<ResultEnabled>' + (options.resultEnabled || false) +
+                 '</ResultEnabled>' +
+               '<SearchEnabled>' + (options.searchEnabled || false) +
+                 '</SearchEnabled>' +
+             '</LiteralOptions>';
   }
 }
 
@@ -207,14 +217,8 @@ handlers.DefineIndexField = function(database, request, response) {
   var createdAt = new Date();
   var alterTableName = domain.termsTableName;
   var columnType = field.fieldTypeToColumnType(fieldType);
+  var resultEnabled = fieldType != 'literal'; 
   try {
-    database.commandSync('column_create', {
-      table: domain.tableName,
-      name: field.columnName,
-      flags: Database.COLUMN_SCALAR,
-      type: columnType
-    });
-
     if (fieldType == 'uint' || fieldType == 'literal') {
       database.commandSync('table_create', {
         name: field.alterTableName,
@@ -224,6 +228,12 @@ handlers.DefineIndexField = function(database, request, response) {
       alterTableName = field.alterTableName;
     }
     database.commandSync('column_create', {
+      table: domain.tableName,
+      name: field.columnName,
+      flags: Database.COLUMN_SCALAR,
+      type: columnType
+    });
+    database.commandSync('column_create', {
       table: alterTableName,
       name: field.indexColumnName,
       flags: Database.INDEX_COLUMN_DEFAULT_FLAGS,
@@ -236,7 +246,7 @@ handlers.DefineIndexField = function(database, request, response) {
       fieldName: fieldName,
       fieldType: fieldType,
       facetEnabled: false,
-      resultEnabled: true,
+      resultEnabled: resultEnabled,
       state: 'RequiresIndexDocuments',
       createdAt: createdAt,
       updatedAt: createdAt
@@ -275,8 +285,8 @@ handlers.DeleteIndexField = function(database, request, response) {
       name: field.columnName
     });
 
-    if (column.type == field.fieldTypeToColumnType('uint') ||
-        column.type == field.fieldTypeToColumnType('literal')) {
+    if (column.range == field.fieldTypeToColumnType('uint') ||
+        column.range == field.fieldTypeToColumnType('literal')) {
       database.commandSync('table_remove', {
         name: field.alterTableName
       });
@@ -321,8 +331,8 @@ handlers.IndexDocuments = function(database, request, response) {
       var fieldName = column.source[0].replace(column.range + '.', '');
       var field = domain.getIndexField(fieldName);
 
-      var alterTableName = domain.termsTableName;
-      var fieldType = field.columnTypeToFieldType(column.type);
+      var fieldType = column.domain == domain.termsTableName ? 'text' :
+                      field.columnTypeToFieldType(column.type);
 
       if (column.type == field.fieldTypeToColumnType('uint') ||
           column.type == field.fieldTypeToColumnType('literal')) {

  Modified: test/api-configuration.test.js (+129 -0)
===================================================================
--- test/api-configuration.test.js    2012-07-09 18:17:53 +0900 (0b4d6a4)
+++ test/api-configuration.test.js    2012-07-09 18:45:58 +0900 (68b60c3)
@@ -270,6 +270,76 @@ suite('Configuration API', function() {
       });
   });
 
+  test('Get, Action=DefineIndexField (literal)', function(done) {
+    var path = '/?DomainName=companies&Action=CreateDomain&Version=2011-02-01';
+    utils.get(path, {
+                'Host': 'cloudsearch.localhost'
+              })
+      .next(function(response) {
+        var path = '/?DomainName=companies&IndexField.IndexFieldName=member&' +
+                   'IndexField.IndexFieldType=literal&' +
+                   'Action=DefineIndexField&Version=2011-02-01';
+        return utils.get(path);
+      })
+      .next(function(response) {
+        var expected = {
+              statusCode: 200,
+              body: '<?xml version="1.0"?>\n' +
+                    '<DefineIndexFieldResponse xmlns="' + XMLNS + '">' +
+                      '<DefineIndexFieldResult>' +
+                        '<IndexField>' +
+                          '<Options>' +
+                            '<IndexFieldName>member</IndexFieldName>' +
+                            '<IndexFieldType>literal</IndexFieldType>' +
+                            '<LiteralOptions>' +
+                              '<DefaultValue/>' +
+                              '<FacetEnabled>false</FacetEnabled>' +
+                              '<ResultEnabled>false</ResultEnabled>' +
+                              '<SearchEnabled>false</SearchEnabled>' +
+                            '</LiteralOptions>' +
+                          '</Options>' +
+                          '<Status>' +
+                            '<CreationDate>1970-01-01T00:00:00Z</CreationDate>' +
+                            '<State>RequiresIndexDocuments</State>' +
+                            '<UpdateDate>1970-01-01T00:00:00Z</UpdateDate>' +
+                            '<UpdateVersion>0</UpdateVersion>' +
+                          '</Status>' +
+                        '</IndexField>' +
+                      '</DefineIndexFieldResult>' +
+                      '<ResponseMetadata>' +
+                        '<RequestId></RequestId>' +
+                      '</ResponseMetadata>' +
+                    '</DefineIndexFieldResponse>'
+            };
+        var actual = {
+              statusCode: response.statusCode,
+              body: response.body
+                      .replace(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z/g,
+                               '1970-01-01T00:00:00Z')
+            };
+        assert.deepEqual(actual, expected);
+
+        var dump = database.commandSync('dump', {
+              tables: 'companies'
+            });
+        var expected = 'table_create companies TABLE_HASH_KEY ShortText\n' +
+                       'table_create companies_BigramTerms ' +
+                         'TABLE_PAT_KEY|KEY_NORMALIZE ShortText ' +
+                         '--default_tokenizer TokenBigram\n' +
+                       'table_create companies_member ' +
+                         'TABLE_HASH_KEY ShortText\n' +
+                       'column_create companies_member companies_member ' +
+                         'COLUMN_INDEX|WITH_POSITION companies member\n' +
+                       'column_create companies member COLUMN_SCALAR companies_member';
+        assert.equal(dump, expected);
+
+        done();
+      })
+      .error(function(error) {
+        done(error);
+      });
+  });
+
   test('Get, Action=DeleteIndexField (text)', function(done) {
     var path = '/?DomainName=companies&Action=CreateDomain&Version=2011-02-01';
     utils.get(path, {
@@ -368,6 +438,55 @@ suite('Configuration API', function() {
       });
   });
 
+  test('Get, Action=DeleteIndexField (literal)', function(done) {
+    var path = '/?DomainName=companies&Action=CreateDomain&Version=2011-02-01';
+    utils.get(path, {
+                'Host': 'cloudsearch.localhost'
+              })
+      .next(function(response) {
+        var path = '/?DomainName=companies&IndexField.IndexFieldName=member&' +
+                   'IndexField.IndexFieldType=literal&' +
+                   'Action=DefineIndexField&Version=2011-02-01';
+        return utils.get(path);
+      })
+      .next(function(response) {
+        var path = '/?DomainName=companies&IndexFieldName=member&' +
+                   'Action=DeleteIndexField&Version=2011-02-01';
+        return utils.get(path);
+      })
+      .next(function(response) {
+        var expected = {
+              statusCode: 200,
+              body: '<?xml version="1.0"?>\n' +
+                    '<DeleteIndexFieldResponse xmlns="' + XMLNS + '">' +
+                      '<DeleteIndexFieldResult/>' +
+                      '<ResponseMetadata>' +
+                        '<RequestId></RequestId>' +
+                      '</ResponseMetadata>' +
+                    '</DeleteIndexFieldResponse>'
+            };
+        var actual = {
+              statusCode: response.statusCode,
+              body: response.body
+            };
+        assert.deepEqual(actual, expected);
+
+        var dump = database.commandSync('dump', {
+              tables: 'companies'
+            });
+        var expected = 'table_create companies TABLE_HASH_KEY ShortText\n' +
+                       'table_create companies_BigramTerms ' +
+                         'TABLE_PAT_KEY|KEY_NORMALIZE ShortText ' +
+                         '--default_tokenizer TokenBigram';
+        assert.equal(dump, expected);
+
+        done();
+      })
+      .error(function(error) {
+        done(error);
+      });
+  });
+
   test('Get, Action=IndexDocuments', function(done) {
     var path = '/?DomainName=companies&Action=CreateDomain&Version=2011-02-01';
     utils.get(path, {
@@ -379,6 +498,12 @@ suite('Configuration API', function() {
         return utils.get(path);
       })
       .next(function(response) {
+        var path = '/?DomainName=companies&IndexField.IndexFieldName=age&' +
+                   'IndexField.IndexFieldType=uint&' +
+                   'Action=DefineIndexField&Version=2011-02-01';
+        return utils.get(path);
+      })
+      .next(function(response) {
         var path = '/?DomainName=companies&' +
                    'Action=IndexDocuments&Version=2011-02-01';
         return utils.get(path);
@@ -408,10 +533,14 @@ suite('Configuration API', function() {
               tables: 'companies'
             });
         var expected = 'table_create companies TABLE_HASH_KEY ShortText\n' +
+                       'column_create companies age COLUMN_SCALAR UInt32\n' +
                        'column_create companies name COLUMN_SCALAR ShortText\n' +
                        'table_create companies_BigramTerms ' +
                          'TABLE_PAT_KEY|KEY_NORMALIZE ShortText ' +
                          '--default_tokenizer TokenBigram\n' +
+                       'table_create companies_age TABLE_HASH_KEY UInt32\n' +
+                       'column_create companies_age companies_age ' +
+                         'COLUMN_INDEX|WITH_POSITION companies age\n' +
                        'column_create companies_BigramTerms companies_name ' +
                          'COLUMN_INDEX|WITH_POSITION companies name';
         assert.equal(dump, expected);
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
下载 



Groonga-commit メーリングリストの案内
Back to archive index