Merge remote-tracking branch 'upstream/master'

This commit is contained in:
TonyO 2018-03-24 22:38:30 -05:00
commit e0f7690262
12 changed files with 426 additions and 20 deletions

View File

@ -1,22 +1,22 @@
When reporting a bug please provide the following information to help reproduce the bug: When reporting a bug please provide the following information to help reproduce the bug:
Version of OpenRefine used (Google Refine 2.6, OpenRefine2.8, an other distribution?): #### Version of OpenRefine used (Google Refine 2.6, OpenRefine2.8, an other distribution?):
-----
Operating Systems and version:
-----
Browser + version used - Please note that OpenRefine doesn't support Internet Explorer but works OK in most cases: #### Operating Systems and version:
-----
Steps followed to create the issue:
-----
If you are allowed and are OK with making your data public, it would be awesome if you can include the data causing the issue or a URL pointing to where the data is (if your concerned about keeping your data private, ping us on our mailing list): #### Browser + version used - Please note that OpenRefine doesn't support Internet Explorer but works OK in most cases:
-----
Current Results:
-----
Expected Results: #### Steps followed to create the issue:
-----
#### If you are allowed and are OK with making your data public, it would be awesome if you can include the data causing the issue or a URL pointing to where the data is (if your concerned about keeping your data private, ping us on our mailing list):
#### Current Results:
#### Expected Results:

View File

@ -0,0 +1,72 @@
/*
Copyright 2018, Owen Stephens
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.google.refine.expr.functions;
import java.util.Properties;
import org.json.JSONException;
import org.json.JSONWriter;
import com.google.refine.expr.EvalError;
import com.google.refine.grel.ControlFunctionRegistry;
import com.google.refine.grel.Function;
public class Coalesce implements Function {
@Override
public Object call(Properties bindings, Object[] args) {
if (args.length> 1) {
for (int i = 0; i < args.length; i++){
if (args[i] == null) {
continue;
} else {
return args[i];
}
}
return null;
}
return new EvalError(ControlFunctionRegistry.getFunctionName(this) + " expects at least two arguments");
}
@Override
public void write(JSONWriter writer, Properties options)
throws JSONException {
writer.object();
writer.key("description"); writer.value("Returns the first non-null from a series of values");
writer.key("params"); writer.value("two or more objects");
writer.key("returns"); writer.value("object or null");
writer.endObject();
}
}

View File

@ -38,6 +38,7 @@ import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import com.google.refine.expr.functions.Coalesce;
import com.google.refine.expr.functions.Cross; import com.google.refine.expr.functions.Cross;
import com.google.refine.expr.functions.FacetCount; import com.google.refine.expr.functions.FacetCount;
import com.google.refine.expr.functions.Get; import com.google.refine.expr.functions.Get;
@ -186,6 +187,7 @@ public class ControlFunctionRegistry {
} }
static { static {
registerFunction("coalesce", new Coalesce());
registerFunction("type", new Type()); registerFunction("type", new Type());
registerFunction("toString", new ToString()); registerFunction("toString", new ToString());

View File

@ -0,0 +1,103 @@
/*
Copyright 2011, Owen Stephens
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.google.refine.tests.expr.functions.strings;
import java.util.Properties;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import com.google.refine.expr.EvalError;
import com.google.refine.grel.ControlFunctionRegistry;
import com.google.refine.grel.Function;
import com.google.refine.tests.RefineTest;
public class CoalesceTests extends RefineTest {
private static Properties bindings;
private static final Integer[] ZERO_TO_TWO = new Integer[] {0, 1, 2};
@Override
@BeforeTest
public void init() {
logger = LoggerFactory.getLogger(this.getClass());
}
@BeforeMethod
public void setUp() {
bindings = new Properties();
}
@AfterMethod
public void tearDown() {
bindings = null;
}
/**
* Lookup a control function by name and invoke it with a variable number of args
*/
private static Object invoke(String name,Object... args) {
// registry uses static initializer, so no need to set it up
Function function = ControlFunctionRegistry.getFunction(name);
if (function == null) {
throw new IllegalArgumentException("Unknown function "+name);
}
if (args == null) {
return function.call(bindings,new Object[0]);
} else {
return function.call(bindings,args);
}
}
@Test
public void testCoalesceInvalidParams() {
Assert.assertTrue(invoke("coalesce") instanceof EvalError);
Assert.assertTrue(invoke("coalesce", 1) instanceof EvalError);
}
@Test
public void testCoalesce() {
Assert.assertNull(invoke("coalesce", (Object) null, (Object) null));
Assert.assertEquals(invoke("coalesce", (Object) null, "string"),"string");
Assert.assertEquals(invoke("coalesce", (Object) null, (Object) null, "string"),"string");
Assert.assertEquals(invoke("coalesce", (Object) null, 1),1);
Assert.assertEquals(invoke("coalesce", (Object) null, ZERO_TO_TWO),ZERO_TO_TWO);
}
}

View File

@ -302,13 +302,17 @@ a.fbs-more-link {
margin: 2px 2px -2px 2px; margin: 2px 2px -2px 2px;
} }
.fbs-item-name label { .fbs-item-name label, .fbs-item-name span {
font-size: 0.9em; font-size: 0.9em;
} }
.fbs-item-name label {
color: black;
}
.fbs-item-type, .fbs-item-type,
.fbs-item-name label { .fbs-item-name label,
.fbs-item-name span {
display: block; display: block;
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;

File diff suppressed because one or more lines are too long

View File

@ -725,7 +725,11 @@
var css = this.options.css; var css = this.options.css;
var li = $("<li>").addClass(css.item); var li = $("<li>").addClass(css.item);
var label = $("<label>").text(data.name); var label = $("<label>").text(data.name);
li.append($("<div>").addClass(css.item_name).append(label)); var div = $("<div>").addClass(css.item_name).append(label);
if(data.description) {
div.append($('<span></span>').text(data.description));
}
li.append(div);
return li; return li;
}, },
@ -1291,6 +1295,9 @@
type.text(data.id); type.text(data.id);
} }
name.prepend(type); name.prepend(type);
if(data.description) {
name.append($("<span></span>").text(data.description));
}
//console.log("create_item", li); //console.log("create_item", li);
return li; return li;

View File

@ -0,0 +1,205 @@
{
"name": "angol",
"core-index": {
"help": "Súgó",
"contributors": "Közreműködők:",
"new-proj-name": "Új projekt neve:",
"download": "Letöltés",
"delete-key": "Beállítás törlése",
"id": "Projekt ID:",
"subject": "Tárgy:",
"preferences": "Beállítások",
"creator": "Létrehozó:",
"no-proj": "Nincs ilyen projekt. Új projekt létrehozásához válassza a 'Projekt létrehozása' opciót a bal oldalon.",
"version": "Verzió",
"error-rename": "Projekt átnevezése sikertelen:",
"pref-key": "Beállítás értéke:",
"change-metadata-value": "Metaadat kulcs értékének módosítása",
"sample-data": "példa adatok",
"description": "Leírás:",
"try-these": "Ha még nem áll rendelkezésre adat, amivel dolgozzon, próbálja ezeket",
"customMetadata": "Egyedi metaadat (JSON):",
"add-pref": "Beállítás hozzáadása",
"rowCount": "Sorok száma:",
"key": "Kulcs",
"new-version": "Új verzió!",
"now": "most",
"change-value": "Beállítás értékének módosítása",
"about": "Névjegy",
"name": "Projekt neve:",
"created": "Létrehozás ideje:",
"edit": "Szerkesztés",
"importOptionMetadata": "Metaadat importálása (JSON):",
"modified": "Utoljára módosítva:",
"value": "Érték",
"delete": "Törlés"
},
"core-index-create": {
"almost-done": "majdnem kész...",
"min-remaining": "perc van hátra",
"create-proj": "Projekt létrehozása",
"from": "Adatok beolvasása innen",
"memory-usage": "Memóriahasználat:",
"question": "Projekt létrehozásához importáljon adatokat. Milyen adatokat importálhatok?",
"sec-remaining": "másodperc van hátra",
"done": "Kész.",
"formats": "TSV, CSV, *SV, Excel (.xls és .xlsx), JSON, XML, RDF XML-ként és Google Data dokumentumok támogatottak. További formátumok hozzáadása OpenRefine bővítmények révén lehetséges.",
"starting": "Kezdés",
"no-details": "Nincsenek technikai részletek."
},
"core-index-import": {
"rename": "Projekt átnevezése (opcionális):",
"select-file": "Importálandó fájlok kiválasztása",
"warning-name": "Nevezze el a projektet.",
"project-name": "Projekt&nbsp;neve",
"import-proj": "Projekt importálása",
"warning-select": "Válasszon ki legalább egy fájlt.",
"optional-separated": "opcionális, vesszővel elválasztott",
"file": "Projekt fájl:",
"uploading-pasted-data": "Beszúrt adatok feltöltése...",
"warning-clipboard": "Szúrjon be adatokat az importáláshoz.",
"warning-record-path": "Először adjon meg egy rekord utat.",
"several-file": "Több fájl is elérhető. Válassza ki az importálandót.",
"warning-data-file": "Ki kell választania az importálandó adatfájlt.",
"web-address": "Webcímek (URL)",
"size": "Méret",
"errors": "Hibák:",
"project-tags": "Címkék",
"updating-preview": "Előnézet frissítése...",
"column-widths": "Oszlopszélességek:",
"clipboard": "Vágólap",
"import-worksheet": "Munkalapok importálása",
"inspecting": "Kiválasztott fájl átnézése...",
"import": "Importálás?",
"enter-url": "Adjon meg egy vagy több webcímet (URL), amelyek a letöltendő adatokra mutatnak:",
"warning-web-address": "Meg kell adnia egy webcímet (URL) az importáláshoz.",
"sel-by-extension": "Kiválasztás kiterjesztés alapján",
"locate": "Létező Refine projekt (.tar vagy .tar.gz) keresése:",
"locate-files": "Válasszon ki egy vagy több fájl a helyi számítógépről a feltöltéshez:",
"format": "Formátum",
"column-names": "Oszlopnevek:",
"uploading-data": "Adatok feltöltése...",
"clipboard-label": "Illessze be az adatokat a vágólapról ide:",
"this-computer": "Helyi számítógép",
"name": "Név",
"pick-nodes": "Válasszon rekordcsomópontokat",
"sel-by-regex": "Kiválasztás Regex keresés alapján a fájlnévben",
"parsing-options": "Feldolgozási opciók beállítása",
"inspecting-files": "Kiválasztott fájlok<br/>átnézése ...",
"data-package": "Adatcsomag (JSON URL)",
"char-encoding": "Karakterkódolás",
"mime-type": "Mime-típus",
"creating-proj": "Projekt létrehozása...",
"comma-separated": "vesszővel elválasztott számok",
"error": "Hiba:",
"downloading-data": "Adatok letöltése...",
"parse-as": "Adat feldolgozás mint",
"unknown-err": "Ismeretlen hiba"
},
"core-index-open": {
"rename": "Átnevezés",
"del-body": "Projekt törlésének megerősítése",
"open-proj": "Projekt megnyitása",
"contributors": "Közreműködők",
"creator": "Létrehozó",
"browse": "Böngészés a munkaterület mappában",
"description": "Leírás",
"row-count": "Sorok száma",
"last-mod": "Utoljára módosítva",
"warning-proj-name": "Adjon meg egy projekt nevet.",
"warning-data-file": "Meg kell adnia egy feltöltendő adatfájlt vagy egy URL-t az adatok letöltéséhez.",
"edit-tags-desc": "Projekt címkék szerkesztése (szóköz vagy vessző az elválasztójel):",
"del-title": "Projekt törlése",
"edit-tags": "Projekt címkék szerkesztése",
"edit-meta-data": "Névjegy",
"edit-data-package": "Adatcsomag",
"tags": "Címkék",
"subject": "Tárgy",
"warning-rename": "Projekt átnevezése sikertelen:",
"new-title": "Új projekt neve:",
"name": "Név"
},
"core-index-lang": {
"label": "Preferált nyelv választása",
"send-req": "Nyelv módosítása",
"page-reload": "Az oldal frissülni fog a módosítások alkalmazásához.",
"lang-settings": "Nyelvi beállítások"
},
"core-index-parser": {
"parse-cell": "Cella tartalmának feldolgozása<br/>számokká, dátumokká, ...",
"trim": "Szóközök törlése a karakterláncok elejéről és végéről",
"parse-next": "Dolgozza fel a következő",
"commas": "vessző (CSV)",
"tabs": "tabulátor (TSV)",
"escape": "Különleges karakterek feloldása ezzel \\",
"lines-header": "sort mint oszlopfejlécet",
"store-source": "Fájlforrás <br/>(fájlnév, URL) <br/>tárolása minden sorban",
"use-quote": "Használja a",
"ignore-first": "Hagyja ki az első",
"quote-delimits-cells": "karaktert az oszlopelválasztót tartalmazó cellák befoglalására",
"store-nulls": "Üres cellák tárolása null értékként",
"lines-into-row": "sort egy sorba",
"custom": "egyéni",
"include-raw-templates": "Sablonok és a képek tárolása wikicode-ként",
"invalid-wikitext": "Tábla feldolgozása sikertelen. Biztos benne, hogy ez egy érvényes wiki tábla?",
"json-parser": "Kattintson a betöltendő első rekordnak megfelelő első JSON { } csomópontra.",
"parse-every": "Dolgozza fel minden",
"store-blank": "Üres sorok tárolása",
"discard-initial": "Dobja el az első",
"parse-references": "Hivatkozások tárolása külön oszlopként",
"col-separated-by": "Oszlopok elválasztójele",
"wiki-base-url": "Összeegyeztetés az alábbi URL-en elérhető wikivel:",
"rows-data": "sornyi adatot",
"click-xml": "Kattintson az első betöltendő rekordnak megfelelő XML elemre.",
"lines-beg": "sort a fájl elején",
"preserve-empty": "Üres karakterláncok megőrzése",
"blank-spanning-cells": "A több oszlopon vagy soron átívelő cellák kitöltése null értékekkel",
"load-at-most": "Töltsön be maximum"
},
"core-dialogs": {
"find-more": "További információk...",
"drop-column": "Húzza ide a törlendő oszlopot",
"processing": "Feldolgozás...",
"warning-check-boxes": "Válasszon ki legalább egy Szerkesztés? jelölőnégyzetet a módosítások alkalmazására.",
"no-column-dataset": "Nincsenek oszlopok ebben az adathalmazban",
"try-another-method": "Válasszon másik módszert vagy változtasson a paramétereken",
"new-cell-val": "Új cella értéke",
"choice-var-length": "Elemek hosszának varianciája",
"from-total": "</b> elemből szűrve",
"cluster-size": "Összevonás mérete",
"rows-in-cluster": "Sorok száma a csoportban",
"drag-column": "Mozgassa át az oszlopot az átrendezéshez",
"cluster-values": "Összevont oszlopok értékei",
"scatterplot-matrix": "Szórásdiagramm",
"use-this-val": "Ezen érték használata",
"method": "Módszer&nbsp;",
"clustering": "Csoportosítás... ",
"template-rowt": "Sor formázása",
"no-cluster-found": "Csoportok létrehozása ezzel a módszerrel sikertelen",
"template-rows": "Sor elválasztó",
"cluster-descr": "Ennek az opciónak a segítségével könnyen megtalálhatja azokat a cellacsoportokat, amelyek ugyanazt a dolgot különböző néven tartalmazzák. Például a \"New York\" és a \"new york\" karakterláncok nagy valószínűséggel ugyanarra vonatkoznak, csak a nagybetűk használatában különböznek, a \"Gödel\" és \"Godel\" valószínűleg ugyanarra az emberre utal.",
"template-prefix": "Előtag",
"focusing-on": "erre összpontosítva",
"template-export": "Exportálás formázása",
"cluster-edit": "Oszlopok összevonása és módosítása",
"nearest-neighbor": "legközelebbi szomszéd",
"browse-only-these": "Csak ezen értékek böngészése",
"browse-this-cluster": "Ezen csoport böngészése",
"error-getColumnInfo": "Hiba a 'get-columns-info' hívása közben",
"logarithmic-plot": "Logaritmikus diagramm",
"updating": "Frissítés...",
"idling": "Várakozás...",
"row-count": "Sorok száma",
"choice-avg-length": "Elemek átlagos hossza",
"reorder-column": "Oszlopok átrendezése / eltávolítása",
"merge": "Összevonás?",
"choices-in-cluster": "Elemek száma a csoportban",
"filtered-from": "összesen <b>",
"found": "Találatok száma",
"template-suffix": "Utótag",
"linear-plot": "Vonaldiagramm"
},
"core-views": {
"scatterplot-facet": "Szórás facetta"
}
}

View File

@ -316,7 +316,7 @@ ReconStandardServicePanel.prototype.start = function() {
type: (type) ? { id: type.id, name: type.name } : null, type: (type) ? { id: type.id, name: type.name } : null,
autoMatch: this._elmts.automatchCheck[0].checked, autoMatch: this._elmts.automatchCheck[0].checked,
columnDetails: columnDetails, columnDetails: columnDetails,
limit: this._elmts.maxCandidates[0].value limit: parseInt(this._elmts.maxCandidates[0].value) || 0
}) })
}, },
{ cellsChanged: true, columnStatsChanged: true } { cellsChanged: true, columnStatsChanged: true }

View File

@ -74,6 +74,10 @@ var CustomSuggest = {};
); );
data.name = name.text(); // this converts html escaped strings like "&amp;" back to "&" data.name = name.text(); // this converts html escaped strings like "&amp;" back to "&"
if (data.description) {
var descriptionSpan = $("<span></span>").text(data.description);
name.append(descriptionSpan);
}
li.append(name); li.append(name);
name.prepend($("<div>").addClass(css.item_type).text(data.id)); name.prepend($("<div>").addClass(css.item_type).text(data.id));
@ -134,6 +138,11 @@ var CustomSuggest = {};
.append($.suggest.strongify(data.name || data.guid, response_data.prefix))); .append($.suggest.strongify(data.name || data.guid, response_data.prefix)));
data.name = name.text(); // this converts html escaped strings like "&amp;" back to "&" data.name = name.text(); // this converts html escaped strings like "&amp;" back to "&"
if (data.description) {
var descriptionSpan = $("<span></span>").text(data.description);
name.append(descriptionSpan);
}
li.append(name); li.append(name);
name.prepend($("<div>").addClass(css.item_type).text(data.id)); name.prepend($("<div>").addClass(css.item_type).text(data.id));

View File

@ -60,7 +60,7 @@ DataTableCellUI.prototype._render = function() {
.mouseleave(function() { editLink.css("visibility", "hidden"); }); .mouseleave(function() { editLink.css("visibility", "hidden"); });
if (!cell || ("v" in cell && cell.v === null)) { if (!cell || ("v" in cell && cell.v === null)) {
$('<span>').html("&nbsp;").appendTo(divContent); $('<span>').addClass("data-table-null").html('null').appendTo(divContent);
} else if ("e" in cell) { } else if ("e" in cell) {
$('<span>').addClass("data-table-error").text(cell.e).appendTo(divContent); $('<span>').addClass("data-table-error").text(cell.e).appendTo(divContent);
} else if (!("r" in cell) || !cell.r) { } else if (!("r" in cell) || !cell.r) {

View File

@ -201,6 +201,10 @@ div.data-table-cell-content-numeric > a.data-table-cell-edit {
color: #282; color: #282;
} }
.data-table-null {
color: #aaa;
}
.data-table-error { .data-table-error {
color: red; color: red;
} }