Skip to content

Commit 7cb167c

Browse files
Issue 53431: Data Class and Sample Type data doesn't round-trip via folder export/import for field names with special char (#6840)
- use ColumnHeaderType.ImportField instead of FieldKey for writing folder archive tsv data column headers - PlateManager.exportPlateData / ListWriter / DatasetDataWriter to use ColumnHeaderType.ImportField - remove comment re: ColumnHeaderType.FieldKey being "useful for import/export round-tripping" since that isn't the case - StudyDatasetsTest test case for 53431 --------- Co-authored-by: labkey-susanh <susanh@labkey.com>
1 parent 9674e8a commit 7cb167c

File tree

6 files changed

+41
-5
lines changed

6 files changed

+41
-5
lines changed

api/src/org/labkey/api/data/ColumnHeaderType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public String getText(DisplayColumn dc)
109109
}
110110
},
111111

112-
// Use the ColumnInfo's FieldKey with FieldKey escaping. Useful for import/export round-tripping, but can lead to ugly names.
112+
// Use the ColumnInfo's FieldKey with FieldKey escaping.
113113
FieldKey("Field Key", "The column name rendered with FieldKey encoding; unambiguous and canonical, useful for exporting and re-importing.") {
114114
@Override
115115
public String getText(DisplayColumn dc)

assay/src/org/labkey/assay/plate/PlateManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3768,7 +3768,7 @@ public List<PlateFileBytes> exportPlateData(Container c, User user, ContainerFil
37683768
try (TSVGridWriter writer = new TSVGridWriter(plateQueryView::getResults, displayColumns, Collections.singletonMap(sampleIdNameFieldKey.toString(), "Sample ID")))
37693769
{
37703770
writer.setDelimiterCharacter(delim);
3771-
writer.setColumnHeaderType(ColumnHeaderType.FieldKey);
3771+
writer.setColumnHeaderType(ColumnHeaderType.ImportField); // Issue 53431
37723772
writer.write(plateFileBytes.bytes);
37733773
}
37743774

experiment/src/org/labkey/experiment/samples/AbstractExpFolderWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ protected void writeTsv(TableInfo tinfo, Collection<ColumnInfo> columns, SimpleF
9696
try (TSVGridWriter tsvWriter = new TSVGridWriter(factory))
9797
{
9898
tsvWriter.setApplyFormats(false);
99-
tsvWriter.setColumnHeaderType(ColumnHeaderType.FieldKey);
99+
tsvWriter.setColumnHeaderType(ColumnHeaderType.ImportField); // Issue 53431
100100
PrintWriter out = dir.getPrintWriter(baseName + ".tsv");
101101
tsvWriter.write(out);
102102
}

list/src/org/labkey/list/model/ListWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ private void writeLists(List<Pair<String, ListDefinition>> listsToExport, Virtua
189189
try (TSVGridWriter tsvWriter = new TSVGridWriter(()->QueryService.get().getSelectBuilder(ti).columns(columns).sort(sort).select(null, false), displayColumns))
190190
{
191191
tsvWriter.setApplyFormats(false);
192-
tsvWriter.setColumnHeaderType(ColumnHeaderType.DisplayFieldKey); // CONSIDER: Use FieldKey instead
192+
tsvWriter.setColumnHeaderType(ColumnHeaderType.ImportField); // Issue 53431
193193
PrintWriter out = listsDir.getPrintWriter( def.getName() + ".tsv");
194194
tsvWriter.write(out);
195195
}

study/src/org/labkey/study/writer/DatasetDataWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ private void writeResultsToTSV(ResultsFactory factory, VirtualFile vf, String fi
179179
try (TSVGridWriter tsvWriter = new TSVGridWriter(factory))
180180
{
181181
tsvWriter.setApplyFormats(false);
182-
tsvWriter.setColumnHeaderType(ColumnHeaderType.DisplayFieldKey); // CONSIDER: Use FieldKey instead
182+
tsvWriter.setColumnHeaderType(ColumnHeaderType.ImportField); // Issue 53431
183183
PrintWriter out = vf.getPrintWriter(fileName);
184184
tsvWriter.write(out);
185185
}

study/test/src/org/labkey/test/tests/study/StudyDatasetsTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.labkey.test.pages.ImportDataPage;
3434
import org.labkey.test.pages.TimeChartWizard;
3535
import org.labkey.test.pages.study.DatasetDesignerPage;
36+
import org.labkey.test.params.FieldInfo;
3637
import org.labkey.test.util.AuditLogHelper;
3738
import org.labkey.test.util.DataRegionTable;
3839
import org.labkey.test.util.LogMethod;
@@ -41,6 +42,7 @@
4142
import org.labkey.test.util.TestDataGenerator;
4243
import org.openqa.selenium.WebElement;
4344

45+
import java.io.File;
4446
import java.util.ArrayList;
4547
import java.util.Arrays;
4648
import java.util.Collections;
@@ -212,6 +214,40 @@ public void testDatasetSubjectId()
212214
clickTab("Overview");
213215
}
214216

217+
@Test
218+
public void testDatasetRoundTripWithSpecialChars() // Issue 53431
219+
{
220+
goToManageStudy();
221+
String datasetName = "Issue 53431";
222+
FieldInfo fieldInfo = FieldInfo.random("test,./field");
223+
DatasetDesignerPage definitionPage = _studyHelper.goToManageDatasets()
224+
.clickCreateNewDataset()
225+
.setName(datasetName);
226+
DomainFormPanel panel = definitionPage.getFieldsPanel();
227+
panel.manuallyDefineFields(fieldInfo.getFieldDefinition());
228+
definitionPage.clickSave();
229+
importDatasetData(datasetName, "mouseId\tsequenceNum\t\"" + fieldInfo.getName() + "\"\n", "a1\t1\ttest123", "All data");
230+
231+
File exportedFolder = exportFolderAsZip(null, false, false, false, false);
232+
deleteStudy();
233+
importFolderFromZip(exportedFolder, false, 2, false);
234+
_studyHelper.goToManageDatasets()
235+
.selectDatasetByName(datasetName)
236+
.clickViewData();
237+
DataRegionTable drt = new DataRegionTable("Dataset", getDriver());
238+
checker().verifyEquals("Field data didn't import as expected", "test123",
239+
drt.getDataAsText(0, fieldInfo));
240+
}
241+
242+
private void deleteStudy()
243+
{
244+
clickTab("Manage");
245+
clickButton("Delete Study");
246+
checkCheckbox(Locator.checkboxByName("confirm"));
247+
clickButton("Delete", WAIT_FOR_PAGE * 2);
248+
}
249+
250+
215251
@LogMethod
216252
protected void createDataset(@LoggedParam String name, @Nullable String error)
217253
{

0 commit comments

Comments
 (0)