diff --git a/main/src/com/google/refine/grel/ControlFunctionRegistry.java b/main/src/com/google/refine/grel/ControlFunctionRegistry.java index 083f5e697..edb57e2f6 100644 --- a/main/src/com/google/refine/grel/ControlFunctionRegistry.java +++ b/main/src/com/google/refine/grel/ControlFunctionRegistry.java @@ -142,6 +142,7 @@ import com.google.refine.grel.controls.ForRange; import com.google.refine.grel.controls.If; import com.google.refine.grel.controls.IsBlank; import com.google.refine.grel.controls.IsError; +import com.google.refine.grel.controls.IsEmptyString; import com.google.refine.grel.controls.IsNonBlank; import com.google.refine.grel.controls.IsNotNull; import com.google.refine.grel.controls.IsNull; @@ -307,6 +308,7 @@ public class ControlFunctionRegistry { registerControl("isNull", new IsNull()); registerControl("isNotNull", new IsNotNull()); + registerControl("isEmptyString", new IsEmptyString()); registerControl("isBlank", new IsBlank()); registerControl("isNonBlank", new IsNonBlank()); registerControl("isNumeric", new IsNumeric()); diff --git a/main/src/com/google/refine/grel/controls/IsEmptyString.java b/main/src/com/google/refine/grel/controls/IsEmptyString.java new file mode 100644 index 000000000..e9154f8e2 --- /dev/null +++ b/main/src/com/google/refine/grel/controls/IsEmptyString.java @@ -0,0 +1,14 @@ +package com.google.refine.grel.controls; + +public class IsEmptyString extends IsTest { + @Override + protected String getDescription() { + return "Returns whether o is an empty string"; + } + + @Override + protected boolean test(Object o) { + return o != null && o.getClass().equals(String.class) + && o.equals(""); + } +} diff --git a/main/webapp/modules/core/langs/translation-ceb.json b/main/webapp/modules/core/langs/translation-ceb.json index 06bb28577..de0f2b8aa 100644 --- a/main/webapp/modules/core/langs/translation-ceb.json +++ b/main/webapp/modules/core/langs/translation-ceb.json @@ -514,7 +514,9 @@ "transpose": "Pagbalhin", "columnize": "Kolumnays pinaagi sa Key/ Bili sa mga Kolum", "add-col-fetch": "Pun-i ang kolum sa pagkuha sa URLs basi sa kolum", - "facet-blank": "Bahin sa blangko", + "facet-blank": "Bahin sa blangko (null o walay sulod nga pisi)", + "facet-null": "Bahin sa null", + "facet-empty-string": "Bahin sa walay sulod nga pisi", "best-cand-edit-dist": "labing maayong ngalan sa kandidata nga usbon", "spec-separator": "Palihug hinganli ang separator sa tunga sa orihinal nga ngalan sa mga kolum ug bili sa cells.", "milli": "millisegundo", diff --git a/main/webapp/modules/core/langs/translation-en.json b/main/webapp/modules/core/langs/translation-en.json index aff50f5bb..4e9ea8cd4 100644 --- a/main/webapp/modules/core/langs/translation-en.json +++ b/main/webapp/modules/core/langs/translation-en.json @@ -522,7 +522,9 @@ "log-length-facet": "Log of text length facet", "unicode-facet": "Unicode char-code facet", "facet-error": "Facet by error", - "facet-blank": "Facet by blank", + "facet-blank": "Facet by blank (null or empty string)", + "facet-null": "Facet by null", + "facet-empty-string": "Facet by empty string", "text-filter": "Text filter", "add-col-col": "Add column based on column", "new-col-name": "New column name", diff --git a/main/webapp/modules/core/langs/translation-es.json b/main/webapp/modules/core/langs/translation-es.json index 612dc05bf..c12fbc3c3 100644 --- a/main/webapp/modules/core/langs/translation-es.json +++ b/main/webapp/modules/core/langs/translation-es.json @@ -490,7 +490,9 @@ "log-length-facet": "Faceta por longitud log. de texto", "unicode-facet": "Faceta por caracteres Unicode", "facet-error": "Faceta por error", - "facet-blank": "Faceta por blanco", + "facet-blank": "Faceta por blanco (nulo o cuerda vacía)", + "facet-null": "Faceta por nulo", + "facet-empty-string": "Faceta por cuerda vacía", "text-filter": "Filtro de texto", "add-col-col": "Agregar columna basada en la columna", "new-col-name": "Nuevo nombre de la columna", diff --git a/main/webapp/modules/core/langs/translation-fil.json b/main/webapp/modules/core/langs/translation-fil.json index 66b56f3e5..f5a656673 100644 --- a/main/webapp/modules/core/langs/translation-fil.json +++ b/main/webapp/modules/core/langs/translation-fil.json @@ -517,7 +517,9 @@ "transpose": "I-transpose", "columnize": "Columnize ayon sa Key / Value Columns", "add-col-fetch": "Magdagdag ng haligi sa pamamagitan ng pagkuha ng mga URL batay sa haligi", - "facet-blank": "Blangko ang facet", + "facet-blank": "Blangko ang facet (wala o walang laman na string)", + "facet-null": "Wala ang facet", + "facet-empty-string": "walang laman na string ang facet", "best-cand-edit-dist": "Ang distansya ng pag-edit ng pangalan ng pinakamahusay na kandidato", "spec-separator": "Mangyaring tukuyin ang separator sa pagitan ng mga orihinal na pangalan ng haligi at mga halaga ng cell.", "split-into": "Na hati sa", diff --git a/main/webapp/modules/core/langs/translation-fr.json b/main/webapp/modules/core/langs/translation-fr.json index aa2088e61..dcbb855f9 100644 --- a/main/webapp/modules/core/langs/translation-fr.json +++ b/main/webapp/modules/core/langs/translation-fr.json @@ -515,7 +515,9 @@ "transpose": "Transposer", "columnize": "Convertir en liste les colonnes de clé/valeur", "add-col-fetch": "Ajouter une colonne en moissonnant les données depuis les URL d’une colonne", - "facet-blank": "Facette par valeur vide", + "facet-blank": "Facette par valeur vide (nul ou chaîne vide)", + "facet-null": "Facette par nul", + "facet-empty-string": "Facette par chaîne vide", "best-cand-edit-dist": "meilleure distance d’édition du nom des candidats", "spec-separator": "Merci d’indiquer le séparateur entre les noms de colonnes originales et les valeurs des cellules.", "cluster-edit": "Grouper et éditer", diff --git a/main/webapp/modules/core/langs/translation-he.json b/main/webapp/modules/core/langs/translation-he.json index 4c6674c87..c1476d77c 100644 --- a/main/webapp/modules/core/langs/translation-he.json +++ b/main/webapp/modules/core/langs/translation-he.json @@ -500,7 +500,9 @@ "log-length-facet": "Log of text length facet", "unicode-facet": "Unicode char-code facet", "facet-error": "Facet by error", - "facet-blank": "Facet by blank", + "facet-blank": "Facet by blank (null or empty string)", + "facet-null": "Facet by null", + "facet-empty-string": "Facet by empty string", "text-filter": "Text filter", "add-col-col": "Add column based on column", "new-col-name": "New column name", diff --git a/main/webapp/modules/core/langs/translation-it.json b/main/webapp/modules/core/langs/translation-it.json index 66d3dfc65..327a7f362 100644 --- a/main/webapp/modules/core/langs/translation-it.json +++ b/main/webapp/modules/core/langs/translation-it.json @@ -515,7 +515,9 @@ "transpose": "Trasponi", "columnize": "Colonnizza per colonne Chiave/Valore", "add-col-fetch": "Aggiungi colonna con URL, basandoti su", - "facet-blank": "Per blank", + "facet-blank": "Per blank (nullo o stringa vuota)", + "facet-null": "Per nullo", + "facet-empty-string": "Per stringa vuota", "best-cand-edit-dist": "migliore 'edit distance' del nome candidati", "spec-separator": "Per favore, specifica il separatore tra il nome della colonna originale ed il valore delle celle.", "split-into": "Dividi in", diff --git a/main/webapp/modules/core/langs/translation-jp.json b/main/webapp/modules/core/langs/translation-jp.json index d94ea19f5..9973c7c28 100644 --- a/main/webapp/modules/core/langs/translation-jp.json +++ b/main/webapp/modules/core/langs/translation-jp.json @@ -516,7 +516,9 @@ "transpose": "行列転置", "columnize": "行をカラムに転置する", "add-col-fetch": "URLフェッチでカラムを作る", - "facet-blank": "空白ファセット", + "facet-blank": "空白ファセット (ヌルまたは空の文字列)", + "facet-null": "ヌルファセット", + "facet-empty-string": "空の文字列ファセット", "best-cand-edit-dist": "最良候補の名前の編集距離", "spec-separator": "カラム名とセル値の区切り文字を指定してください。", "by": "基準", diff --git a/main/webapp/modules/core/langs/translation-pt_BR.json b/main/webapp/modules/core/langs/translation-pt_BR.json index 45b87c1a6..94a596d39 100644 --- a/main/webapp/modules/core/langs/translation-pt_BR.json +++ b/main/webapp/modules/core/langs/translation-pt_BR.json @@ -507,7 +507,9 @@ "transpose": "Transpor", "columnize": "Criar colunas a partir de colunas chave/valor", "add-col-fetch": "Add column by fetching URLs based on column", - "facet-blank": "Faceta por valores em branco", + "facet-blank": "Faceta por valores em branco (nulo ou cadeia vazia)", + "facet-null": "Faceta por nulo", + "facet-empty-string": "Faceta por cadeia vazia", "best-cand-edit-dist": "best candidate's name edit distance", "spec-separator": "Por favor, especifique o separador entre os nomes das colunas e os valores das células.", "milli": "milissegundos", diff --git a/main/webapp/modules/core/langs/translation-ru.json b/main/webapp/modules/core/langs/translation-ru.json index 8665f062d..ad22208e7 100644 --- a/main/webapp/modules/core/langs/translation-ru.json +++ b/main/webapp/modules/core/langs/translation-ru.json @@ -553,7 +553,8 @@ "transpose": "Преобразование", "columnize": "Сгенерировать колонки Ключ/Значение", "add-col-fetch": "Добавить колонку посредством загрузки URL-ссылок исходной колонки", - "facet-blank": "Фасет по пустым полям", + "facet-blank": "Фасет по пустым полям (ноль или пустая строка)", + "facet-null": "Фасет по ноль", "best-cand-edit-dist": "расстояние Левенштейна названия лучшего кандидата", "spec-separator": "Пожалуйста, укажите разделитель между наименованиями исходной колонки и значениями ячеек.", "milli": "милисекунд", @@ -562,6 +563,33 @@ "move-to-end": "Переместить колонку в конец", "before-val": "перед значением ячейки", "dates": "даты", + "custom-facets": "Другие фасеты", + "word-facet": "Фасет по словам", + "duplicates-facet": "Фасет дубликатов", + "numeric-log-facet": "Логарифмический числовой фасет", + "bounded-log-facet": "Логарифмический фасет чисел >= 1", + "text-length-facet": "Фасет по длине текста", + "log-length-facet": "Логарифмический фасет по длине текста", + "unicode-facet": "Фасет по уникоду символов", + "facet-error": "Фасет по ошибкам", + "facet-empty-string": "Фасет по пустая строка", + "text-filter": "Текстовый фильтр", + "add-col-col": "Добавить колонку основываясь на текущей", + "new-col-name": "Наименование новой колонки", + "on-error": "В случае ошибки", + "set-blank": "оставить пустым", + "store-err": "сохранить ошибку", + "cache-responses": "Кешировать ответы", + "copy-val": "скопировать значение исходной колонки", + "warning-col-name": "Нужно ввести наименование колонки.", + "add-col-recon-val": "Добавить колонки из значений сверки", + "add-col-recon-col": "Добавить колонки из сверенной колонки", + "warning-no-property": "Пожалуйста, сначала выберите свойство.", + "configure-col": "Настроить эту колонку", + "remove-prop": "удалить", + "configure-prop": "настроить", + "no-settings": "У этого свойства настройки недоступны.", + "extend-not-reconciled": "Эта операция доступна только для сверенных колонок.", "extend-not-supported": "Эта служба сверки не поддерживает Data Extension API. Попробуйте удалит и опять добавить службу. Если проблема останется, обратитесь к поставщику службы.", "last": "последняя", "reverse": "В обратном порядке", diff --git a/main/webapp/modules/core/langs/translation-tl.json b/main/webapp/modules/core/langs/translation-tl.json index 13ccf7bd1..6baed96c6 100644 --- a/main/webapp/modules/core/langs/translation-tl.json +++ b/main/webapp/modules/core/langs/translation-tl.json @@ -517,7 +517,9 @@ "transpose": "I-transpose", "columnize": "I-columnize sa pamamagitan ng Key/Value ng mga kolum", "add-col-fetch": "Magdagdag ng kolum sa pamamagitang ng pag-fetch ng mga URL basi sa kolum", - "facet-blank": "Ang facet ayon sa blangko", + "facet-blank": "Ang facet ayon sa blangko (wala ou walang laman na string)", + "facet-null": "Ang facet ayon sa wala", + "facet-empty-string": "Ang facet ayon sa walang laman na string", "best-cand-edit-dist": "ang pag-edit sa distansya ng pangalang ng pinakamagaling na kandidato", "spec-separator": "Pakiusap i-specify ang tagapaghiwalay sa pagitan ng orihinal na pangalan ng kolum at mga balyu ng cell.", "split-into": "Ihiwalay sa", diff --git a/main/webapp/modules/core/langs/translation-zh.json b/main/webapp/modules/core/langs/translation-zh.json index 38ead9797..b2d679bb8 100644 --- a/main/webapp/modules/core/langs/translation-zh.json +++ b/main/webapp/modules/core/langs/translation-zh.json @@ -490,7 +490,9 @@ "log-length-facet": "文本长度的对数值归类", "unicode-facet": "Unicode字符归类", "facet-error": "按错误归类", - "facet-blank": "按空白归类", + "facet-blank": "按空白归类 (null或空字符串)", + "facet-null": "按null归类", + "facet-empty-string": "按空字符串归类", "text-filter": "文本过滤器", "add-col-col": "基于当前列添加列", "new-col-name": "新列名称", diff --git a/main/webapp/modules/core/scripts/views/data-table/menu-facets.js b/main/webapp/modules/core/scripts/views/data-table/menu-facets.js index f70585402..238cecfef 100644 --- a/main/webapp/modules/core/scripts/views/data-table/menu-facets.js +++ b/main/webapp/modules/core/scripts/views/data-table/menu-facets.js @@ -245,6 +245,34 @@ DataTableColumnHeaderUI.extendMenu(function(column, columnHeaderUI, menu) { ); } }, + { + id: "core/null-facet", + label: $.i18n._('core-views')["facet-null"], + click: function() { + ui.browsingEngine.addFacet( + "list", + { + "name": column.name, + "columnName": column.name, + "expression": "isNull(value)" + } + ); + } + }, + { + id: "core/empty-string-facet", + label: $.i18n._('core-views')["facet-empty-string"], + click: function() { + ui.browsingEngine.addFacet( + "list", + { + "name": column.name, + "columnName": column.name, + "expression": "isEmptyString(value)" + } + ); + } + }, { id: "core/blank-facet", label: $.i18n._('core-views')["facet-blank"],