Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set column name implicitly when column name is blank #2663

Merged
merged 1 commit into from Jul 29, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
40 changes: 25 additions & 15 deletions redash/query_runner/google_spreadsheets.py
Expand Up @@ -4,6 +4,7 @@

from dateutil import parser
from requests import Session
from xlsxwriter.utility import xl_col_to_name

from redash.query_runner import *
from redash.utils import json_dumps
Expand All @@ -25,6 +26,29 @@ def _load_key(filename):
return json.loads(f.read())


def _get_columns_and_column_names(row):
column_names = []
columns = []
duplicate_counter = 1

for i, column_name in enumerate(row):
if not column_name:
column_name = 'column_{}'.format(xl_col_to_name(i))

if column_name in column_names:
column_name = u"{}{}".format(column_name, duplicate_counter)
duplicate_counter += 1

column_names.append(column_name)
columns.append({
'name': column_name,
'friendly_name': column_name,
'type': TYPE_STRING
})

return columns, column_names


def _guess_type(value):
if value == '':
return TYPE_STRING
Expand Down Expand Up @@ -104,21 +128,7 @@ def parse_worksheet(worksheet):
if not worksheet:
return {'columns': [], 'rows': []}

column_names = []
columns = []
duplicate_counter = 1

for j, column_name in enumerate(worksheet[HEADER_INDEX]):
if column_name in column_names:
column_name = u"{}{}".format(column_name, duplicate_counter)
duplicate_counter += 1

column_names.append(column_name)
columns.append({
'name': column_name,
'friendly_name': column_name,
'type': TYPE_STRING
})
columns, column_names = _get_columns_and_column_names(worksheet[HEADER_INDEX])

if len(worksheet) > 1:
for j, value in enumerate(worksheet[HEADER_INDEX + 1]):
Expand Down
22 changes: 21 additions & 1 deletion tests/query_runner/test_google_spreadsheets.py
Expand Up @@ -5,7 +5,7 @@
from mock import MagicMock

from redash.query_runner import TYPE_DATETIME, TYPE_FLOAT, TYPE_INTEGER
from redash.query_runner.google_spreadsheets import TYPE_BOOLEAN, TYPE_STRING, _guess_type, _value_eval_list, parse_query
from redash.query_runner.google_spreadsheets import TYPE_BOOLEAN, TYPE_STRING, _get_columns_and_column_names, _guess_type, _value_eval_list, parse_query
from redash.query_runner.google_spreadsheets import WorksheetNotFoundError, parse_spreadsheet, parse_worksheet


Expand Down Expand Up @@ -106,3 +106,23 @@ class TestParseQuery(TestCase):
def test_parse_query(self):
parsed = parse_query('key|0')
self.assertEqual(('key', 0), parsed)


class TestGetColumnsAndColumnNames(TestCase):
def test_get_columns(self):
_columns = ['foo', 'bar', 'baz']
columns, column_names = _get_columns_and_column_names(_columns)

self.assertEqual(_columns, column_names)

def test_get_columns_with_duplicated(self):
_columns = ['foo', 'bar', 'baz', 'foo', 'baz']
columns, column_names = _get_columns_and_column_names(_columns)

self.assertEqual(['foo', 'bar', 'baz', 'foo1', 'baz2'], column_names)

def test_get_columns_with_blank(self):
_columns = ['foo', '', 'baz', '']
columns, column_names = _get_columns_and_column_names(_columns)

self.assertEqual(['foo', 'column_B', 'baz', 'column_D'], column_names)