public ViewFieldType newMessage() { return new ViewFieldType(); }
@Test public void testGeneratedOutput() throws Exception { QlikAppMessageBodyGenerator generator = new QlikAppMessageBodyGenerator(); VirtualDataset dataset = new VirtualDataset() .setSqlFieldsList(Arrays.asList( new ViewFieldType("testdimension", "VARCHAR"), new ViewFieldType("testdimension2", "CHAR"), new ViewFieldType("testmeasure", "INTEGER"), new ViewFieldType("testmeasure2", "REAL"), new ViewFieldType("testdetail", "MAP"), new ViewFieldType("testdetail2", "STRUCTURED"))); DatasetConfig datasetConfig = new DatasetConfig() .setName("UNTITLED") .setType(DatasetType.VIRTUAL_DATASET) .setFullPathList(DatasetTool.TMP_DATASET_PATH.toPathList()) .setVirtualDataset(dataset); MultivaluedMap<String, Object> httpHeaders = new MultivaluedHashMap<>(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); assertTrue(generator.isWriteable(datasetConfig.getClass(), null, null, WebServer.MediaType.TEXT_PLAIN_QLIK_APP_TYPE)); generator.writeTo(datasetConfig, DatasetConfig.class, null, new Annotation[] {}, WebServer.MediaType.TEXT_PLAIN_QLIK_APP_TYPE, httpHeaders, baos); String script = new String(baos.toByteArray(), UTF_8); assertTrue(script.contains(" DIMENSION \"testdimension\", \"testdimension2\"")); assertTrue(script.contains(" MEASURE \"testmeasure\", \"testmeasure2\"")); assertTrue(script.contains(" DETAIL \"testdetail\", \"testdetail2\"")); assertTrue(script.contains(" FROM \"tmp\".\"UNTITLED\"")); }
@Test public void testQuoting() throws Exception { QlikAppMessageBodyGenerator generator = new QlikAppMessageBodyGenerator(); VirtualDataset dataset = new VirtualDataset() .setSqlFieldsList(Arrays.asList(new ViewFieldType("testdimension", "VARCHAR"), new ViewFieldType("testmeasure", "INTEGER"))); DatasetConfig datasetConfig = new DatasetConfig() .setName("UNTITLED") .setType(DatasetType.VIRTUAL_DATASET) .setFullPathList(Arrays.asList("space", "folder.ext", "UNTITLED")) .setVirtualDataset(dataset); MultivaluedMap<String, Object> httpHeaders = new MultivaluedHashMap<>(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); assertTrue(generator.isWriteable(datasetConfig.getClass(), null, null, WebServer.MediaType.TEXT_PLAIN_QLIK_APP_TYPE)); generator.writeTo(datasetConfig, DatasetConfig.class, null, new Annotation[] {}, WebServer.MediaType.TEXT_PLAIN_QLIK_APP_TYPE, httpHeaders, baos); String script = new String(baos.toByteArray(), UTF_8); assertTrue(script.contains(" DIMENSION \"testdimension\"")); assertTrue(script.contains(" MEASURE \"testmeasure\"")); assertTrue(script.contains(" FROM \"space\".\"folder.ext\".\"UNTITLED\"")); }
@Test public void testQuoteInPathAndDatasetName() throws Exception { QlikAppMessageBodyGenerator generator = new QlikAppMessageBodyGenerator(); VirtualDataset dataset = new VirtualDataset() .setSqlFieldsList(Arrays.asList(new ViewFieldType("test dimension", "VARCHAR"), new ViewFieldType("test \" measure", "INTEGER"))); DatasetConfig datasetConfig = new DatasetConfig() .setName("UNTITLED") .setType(DatasetType.VIRTUAL_DATASET) .setFullPathList(Arrays.asList("@dremio", "fol\"der.ext", "foo", "bar")) .setVirtualDataset(dataset); MultivaluedMap<String, Object> httpHeaders = new MultivaluedHashMap<>(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); assertTrue(generator.isWriteable(datasetConfig.getClass(), null, null, WebServer.MediaType.TEXT_PLAIN_QLIK_APP_TYPE)); generator.writeTo(datasetConfig, DatasetConfig.class, null, new Annotation[] {}, WebServer.MediaType.TEXT_PLAIN_QLIK_APP_TYPE, httpHeaders, baos); String script = new String(baos.toByteArray(), UTF_8); // make sure everything is escaped correctly assertTrue(script.contains(" DIMENSION \"test dimension\"")); assertTrue(script.contains(" MEASURE \"test \"\" measure\"")); assertTrue(script.contains(" FROM \"@dremio\".\"fol\"\"der.ext\".\"foo\".\"bar\"")); }
@Test public void testFieldNamesWithSpaceQuoting() throws Exception { QlikAppMessageBodyGenerator generator = new QlikAppMessageBodyGenerator(); VirtualDataset dataset = new VirtualDataset() .setSqlFieldsList(Arrays.asList(new ViewFieldType("test dimension", "VARCHAR"), new ViewFieldType("test \" measure", "INTEGER"))); DatasetConfig datasetConfig = new DatasetConfig() .setName("UNTITLED") .setType(DatasetType.VIRTUAL_DATASET) .setFullPathList(Arrays.asList("space", "folder.ext", "UNTITLED")) .setVirtualDataset(dataset); MultivaluedMap<String, Object> httpHeaders = new MultivaluedHashMap<>(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); assertTrue(generator.isWriteable(datasetConfig.getClass(), null, null, WebServer.MediaType.TEXT_PLAIN_QLIK_APP_TYPE)); generator.writeTo(datasetConfig, DatasetConfig.class, null, new Annotation[] {}, WebServer.MediaType.TEXT_PLAIN_QLIK_APP_TYPE, httpHeaders, baos); String script = new String(baos.toByteArray(), UTF_8); // make sure everything is escaped correctly assertTrue(script.contains(" DIMENSION \"test dimension\"")); assertTrue(script.contains(" MEASURE \"test \"\" measure\"")); assertTrue(script.contains(" FROM \"space\".\"folder.ext\".\"UNTITLED\"")); }
@Test public void testSanitizing() throws Exception { QlikAppMessageBodyGenerator generator = new QlikAppMessageBodyGenerator(); VirtualDataset dataset = new VirtualDataset() .setSqlFieldsList(Arrays.asList(new ViewFieldType("testdetail2", "STRUCTURED"))); DatasetConfig datasetConfig = new DatasetConfig() .setName("evil /!@ *-=+{}<>,~ characters") .setType(DatasetType.VIRTUAL_DATASET) .setFullPathList(DatasetTool.TMP_DATASET_PATH.toPathList()) .setVirtualDataset(dataset); MultivaluedMap<String, Object> httpHeaders = new MultivaluedHashMap<>(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); assertTrue(generator.isWriteable(datasetConfig.getClass(), null, null, WebServer.MediaType.TEXT_PLAIN_QLIK_APP_TYPE)); generator.writeTo(datasetConfig, DatasetConfig.class, null, new Annotation[] {}, WebServer.MediaType.TEXT_PLAIN_QLIK_APP_TYPE, httpHeaders, baos); String script = new String(baos.toByteArray(), UTF_8); assertTrue(script.contains("evil_characters: DIRECT QUERY")); } }
public static List<ViewFieldType> viewToFieldTypes(List<FieldType> fields) { List<ViewFieldType> sqlFields = new ArrayList<>(); for (FieldType fieldType : fields) { ViewFieldType sqlField = new ViewFieldType(fieldType.getName(), fieldType.getType().getName()); sqlField.setPrecision(fieldType.getPrecision()); sqlField.setScale(fieldType.getScale()); sqlField.setStartUnit(name(fieldType.getStartUnit())); sqlField.setEndUnit(name(fieldType.getEndUnit())); sqlField.setFractionalSecondPrecision(fieldType.getFractionalSecondPrecision()); sqlField.setIsNullable(fieldType.getIsNullable()); sqlField.setTypeFamily(fieldType.getType().getFamily().toString()); sqlFields.add(sqlField); } return sqlFields; }
public static List<ViewFieldType> getBatchSchemaFields(final BatchSchema batchSchema) { final List<ViewFieldType> fields = Lists.newArrayList(); for (int i = 0; i < batchSchema.getFieldCount(); i++) { final org.apache.arrow.vector.types.pojo.Field field = batchSchema.getColumn(i); final ViewFieldType viewField = new ViewFieldType(field.getName(), TypeInferenceUtils.getCalciteTypeFromMinorType(MajorTypeHelper.getMajorTypeForField(field).getMinorType()).toString()); final CompleteType completeType = CompleteType.fromField(field); final SqlTypeName sqlTypeName = TypeInferenceUtils.getCalciteTypeFromMinorType(getMajorTypeForField(field).getMinorType()); viewField.setPrecision(completeType.getPrecision()); viewField.setScale(completeType.getScale()); viewField.setIsNullable(true); viewField.setTypeFamily(sqlTypeName.getFamily().toString()); // TODO (AH) //viewField.setStartUnit(); //viewField.setEndUnit(); //viewField.setFractionalSecondPrecision(); fields.add(viewField); } return fields; } }
private Pair<String, String> createDS(DatasetVersionMutator service, String path, String name, String table, DatasetVersion version, Pair<String, String> idVersionPair) throws NamespaceException, DatasetNotFoundException { DatasetPath path1 = new DatasetPath(path); VirtualDatasetUI ds1 = new VirtualDatasetUI(); ds1.setFullPathList(path1.toPathList()); ds1.setVersion(version); ds1.setSavedTag(idVersionPair == null ? null : idVersionPair.getValue()); ds1.setName(name); ds1.setState(new VirtualDatasetState() .setFrom(new FromTable(path1.toPathString()).wrap())); ds1.getState().setColumnsList(asList(new Column("foo", new ExpColumnReference("bar").wrap()))); ds1.setSql("select * from " + table); ds1.setId(idVersionPair == null ? null : idVersionPair.getKey()); ViewFieldType type = new ViewFieldType("hello", "float"); ds1.setSqlFieldsList(Collections.singletonList(type)); ds1.setCalciteFieldsList(Collections.singletonList(type)); service.put(ds1); service.putVersion(ds1); VirtualDatasetUI dsOut = service.get(path1); return Pair.of(dsOut.getId(), dsOut.getSavedTag()); }