Browse Source

HUE-7017 [importer] Add JDBC option in both custom and config modes

Prachi Poddar 8 years ago
parent
commit
f30e9f7

+ 2 - 2
desktop/core/src/desktop/static/desktop/js/assist/assistDbSource.js

@@ -304,11 +304,11 @@ var AssistDbSource = (function () {
     };
     };
 
 
     huePubSub.subscribe('assist.db.refresh', function (options) {
     huePubSub.subscribe('assist.db.refresh', function (options) {
-      if (options.sourceTypes.indexOf(self.sourceType) !== -1) {
+    //  if (['hive', 'impala'].indexOf(self.sourceType) !== -1) { // options.sourceTypes.
         window.setTimeout(function () {
         window.setTimeout(function () {
           self.reload(options.allCacheTypes);
           self.reload(options.allCacheTypes);
         }, 0);
         }, 0);
-      }
+    //  }
     });
     });
   }
   }
 
 

+ 1 - 1
desktop/libs/indexer/src/indexer/api3.py

@@ -152,7 +152,7 @@ def guess_field_types(request):
   elif file_format['inputFormat'] == 'rdbms':
   elif file_format['inputFormat'] == 'rdbms':
     query_server = rdbms.get_query_server_config(server=file_format['rdbmsType'])
     query_server = rdbms.get_query_server_config(server=file_format['rdbmsType'])
     db = rdbms.get(request.user, query_server=query_server)
     db = rdbms.get(request.user, query_server=query_server)
-    sample = RdbmsIndexer(request.user, file_format['rdbmsType']).get_sample_data(database=file_format['rdbmsDatabaseName'], table=file_format['rdbmsTableName'])
+    sample = RdbmsIndexer(request.user, file_format['rdbmsType']).get_sample_data(mode=file_format['rdbmsMode'], database=file_format['rdbmsDatabaseName'], table=file_format['rdbmsTableName'])
     table_metadata = db.get_columns(file_format['rdbmsDatabaseName'], file_format['rdbmsTableName'], names_only=False)
     table_metadata = db.get_columns(file_format['rdbmsDatabaseName'], file_format['rdbmsTableName'], names_only=False)
 
 
     format_ = {
     format_ = {

+ 79 - 41
desktop/libs/indexer/src/indexer/indexers/rdbms.py

@@ -24,9 +24,11 @@ from django.core.urlresolvers import reverse
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from desktop.lib.django_util import JsonResponse
 from desktop.lib.django_util import JsonResponse
-from desktop.lib.i18n import smart_str
-from librdbms.server import dbms as rdbms
 from librdbms.conf import DATABASES, get_database_password, get_server_choices
 from librdbms.conf import DATABASES, get_database_password, get_server_choices
+from librdbms.jdbc import Jdbc
+from librdbms.server import dbms as rdbms
+from notebook.conf import get_ordered_interpreters
+from notebook.connectors.jdbc import Assist as JdbcAssist
 from notebook.connectors.rdbms import Assist
 from notebook.connectors.rdbms import Assist
 from notebook.models import make_notebook
 from notebook.models import make_notebook
 
 
@@ -36,15 +38,26 @@ LOG = logging.getLogger(__name__)
 
 
 def get_db_component(request):
 def get_db_component(request):
   format_ = {'data': [], 'status': 1, 'message': ''}
   format_ = {'data': [], 'status': 1, 'message': ''}
-  name = None
+  db = None
   try:
   try:
     source = json.loads(request.POST.get('source', '{}'))
     source = json.loads(request.POST.get('source', '{}'))
     user = User.objects.get(username=request.user)
     user = User.objects.get(username=request.user)
     if source['rdbmsMode'] == 'configRdbms':
     if source['rdbmsMode'] == 'configRdbms':
-      query_server = rdbms.get_query_server_config(server=source['rdbmsType'])
+      if source['rdbmsType'] != 'jdbc':
+        query_server = rdbms.get_query_server_config(server=source['rdbmsType'])
+        db = rdbms.get(user, query_server=query_server)
+      else:
+        interpreters = get_ordered_interpreters(request.user)
+        options = {}
+        name = None
+        key = [key for key in interpreters if key['name'] == source['rdbmsJdbcDriverName']]
+        if key:
+          options = key[0]['options']
+
+          db = Jdbc(driver_name=options['driver'], url=options['url'], username=options['user'], password=options['password'])
     else:
     else:
       name = source['rdbmsType']
       name = source['rdbmsType']
-      if name:
+      if name != 'jdbc':
         query_server = {
         query_server = {
           'server_name': name,
           'server_name': name,
           'server_host': source['rdbmsHostname'],
           'server_host': source['rdbmsHostname'],
@@ -54,19 +67,32 @@ def get_db_component(request):
           'options': {},
           'options': {},
           'alias': name
           'alias': name
         }
         }
+        db = rdbms.get(user, query_server=query_server)
+      else:
+        db = Jdbc(driver_name=source['rdbmsJdbcDriver'], url=source['rdbmsHostname'], username=source['rdbmsUsername'], password=source['rdbmsPassword'])
 
 
-    db = rdbms.get(user, query_server=query_server)
-    assist = Assist(db)
+    if source['rdbmsType'] != 'jdbc':
+      assist = Assist(db)
+    else:
+      assist = JdbcAssist(db)
     if not source['rdbmsDatabaseName']:
     if not source['rdbmsDatabaseName']:
       data = assist.get_databases()
       data = assist.get_databases()
-    else:
+    elif source['rdbmsDatabaseName']:
       data = assist.get_tables(source['rdbmsDatabaseName'])
       data = assist.get_tables(source['rdbmsDatabaseName'])
-    format_['data'] = [{'name': element, 'value': element} for element in data]
+      format_['data'] = [{'name': element, 'value': element} for element in data]
     format_['status'] = 0
     format_['status'] = 0
   except Exception, e:
   except Exception, e:
-    message = 'Error accessing the database %s' % name
-    LOG.warn(message, e)
-    format['message'] = _(message)
+    message = _('Error accessing the database %s: %s') % (name, e)
+    LOG.warn(message)
+    format['message'] = message
+
+  return JsonResponse(format_)
+
+def jdbc_db_list(request):
+  format_ = {'data': [], 'status': 1}
+  interpreters = get_ordered_interpreters(request.user)
+  format_['data'] = [{'value': key['name'], 'name': key['name']} for key in interpreters if key['interface'] == 'jdbc']
+  format_['status'] = 0
 
 
   return JsonResponse(format_)
   return JsonResponse(format_)
 
 
@@ -80,9 +106,8 @@ def get_drivers(request):
   return JsonResponse(format_)
   return JsonResponse(format_)
 
 
 def run_sqoop(request, source, destination, start_time):
 def run_sqoop(request, source, destination, start_time):
-  password_file_path = request.fs.get_home_dir() + '/sqoop/'
   rdbms_mode = source['rdbmsMode']
   rdbms_mode = source['rdbmsMode']
-  rdbms_name = source['rdbmsType']
+  rdbms_name = source['rdbmsJdbcDriverName'] if source['rdbmsType'] == 'jdbc' else source['rdbmsType']
   rdbms_database_name = source['rdbmsDatabaseName']
   rdbms_database_name = source['rdbmsDatabaseName']
   rdbms_all_tables_selected = source['rdbmsAllTablesSelected']
   rdbms_all_tables_selected = source['rdbmsAllTablesSelected']
   destination_type = destination['outputFormat']
   destination_type = destination['outputFormat']
@@ -94,32 +119,42 @@ def run_sqoop(request, source, destination, start_time):
   if not rdbms_all_tables_selected:
   if not rdbms_all_tables_selected:
     rdbms_table_name = source['rdbmsTableName']
     rdbms_table_name = source['rdbmsTableName']
 
 
-  if rdbms_mode == 'configRdbms':
-    rdbms_host = DATABASES[rdbms_name].HOST.get()
-    rdbms_port = DATABASES[rdbms_name].PORT.get()
-    rdbms_user_name = DATABASES[rdbms_name].USER.get()
-    rdbms_password = get_database_password(rdbms_name)
+  if rdbms_mode == 'configRdbms' and rdbms_name == 'jdbc':
+    username = ''
+    password = ''
+    url = ''
+    interpreters = get_ordered_interpreters(request.user)
+    key = [key for key in interpreters if key['name'] == source['rdbmsJdbcDriverName']]
+    if key:
+      options = key[0]['options']
+      url = options['url']
+      password = options['password']
+      username = options['user']
+    statement = '--connect %(url)s --username %(username)s --password %(password)s' % {
+      'url': url,
+      'username': username,
+      'password': password
+    }
   else:
   else:
-    rdbms_host = source['rdbmsHostname']
-    rdbms_port = source['rdbmsPort']
-    rdbms_user_name = source['rdbmsUsername']
-    rdbms_password = source['rdbmsPassword']
-
-  password_file_path = request.fs.join(request.fs.get_home_dir() + '/sqoop/', uuid.uuid4().hex + '.password')
-  request.fs.do_as_user(request.user, request.fs.create, password_file_path, overwrite=True, permission=0700, data=smart_str(rdbms_password))
-
-  lib_files = []
-  if destination['sqoopJobLibPaths']:
-    lib_files = [{'path': f['path'], 'type': 'jar'} for f in destination['sqoopJobLibPaths']]
-
-  statement = '--connect jdbc:%(rdbmsName)s://%(rdbmsHost)s:%(rdbmsPort)s/%(rdbmsDatabaseName)s --username %(rdbmsUserName)s --password-file %(passwordFilePath)s' % {
-    'rdbmsName': rdbms_name,
-    'rdbmsHost': rdbms_host,
-    'rdbmsPort': rdbms_port,
-    'rdbmsDatabaseName': rdbms_database_name,
-    'rdbmsUserName': rdbms_user_name,
-    'passwordFilePath': password_file_path
-  }
+    if rdbms_mode == 'configRdbms':
+      rdbms_host = DATABASES[rdbms_name].HOST.get()
+      rdbms_port = DATABASES[rdbms_name].PORT.get()
+      rdbms_user_name = DATABASES[rdbms_name].USER.get()
+      rdbms_password = get_database_password(rdbms_name)
+    else:
+      rdbms_host = source['rdbmsHostname']
+      rdbms_port = source['rdbmsPort']
+      rdbms_user_name = source['rdbmsUsername']
+      rdbms_password = source['rdbmsPassword']
+
+    statement = '--connect jdbc:%(rdbmsName)s://%(rdbmsHost)s:%(rdbmsPort)s/%(rdbmsDatabaseName)s --username %(rdbmsUserName)s --password %(rdbmsPassword)s' % {
+      'rdbmsName': rdbms_name,
+      'rdbmsHost': rdbms_host,
+      'rdbmsPort': rdbms_port,
+      'rdbmsDatabaseName': rdbms_database_name,
+      'rdbmsUserName': rdbms_user_name,
+      'rdbmsPassword': rdbms_password
+    }
   if destination_type == 'file':
   if destination_type == 'file':
     success_url = '/filebrowser/view/' + destination_name
     success_url = '/filebrowser/view/' + destination_name
     targetDir = request.fs.fs_defaultfs + destination_name
     targetDir = request.fs.fs_defaultfs + destination_name
@@ -180,11 +215,14 @@ class RdbmsIndexer():
   def guess_format(self):
   def guess_format(self):
     return {"type": "csv"}
     return {"type": "csv"}
 
 
-  def get_sample_data(self, database=None, table=None, column=None):
+  def get_sample_data(self, mode=None, database=None, table=None, column=None):
     query_server = rdbms.get_query_server_config(server=self.db_conf_name)
     query_server = rdbms.get_query_server_config(server=self.db_conf_name)
     db = rdbms.get(self.user, query_server=query_server)
     db = rdbms.get(self.user, query_server=query_server)
 
 
-    assist = Assist(db)
+    if mode == 'configRdbms':
+      assist = Assist(db)
+    else:
+      assist = JdbcAssist(db)
     response = {'status': -1}
     response = {'status': -1}
     sample_data = assist.get_sample_data(database, table, column)
     sample_data = assist.get_sample_data(database, table, column)
 
 

+ 51 - 9
desktop/libs/indexer/src/indexer/templates/importer.mako

@@ -250,18 +250,27 @@ ${ assist.assistPanel() }
             <!-- /ko -->
             <!-- /ko -->
 
 
             <!-- ko if: createWizard.source.rdbmsMode() == 'customRdbms' -->
             <!-- ko if: createWizard.source.rdbmsMode() == 'customRdbms' -->
-              <div class="control-group">
+              <div class="control-group input-append">
                 <label for="rdbmsHostname" class="control-label"><div>${ _('Hostname') }</div>
                 <label for="rdbmsHostname" class="control-label"><div>${ _('Hostname') }</div>
                   <input type="text" class="input-xxlarge" data-bind="value: createWizard.source.rdbmsHostname" placeholder="${ _('Enter host/ip here eg. mysql.domain.com or 123.123.123.123') }">
                   <input type="text" class="input-xxlarge" data-bind="value: createWizard.source.rdbmsHostname" placeholder="${ _('Enter host/ip here eg. mysql.domain.com or 123.123.123.123') }">
                 </label>
                 </label>
               </div>
               </div>
 
 
+              <!-- ko if: createWizard.source.rdbmsType() == 'jdbc' -->
+              <div class="control-group input-append">
+                <label for="rdbmsJdbcDriver" class="control-label"><div>${ _('JDBC Driver') }</div>
+                  <input type="text" class="input-xxlarge" data-bind="value: createWizard.source.rdbmsJdbcDriver">
+                </label>
+              </div>
+              <!-- /ko -->
+
+              <!-- ko if: createWizard.source.rdbmsType() != 'jdbc' -->
               <div class="control-group">
               <div class="control-group">
                 <label for="rdbmsPort" class="control-label"><div>${ _('Port') }</div>
                 <label for="rdbmsPort" class="control-label"><div>${ _('Port') }</div>
                   <input type="text" class="input-xxlarge" data-bind="value: createWizard.source.rdbmsPort" placeholder="${ _('Enter port number here eg. 3306') }">
                   <input type="text" class="input-xxlarge" data-bind="value: createWizard.source.rdbmsPort" placeholder="${ _('Enter port number here eg. 3306') }">
                 </label>
                 </label>
               </div>
               </div>
-
+              <!-- /ko -->
               <div class="control-group">
               <div class="control-group">
                 <label for="rdbmsUsername" class="control-label"><div>${ _('Username') }</div>
                 <label for="rdbmsUsername" class="control-label"><div>${ _('Username') }</div>
                   <input type="text" class="input-xxlarge" data-bind="value: createWizard.source.rdbmsUsername" placeholder="${ _('Enter username here') }">
                   <input type="text" class="input-xxlarge" data-bind="value: createWizard.source.rdbmsUsername" placeholder="${ _('Enter username here') }">
@@ -274,18 +283,25 @@ ${ assist.assistPanel() }
                 </label>
                 </label>
               </div>
               </div>
 
 
+
               <div class="control-group">
               <div class="control-group">
-                <label class="control-label"><div></div>
-                  <button class="btn" data-bind="enable: $root.createWizard.source.rdbmsHostname().length > 0 && $root.createWizard.source.rdbmsPort().length > 0 && $root.createWizard.source.rdbmsUsername().length > 0, click: createWizard.source.rdbmsCheckConnection">
-                    ${_('Test Connection')}
-                  </button>
-                </label>
+                <button class="btn" data-bind="click: createWizard.source.rdbmsCheckConnection">
+                  ${_('Test Connection')}
+                </button>
               </div>
               </div>
             <!-- /ko -->
             <!-- /ko -->
 
 
             <!-- ko if: createWizard.source.rdbmsMode() == 'configRdbms' || (createWizard.source.rdbmsMode() == 'customRdbms' && createWizard.source.rdbmsDbIsValid()) -->
             <!-- ko if: createWizard.source.rdbmsMode() == 'configRdbms' || (createWizard.source.rdbmsMode() == 'customRdbms' && createWizard.source.rdbmsDbIsValid()) -->
-              <!-- ko if: createWizard.source.rdbmsType -->
+              <!-- ko if: createWizard.source.rdbmsMode() == 'configRdbms' && createWizard.source.rdbmsType() == 'jdbc' -->
               <div class="control-group">
               <div class="control-group">
+                <label for="rdbmsJdbcDriverName" class="control-label"><div>${ _('Options') }</div>
+                  <select id="rdbmsJdbcDriverName" data-bind="selectize: createWizard.source.rdbmsJdbcDriverNames, value: createWizard.source.rdbmsJdbcDriverName, optionsText: 'name', optionsValue: 'value'"></select>
+                </label>
+              </div>
+              <!-- /ko -->
+
+              <!-- ko if: createWizard.source.rdbmsTypes -->
+              <div class="control-group input-append">
                 <label for="rdbmsDatabaseName" class="control-label"><div>${ _('Database Name') }</div>
                 <label for="rdbmsDatabaseName" class="control-label"><div>${ _('Database Name') }</div>
                   <select id="rdbmsDatabaseName" data-bind="selectize: createWizard.source.rdbmsDatabaseNames, value: createWizard.source.rdbmsDatabaseName, optionsText: 'name', optionsValue: 'value'"></select>
                   <select id="rdbmsDatabaseName" data-bind="selectize: createWizard.source.rdbmsDatabaseNames, value: createWizard.source.rdbmsDatabaseName, optionsText: 'name', optionsValue: 'value'"></select>
                 </label>
                 </label>
@@ -1227,6 +1243,8 @@ ${ assist.assistPanel() }
         self.rdbmsTableName('');
         self.rdbmsTableName('');
         self.rdbmsIsAllTables(false);
         self.rdbmsIsAllTables(false);
         self.rdbmsAllTablesSelected(false);
         self.rdbmsAllTablesSelected(false);
+        self.rdbmsJdbcDriver('')
+        self.rdbmsJdbcDriverName('')
         self.rdbmsHostname('');
         self.rdbmsHostname('');
         self.rdbmsPort('');
         self.rdbmsPort('');
         self.rdbmsUsername('');
         self.rdbmsUsername('');
@@ -1260,7 +1278,7 @@ ${ assist.assistPanel() }
       self.rdbmsType.subscribe(function (val) {
       self.rdbmsType.subscribe(function (val) {
         self.path('');
         self.path('');
         resizeElements();
         resizeElements();
-        if (self.rdbmsMode() == 'configRdbms' && self.rdbmsType()) {
+        if(self.rdbmsMode() == 'configRdbms' && val != 'jdbc') {
           $.post("${ url('indexer:get_db_component') }", {
           $.post("${ url('indexer:get_db_component') }", {
             "source": ko.mapping.toJSON(self)
             "source": ko.mapping.toJSON(self)
           }, function (resp) {
           }, function (resp) {
@@ -1268,6 +1286,14 @@ ${ assist.assistPanel() }
               self.rdbmsDatabaseNames(resp.data);
               self.rdbmsDatabaseNames(resp.data);
             }
             }
           });
           });
+        } else if(self.rdbmsMode() == 'configRdbms' && val == 'jdbc') {
+          $.post("${ url('indexer:jdbc_db_list') }", {
+            "source": ko.mapping.toJSON(self)
+          }, function (resp) {
+            if (resp.data) {
+              self.rdbmsJdbcDriverNames(resp.data);
+            }
+          });
         }
         }
       });
       });
       self.rdbmsDatabaseName = ko.observable('');
       self.rdbmsDatabaseName = ko.observable('');
@@ -1290,6 +1316,22 @@ ${ assist.assistPanel() }
           wizard.destination.name(val.replace(/ /g, '_').toLowerCase());
           wizard.destination.name(val.replace(/ /g, '_').toLowerCase());
         }
         }
       });
       });
+      self.rdbmsJdbcDriverNames = ko.observableArray();
+      self.rdbmsJdbcDriverName = ko.observable();
+      self.rdbmsJdbcDriverName.subscribe(function (val) {
+        self.rdbmsDatabaseNames([]);
+        $.post("${ url('indexer:get_db_component') }", {
+          "source": ko.mapping.toJSON(self)
+        }, function (resp) {
+          if (resp.data) {
+            self.rdbmsDatabaseNames(resp.data);
+          }
+        });
+      });
+      self.rdbmsJdbcDriver = ko.observable('');
+      self.rdbmsJdbcDriver.subscribe(function (val) {
+        self.rdbmsDatabaseNames([]);
+      });
       self.rdbmsTableNames = ko.observableArray();
       self.rdbmsTableNames = ko.observableArray();
       self.rdbmsHostname = ko.observable('');
       self.rdbmsHostname = ko.observable('');
       self.rdbmsHostname.subscribe(function (val) {
       self.rdbmsHostname.subscribe(function (val) {

+ 2 - 1
desktop/libs/indexer/src/indexer/urls.py

@@ -61,7 +61,8 @@ urlpatterns += patterns('indexer.api3',
 
 
 urlpatterns += patterns('indexer.indexers.rdbms',
 urlpatterns += patterns('indexer.indexers.rdbms',
   url(r'^api/indexer/indexers/get_db_component/$', 'get_db_component', name='get_db_component'),
   url(r'^api/indexer/indexers/get_db_component/$', 'get_db_component', name='get_db_component'),
-  url(r'^api/indexer/indexers/get_drivers/$', 'get_drivers', name='get_drivers')
+  url(r'^api/indexer/indexers/get_drivers/$', 'get_drivers', name='get_drivers'),
+  url(r'^api/indexer/indexers/jdbc_db_list/$', 'jdbc_db_list', name='jdbc_db_list')
 )
 )
 
 
 
 

+ 1 - 1
desktop/libs/notebook/src/notebook/connectors/base.py

@@ -265,7 +265,7 @@ def get_api(request, snippet):
     return RdbmsApi(request.user, interpreter=snippet['type'])
     return RdbmsApi(request.user, interpreter=snippet['type'])
   elif interface == 'dataeng':
   elif interface == 'dataeng':
     return DataEngApi(user=request.user, request=request, cluster_name=cluster.get_interface())
     return DataEngApi(user=request.user, request=request, cluster_name=cluster.get_interface())
-  elif interface == 'jdbc':
+  elif interface == 'jdbc' or interface == 'teradata':
     return JdbcApi(request.user, interpreter=interpreter)
     return JdbcApi(request.user, interpreter=interpreter)
   elif interface == 'solr':
   elif interface == 'solr':
     return SolrApi(request.user, interpreter=interpreter)
     return SolrApi(request.user, interpreter=interpreter)

+ 16 - 6
desktop/libs/notebook/src/notebook/connectors/jdbc.py

@@ -141,6 +141,7 @@ class JdbcApi(Api):
       response['databases'] = assist.get_databases()
       response['databases'] = assist.get_databases()
     elif table is None:
     elif table is None:
       response['tables'] = assist.get_tables(database)
       response['tables'] = assist.get_tables(database)
+      response['tables_meta'] = response['tables']
     else:
     else:
       columns = assist.get_columns(database, table)
       columns = assist.get_columns(database, table)
       response['columns'] = [col[0] for col in columns]
       response['columns'] = [col[0] for col in columns]
@@ -183,17 +184,26 @@ class Assist():
     self.db = db
     self.db = db
 
 
   def get_databases(self):
   def get_databases(self):
-    databases, description = query_and_fetch(self.db, 'SHOW DATABASES')
-    return databases
+    dbs, description = query_and_fetch(self.db, 'SELECT DatabaseName FROM DBC.Databases')
+    return [db[0] and db[0].strip() for db in dbs]
 
 
   def get_tables(self, database, table_names=[]):
   def get_tables(self, database, table_names=[]):
-    tables, description = query_and_fetch(self.db, 'SHOW TABLES')
-    return tables
+    tables, description = query_and_fetch(self.db, "SELECT * FROM dbc.tables WHERE tablekind = 'T' and databasename='%s'" % database)
+    return [{"comment": table[7] and table[7].strip(), "type": "Table", "name": table[1] and table[1].strip()} for table in tables]
 
 
   def get_columns(self, database, table):
   def get_columns(self, database, table):
-    columns, description = query_and_fetch(self.db, 'SHOW COLUMNS FROM %s.%s' % (database, table))
-    return columns
+    columns, description = query_and_fetch(self.db, "SELECT ColumnName, ColumnType, CommentString FROM DBC.Columns WHERE DatabaseName='%s' AND TableName='%s'" % (database, table))
+    return [[col[0] and col[0].strip(), self._type_converter(col[1]), '', '', col[2], ''] for col in columns]
 
 
   def get_sample_data(self, database, table, column=None):
   def get_sample_data(self, database, table, column=None):
     column = column or '*'
     column = column or '*'
     return query_and_fetch(self.db, 'SELECT %s FROM %s.%s' % (column, database, table))
     return query_and_fetch(self.db, 'SELECT %s FROM %s.%s' % (column, database, table))
+
+  def _type_converter(self, name):
+    return {
+        "I": "INT_TYPE",
+        "I2": "SMALLINT_TYPE",
+        "CF": "STRING_TYPE",
+        "CV": "CHAR_TYPE",
+        "DA": "DATE_TYPE",
+      }.get(name, 'STRING_TYPE')