@Test public void testAttachDatasource() throws Exception { Map<String, Datasource> nameToDatasource = new HashMap<>(); nameToDatasource.put("mock", new MockDatasource("mock", List.of("column", "join"), List.of(new MockDataset("ds", Map.of("column", "value", "join", "join")), new MockDataset("ds3", Map.of("column", "value3", "join", "nojoin"))))); nameToDatasource.put("mock2", new MockDatasource("mock2", List.of("column2", "join"), List.of(new MockDataset("ds2", Map.of("column2", "value2", "join", "join"))))); Datasource ds = new AttachDatasource(nameToDatasource, new ConfigThingy("", "NAME \"attach\" SOURCE \"mock\" ATTACH \"mock2\" MATCH (\"join\", \"join\")"), null); assertEquals("attach", ds.getName()); assertEquals(List.of("column", "join", "mock2__column2", "mock2__join"), ds.getSchema()); QueryResults results = ds.getContents(); assertEquals(0, results.size()); results = ds.getDatasetsByKey(List.of("ds")); assertEquals(1, results.size()); results = ds.find(List.of(new QueryPart("mock2__column2", "value2"))); assertEquals(1, results.size()); results = ds.find(List.of(new QueryPart("column", "value"))); assertEquals(1, results.size()); }
public AttachDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc, URL context) { name = sourceDesc .get("NAME", ConfigurationErrorException.class, L.m("NAME der Datenquelle fehlt")) .toString(); source1Name = sourceDesc.get("SOURCE", ConfigurationErrorException.class, L.m("SOURCE der Datenquelle %1 fehlt", name)).toString(); source2Name = sourceDesc.get("ATTACH", ConfigurationErrorException.class, L.m("ATTACH-Angabe der Datenquelle %1 fehlt", name)).toString(); source1 = nameToDatasource.get(source1Name); source2 = nameToDatasource.get(source2Name); if (source1 == null) throw new ConfigurationErrorException(L.m( "Fehler bei Initialisierung von Datenquelle \"%1\": Referenzierte Datenquelle \"%2\" nicht (oder fehlerhaft) definiert", name, source1Name)); if (source2 == null) throw new ConfigurationErrorException(L.m( "Fehler bei Initialisierung von Datenquelle \"%1\": Referenzierte Datenquelle \"%2\" nicht (oder fehlerhaft) definiert", name, source2Name)); List<String> schema1 = source1.getSchema(); List<String> schema2 = source2.getSchema(); source2Prefix = source2Name + CONCAT_SEPARATOR; schema = new ArrayList<>(schema1); for (String spalte : schema2) { spalte = source2Prefix + spalte; if (schema1.contains(spalte)) throw new ConfigurationErrorException( L.m("Kollision mit Spalte \"%1\" aus Datenquelle \"%2\"", spalte, source1Name)); schema.add(spalte); } ConfigThingy matchesDesc = sourceDesc.query("MATCH"); int numMatches = matchesDesc.count(); if (numMatches == 0) throw new ConfigurationErrorException( L.m("Mindestens eine MATCH-Angabe muss bei Datenquelle \"%1\" gemacht werden", name)); match1 = new String[numMatches]; match2 = new String[numMatches]; Iterator<ConfigThingy> iter = matchesDesc.iterator(); for (int i = 0; i < numMatches; ++i) { ConfigThingy matchDesc = iter.next(); if (matchDesc.count() != 2) throw new ConfigurationErrorException( L.m("Fehlerhafte MATCH Angabe in Datenquelle \"%1\"", name)); String spalte1 = ""; String spalte2 = ""; try { spalte1 = matchDesc.getFirstChild().toString(); spalte2 = matchDesc.getLastChild().toString(); } catch (NodeNotFoundException x) { LOGGER.trace("", x); } if (!schema1.contains(spalte1)) throw new ConfigurationErrorException("Spalte " + spalte1 + " ist nicht im Schema."); if (!schema2.contains(spalte2)) throw new ConfigurationErrorException("Spalte " + spalte2 + " ist nicht im Schema."); match1[i] = spalte1; match2[i] = spalte2; } }
AttachDatasource extends Datasource { public AttachDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc, URL context) { name = sourceDesc .get("NAME", ConfigurationErrorException.class, L.m("NAME der Datenquelle fehlt")) .toString(); source1Name = sourceDesc.get("SOURCE", ConfigurationErrorException.class, L.m("SOURCE der Datenquelle %1 fehlt", name)).toString(); source2Name = sourceDesc.get("ATTACH", ConfigurationErrorException.class, L.m("ATTACH-Angabe der Datenquelle %1 fehlt", name)).toString(); source1 = nameToDatasource.get(source1Name); source2 = nameToDatasource.get(source2Name); if (source1 == null) throw new ConfigurationErrorException(L.m( "Fehler bei Initialisierung von Datenquelle \"%1\": Referenzierte Datenquelle \"%2\" nicht (oder fehlerhaft) definiert", name, source1Name)); if (source2 == null) throw new ConfigurationErrorException(L.m( "Fehler bei Initialisierung von Datenquelle \"%1\": Referenzierte Datenquelle \"%2\" nicht (oder fehlerhaft) definiert", name, source2Name)); List<String> schema1 = source1.getSchema(); List<String> schema2 = source2.getSchema(); source2Prefix = source2Name + CONCAT_SEPARATOR; schema = new ArrayList<>(schema1); for (String spalte : schema2) { spalte = source2Prefix + spalte; if (schema1.contains(spalte)) throw new ConfigurationErrorException( L.m("Kollision mit Spalte \"%1\" aus Datenquelle \"%2\"", spalte, source1Name)); schema.add(spalte); } ConfigThingy matchesDesc = sourceDesc.query("MATCH"); int numMatches = matchesDesc.count(); if (numMatches == 0) throw new ConfigurationErrorException( L.m("Mindestens eine MATCH-Angabe muss bei Datenquelle \"%1\" gemacht werden", name)); match1 = new String[numMatches]; match2 = new String[numMatches]; Iterator<ConfigThingy> iter = matchesDesc.iterator(); for (int i = 0; i < numMatches; ++i) { ConfigThingy matchDesc = iter.next(); if (matchDesc.count() != 2) throw new ConfigurationErrorException( L.m("Fehlerhafte MATCH Angabe in Datenquelle \"%1\"", name)); String spalte1 = ""; String spalte2 = ""; try { spalte1 = matchDesc.getFirstChild().toString(); spalte2 = matchDesc.getLastChild().toString(); } catch (NodeNotFoundException x) { LOGGER.trace("", x); } if (!schema1.contains(spalte1)) throw new ConfigurationErrorException("Spalte " + spalte1 + " ist nicht im Schema."); if (!schema2.contains(spalte2)) throw new ConfigurationErrorException("Spalte " + spalte2 + " ist nicht im Schema."); match1[i] = spalte1; match2[i] = spalte2; } } }
AttachDatasource extends Datasource { public AttachDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc, URL context) { name = sourceDesc .get("NAME", ConfigurationErrorException.class, L.m("NAME der Datenquelle fehlt")) .toString(); source1Name = sourceDesc.get("SOURCE", ConfigurationErrorException.class, L.m("SOURCE der Datenquelle %1 fehlt", name)).toString(); source2Name = sourceDesc.get("ATTACH", ConfigurationErrorException.class, L.m("ATTACH-Angabe der Datenquelle %1 fehlt", name)).toString(); source1 = nameToDatasource.get(source1Name); source2 = nameToDatasource.get(source2Name); if (source1 == null) throw new ConfigurationErrorException(L.m( "Fehler bei Initialisierung von Datenquelle \"%1\": Referenzierte Datenquelle \"%2\" nicht (oder fehlerhaft) definiert", name, source1Name)); if (source2 == null) throw new ConfigurationErrorException(L.m( "Fehler bei Initialisierung von Datenquelle \"%1\": Referenzierte Datenquelle \"%2\" nicht (oder fehlerhaft) definiert", name, source2Name)); List<String> schema1 = source1.getSchema(); List<String> schema2 = source2.getSchema(); source2Prefix = source2Name + CONCAT_SEPARATOR; schema = new ArrayList<>(schema1); for (String spalte : schema2) { spalte = source2Prefix + spalte; if (schema1.contains(spalte)) throw new ConfigurationErrorException( L.m("Kollision mit Spalte \"%1\" aus Datenquelle \"%2\"", spalte, source1Name)); schema.add(spalte); } ConfigThingy matchesDesc = sourceDesc.query("MATCH"); int numMatches = matchesDesc.count(); if (numMatches == 0) throw new ConfigurationErrorException( L.m("Mindestens eine MATCH-Angabe muss bei Datenquelle \"%1\" gemacht werden", name)); match1 = new String[numMatches]; match2 = new String[numMatches]; Iterator<ConfigThingy> iter = matchesDesc.iterator(); for (int i = 0; i < numMatches; ++i) { ConfigThingy matchDesc = iter.next(); if (matchDesc.count() != 2) throw new ConfigurationErrorException( L.m("Fehlerhafte MATCH Angabe in Datenquelle \"%1\"", name)); String spalte1 = ""; String spalte2 = ""; try { spalte1 = matchDesc.getFirstChild().toString(); spalte2 = matchDesc.getLastChild().toString(); } catch (NodeNotFoundException x) { LOGGER.trace("", x); } if (!schema1.contains(spalte1)) throw new ConfigurationErrorException("Spalte " + spalte1 + " ist nicht im Schema."); if (!schema2.contains(spalte2)) throw new ConfigurationErrorException("Spalte " + spalte2 + " ist nicht im Schema."); match1[i] = spalte1; match2[i] = spalte2; } } AttachDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc,
      URL context); }
AttachDatasource extends Datasource { public AttachDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc, URL context) { name = sourceDesc .get("NAME", ConfigurationErrorException.class, L.m("NAME der Datenquelle fehlt")) .toString(); source1Name = sourceDesc.get("SOURCE", ConfigurationErrorException.class, L.m("SOURCE der Datenquelle %1 fehlt", name)).toString(); source2Name = sourceDesc.get("ATTACH", ConfigurationErrorException.class, L.m("ATTACH-Angabe der Datenquelle %1 fehlt", name)).toString(); source1 = nameToDatasource.get(source1Name); source2 = nameToDatasource.get(source2Name); if (source1 == null) throw new ConfigurationErrorException(L.m( "Fehler bei Initialisierung von Datenquelle \"%1\": Referenzierte Datenquelle \"%2\" nicht (oder fehlerhaft) definiert", name, source1Name)); if (source2 == null) throw new ConfigurationErrorException(L.m( "Fehler bei Initialisierung von Datenquelle \"%1\": Referenzierte Datenquelle \"%2\" nicht (oder fehlerhaft) definiert", name, source2Name)); List<String> schema1 = source1.getSchema(); List<String> schema2 = source2.getSchema(); source2Prefix = source2Name + CONCAT_SEPARATOR; schema = new ArrayList<>(schema1); for (String spalte : schema2) { spalte = source2Prefix + spalte; if (schema1.contains(spalte)) throw new ConfigurationErrorException( L.m("Kollision mit Spalte \"%1\" aus Datenquelle \"%2\"", spalte, source1Name)); schema.add(spalte); } ConfigThingy matchesDesc = sourceDesc.query("MATCH"); int numMatches = matchesDesc.count(); if (numMatches == 0) throw new ConfigurationErrorException( L.m("Mindestens eine MATCH-Angabe muss bei Datenquelle \"%1\" gemacht werden", name)); match1 = new String[numMatches]; match2 = new String[numMatches]; Iterator<ConfigThingy> iter = matchesDesc.iterator(); for (int i = 0; i < numMatches; ++i) { ConfigThingy matchDesc = iter.next(); if (matchDesc.count() != 2) throw new ConfigurationErrorException( L.m("Fehlerhafte MATCH Angabe in Datenquelle \"%1\"", name)); String spalte1 = ""; String spalte2 = ""; try { spalte1 = matchDesc.getFirstChild().toString(); spalte2 = matchDesc.getLastChild().toString(); } catch (NodeNotFoundException x) { LOGGER.trace("", x); } if (!schema1.contains(spalte1)) throw new ConfigurationErrorException("Spalte " + spalte1 + " ist nicht im Schema."); if (!schema2.contains(spalte2)) throw new ConfigurationErrorException("Spalte " + spalte2 + " ist nicht im Schema."); match1[i] = spalte1; match2[i] = spalte2; } } AttachDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc,
      URL context); @Override List<String> getSchema(); @Override QueryResults getDatasetsByKey(Collection<String> keys); @Override QueryResults getContents(); @Override QueryResults find(List<QueryPart> query); @Override String getName(); }
AttachDatasource extends Datasource { public AttachDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc, URL context) { name = sourceDesc .get("NAME", ConfigurationErrorException.class, L.m("NAME der Datenquelle fehlt")) .toString(); source1Name = sourceDesc.get("SOURCE", ConfigurationErrorException.class, L.m("SOURCE der Datenquelle %1 fehlt", name)).toString(); source2Name = sourceDesc.get("ATTACH", ConfigurationErrorException.class, L.m("ATTACH-Angabe der Datenquelle %1 fehlt", name)).toString(); source1 = nameToDatasource.get(source1Name); source2 = nameToDatasource.get(source2Name); if (source1 == null) throw new ConfigurationErrorException(L.m( "Fehler bei Initialisierung von Datenquelle \"%1\": Referenzierte Datenquelle \"%2\" nicht (oder fehlerhaft) definiert", name, source1Name)); if (source2 == null) throw new ConfigurationErrorException(L.m( "Fehler bei Initialisierung von Datenquelle \"%1\": Referenzierte Datenquelle \"%2\" nicht (oder fehlerhaft) definiert", name, source2Name)); List<String> schema1 = source1.getSchema(); List<String> schema2 = source2.getSchema(); source2Prefix = source2Name + CONCAT_SEPARATOR; schema = new ArrayList<>(schema1); for (String spalte : schema2) { spalte = source2Prefix + spalte; if (schema1.contains(spalte)) throw new ConfigurationErrorException( L.m("Kollision mit Spalte \"%1\" aus Datenquelle \"%2\"", spalte, source1Name)); schema.add(spalte); } ConfigThingy matchesDesc = sourceDesc.query("MATCH"); int numMatches = matchesDesc.count(); if (numMatches == 0) throw new ConfigurationErrorException( L.m("Mindestens eine MATCH-Angabe muss bei Datenquelle \"%1\" gemacht werden", name)); match1 = new String[numMatches]; match2 = new String[numMatches]; Iterator<ConfigThingy> iter = matchesDesc.iterator(); for (int i = 0; i < numMatches; ++i) { ConfigThingy matchDesc = iter.next(); if (matchDesc.count() != 2) throw new ConfigurationErrorException( L.m("Fehlerhafte MATCH Angabe in Datenquelle \"%1\"", name)); String spalte1 = ""; String spalte2 = ""; try { spalte1 = matchDesc.getFirstChild().toString(); spalte2 = matchDesc.getLastChild().toString(); } catch (NodeNotFoundException x) { LOGGER.trace("", x); } if (!schema1.contains(spalte1)) throw new ConfigurationErrorException("Spalte " + spalte1 + " ist nicht im Schema."); if (!schema2.contains(spalte2)) throw new ConfigurationErrorException("Spalte " + spalte2 + " ist nicht im Schema."); match1[i] = spalte1; match2[i] = spalte2; } } AttachDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc,
      URL context); @Override List<String> getSchema(); @Override QueryResults getDatasetsByKey(Collection<String> keys); @Override QueryResults getContents(); @Override QueryResults find(List<QueryPart> query); @Override String getName();  }