[Groonga-commit] groonga/gcs [master] Implement IndexField#upgradeToMultipleValuesSync()

Zurück zum Archiv-Index

SHIMODA Hiroshi null+****@clear*****
Mon Aug 13 12:08:33 JST 2012


SHIMODA Hiroshi	2012-08-13 12:08:33 +0900 (Mon, 13 Aug 2012)

  New Revision: 3d28feb718f57e5dfae0631424fdec7edf31d06c
  https://github.com/groonga/gcs/commit/3d28feb718f57e5dfae0631424fdec7edf31d06c

  Log:
    Implement IndexField#upgradeToMultipleValuesSync()

  Modified files:
    lib/database/index-field.js
    test/database-index-field.test.js

  Modified: lib/database/index-field.js (+17 -2)
===================================================================
--- lib/database/index-field.js    2012-08-13 12:08:10 +0900 (e22de21)
+++ lib/database/index-field.js    2012-08-13 12:08:33 +0900 (bfb74cb)
@@ -168,7 +168,12 @@ IndexField.prototype = {
     return 'Active';
   },
 
-  createSync: function() {
+  get multipleValues() {
+    return !!this.column &&
+           this.column.flags.indexOf(nroonga.COLUMN_VECTOR) > -1;
+  },
+
+  createSync: function(multipleValues) {
     var indexTableName = this.domain.termsTableName;
 
     var type = this.type;
@@ -183,10 +188,12 @@ IndexField.prototype = {
       indexTableName = this.indexTableName;
     }
 
+    var columnFlags = multipleValues ?
+                        nroonga.COLUMN_VECTOR : nroonga.COLUMN_SCALAR;
     this.context.commandSync('column_create', {
       table: this.domain.tableName,
       name: this.columnName,
-      flags: nroonga.COLUMN_SCALAR,
+      flags: columnFlags,
       type: columnType
     });
     this.context.commandSync('column_create', {
@@ -249,6 +256,14 @@ IndexField.prototype = {
 
   exists: function() {
     return !!this.column;
+  },
+
+  upgradeToMultipleValuesSync: function() {
+    if (this.multipleValues) return;
+    var values = this.domain.dump();
+    this.deleteSync();
+    this.createSync(true);
+    this.domain.load(values);
   }
 };
 

  Modified: test/database-index-field.test.js (+67 -0)
===================================================================
--- test/database-index-field.test.js    2012-08-13 12:08:10 +0900 (acaecc3)
+++ test/database-index-field.test.js    2012-08-13 12:08:33 +0900 (643df3d)
@@ -226,6 +226,7 @@ suite('database', function() {
 
         field.createSync();
         assert.isTrue(field.exists());
+        assert.isFalse(field.multipleValues);
 
         var dump = context.commandSync('dump', {
               tables: domain.tableName
@@ -268,6 +269,7 @@ suite('database', function() {
 
         field.createSync();
         assert.isTrue(field.exists());
+        assert.isFalse(field.multipleValues);
 
         var dump = context.commandSync('dump', {
               tables: domain.tableName
@@ -312,6 +314,7 @@ suite('database', function() {
 
         field.createSync();
         assert.isTrue(field.exists());
+        assert.isFalse(field.multipleValues);
 
         var dump = context.commandSync('dump', {
               tables: 'companies'
@@ -348,5 +351,69 @@ suite('database', function() {
         assert.equal(dump, expected);
       });
     });
+
+    suite('multiple values column', function() {
+      var temporaryDatabase;
+      var context;
+      var domain;
+
+      setup(function() {
+        temporaryDatabase = utils.createTemporaryDatabase();
+        context = temporaryDatabase.get();
+        domain = new Domain('companies', context);
+        domain.createSync();
+      });
+
+      teardown(function() {
+        temporaryDatabase.teardown();
+        temporaryDatabase = undefined;
+      });
+
+      test('createSync (multiple values)', function() {
+        var field = new IndexField('name', domain).setType('text');
+        assert.isFalse(field.exists());
+        field.createSync(true);
+        assert.isTrue(field.exists());
+        assert.isTrue(field.multipleValues);
+
+        var dump = context.commandSync('dump', {
+              tables: domain.tableName
+            });
+        var expected = 'table_create ' + domain.tableName +  ' ' +
+                         'TABLE_HASH_KEY ShortText\n' +
+                       'column_create ' + domain.tableName + ' ' +
+                         field.columnName + ' COLUMN_VECTOR ShortText\n' +
+                       'table_create ' + domain.termsTableName + ' ' +
+                         'TABLE_PAT_KEY|KEY_NORMALIZE ShortText ' +
+                         '--default_tokenizer TokenBigram\n' +
+                       'column_create ' + domain.termsTableName + ' ' +
+                         field.indexColumnName + ' ' +
+                         'COLUMN_INDEX|WITH_POSITION ' + domain.tableName +
+                         ' ' + field.columnName;
+        assert.equal(dump, expected);
+      });
+
+      test('upgradeToMultipleValuesSync', function() {
+        var field = new IndexField('product', domain).setType('literal');
+        field.createSync();
+        assert.isFalse(field.multipleValues);
+
+        field.domain.load([
+          { id: 'id1', product: 'groonga' },
+          { id: 'id2', product: 'nroonga' }
+        ]);
+
+        field.upgradeToMultipleValuesSync();
+        assert.isTrue(field.exists());
+        assert.isTrue(field.multipleValues);
+
+        var actualDump = field.domain.dump();
+        var expectedDump = [
+              { id: 'id1', product: ['groonga'] },
+              { id: 'id2', product: ['nroonga'] }
+            ];
+        assert.deepEqual(actualDump, expectedDump);
+      });
+    });
   });
 });
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Zurück zum Archiv-Index