[Groonga-commit] groonga/gcs [master] Support uint and literal fields by the IndexDocuments action

Back to archive index

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


SHIMODA Hiroshi	2012-07-09 18:17:53 +0900 (Mon, 09 Jul 2012)

  New Revision: 9192a91be5828f4200286416d7740725fc89dd85
  https://github.com/groonga/gcs/commit/9192a91be5828f4200286416d7740725fc89dd85

  Log:
    Support uint and literal fields by the IndexDocuments action

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

  Modified: lib/api/2011-02-01/configuration.js (+43 -11)
===================================================================
--- lib/api/2011-02-01/configuration.js    2012-07-09 18:03:42 +0900 (6688aea)
+++ lib/api/2011-02-01/configuration.js    2012-07-09 18:17:53 +0900 (08c8e8e)
@@ -315,17 +315,49 @@ handlers.IndexDocuments = function(database, request, response) {
                  });
   try {
     indexColumns.forEach(function(column) {
-      database.commandSync('column_remove', {
-        table: domain.termsTableName,
-        name: column.name
-      });
-      database.commandSync('column_create', {
-        table: domain.termsTableName,
-        name: column.name,
-        flags: Database.INDEX_COLUMN_DEFAULT_FLAGS,
-        type: column.range,
-        source: column.source[0].replace(column.range + '.', '')
-      });
+      // FieldNames must be field names, not column names.
+      // However, original field names are completely lost after
+      // they are created via the API...
+      var fieldName = column.source[0].replace(column.range + '.', '');
+      var field = domain.getIndexField(fieldName);
+
+      var alterTableName = domain.termsTableName;
+      var fieldType = field.columnTypeToFieldType(column.type);
+
+      if (column.type == field.fieldTypeToColumnType('uint') ||
+          column.type == field.fieldTypeToColumnType('literal')) {
+        database.commandSync('column_remove', {
+          table: field.alterTableName,
+          name: field.indexColumnName
+        });
+        database.commandSync('table_remove', {
+          name: field.alterTableName
+        });
+        database.commandSync('table_create', {
+          name: field.alterTableName,
+          flags: Database.TABLE_HASH_KEY,
+          key_type: field.fieldTypeToAlterTableKeyType(fieldType)
+        });
+        database.commandSync('column_create', {
+          table: field.alterTableName,
+          name: field.indexColumnName,
+          flags: Database.INDEX_COLUMN_DEFAULT_FLAGS,
+          type: domain.tableName,
+          source: field.columnName
+        });
+      } else {
+        database.commandSync('column_remove', {
+          table: domain.termsTableName,
+          name: field.indexColumnName
+        });
+        database.commandSync('column_create', {
+          table: domain.termsTableName,
+          name: field.indexColumnName,
+          flags: Database.INDEX_COLUMN_DEFAULT_FLAGS,
+          type: column.range,
+          source: field.columnName
+        });
+      }
     });
     response.contentType('application/xml');
     response.send(createIndexDocumentsResponse({

  Modified: lib/domain.js (+12 -0)
===================================================================
--- lib/domain.js    2012-07-09 18:03:42 +0900 (8e9a1b6)
+++ lib/domain.js    2012-07-09 18:17:53 +0900 (adc3a64)
@@ -168,6 +168,18 @@ IndexField.prototype = {
         throw new Error('Unsupported index field type '+fieldType);
     }
   },
+  columnTypeToFieldType: function(columnType) {
+    switch (columnType) {
+      case Database.ShortText:
+        return 'text';
+      case Database.UInt32:
+        return 'uint';
+      case this.alterTableName:
+        return 'literal';
+      default:
+        throw new Error('Unsupported column type '+columnType);
+    }
+  },
   fieldTypeToAlterTableKeyType: function(fieldType) {
     switch (fieldType) {
       case 'uint':
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
下载 



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