@Test public void testOverlayDatasource() 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 OverlayDatasource(nameToDatasource, new ConfigThingy("", "NAME \"overlay\" SOURCE \"mock\" OVERLAY \"mock2\" MODE \"so\" MATCH (\"join\" \"join\")"), null); assertEquals("overlay", ds.getName()); assertEquals(List.of("column", "join", "column2", "join"), ds.getSchema()); QueryResults results = ds.getContents(); assertEquals(0, results.size()); results = ds.getDatasetsByKey(List.of("ds")); assertEquals(1, results.size()); results = ds.getDatasetsByKey(List.of("ds3")); assertEquals(1, results.size()); results = ds.find(List.of(new QueryPart("column2", "value2"))); assertEquals(1, results.size()); results = ds.find(List.of(new QueryPart("column", "value"))); assertEquals(1, results.size()); assertTrue(ds.find(List.of()).isEmpty()); }
public OverlayDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc, URL context) { name = parseConfig(sourceDesc, "NAME", () -> L.m("NAME der Datenquelle fehlt")); String mode = parseConfig(sourceDesc, "MODE", () -> L.m("MODE-Angabe der Datenquelle '%1' fehlt", name)); String lcMode = mode.toLowerCase(); if ("so".equals(lcMode)) modeSO = true; else if ("os".equals(lcMode)) modeSO = false; else throw new ConfigurationErrorException( L.m("Fehlerhafte MODE-Angabe bei Datenquelle '%1': MODE \"%2\" ist nicht erlaubt", name, mode)); treatEmptyStringsAsNull = Character.isLowerCase(mode.charAt(1)); source1Name = parseConfig(sourceDesc, "SOURCE", () -> L.m("SOURCE der Datenquelle %1 fehlt", name)); source2Name = parseConfig(sourceDesc, "OVERLAY", () -> L.m("OVERLAY-Angabe der Datenquelle %1 fehlt", name)); 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)); schema1 = new HashSet<>(source1.getSchema()); schema2 = new HashSet<>(source2.getSchema()); schema = new ArrayList<>(schema1); schema.addAll(schema2); 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]; commonMatchColumns = new HashSet<>(); 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(L.m("Spalte \"%1\" ist nicht im Schema", spalte1)); if (!schema2.contains(spalte2)) throw new ConfigurationErrorException(L.m("Spalte \"%1\" ist nicht im Schema", spalte2)); match1[i] = spalte1; match2[i] = spalte2; if (spalte1.equals(spalte2)) { commonMatchColumns.add(spalte1); } } }
OverlayDatasource extends Datasource { public OverlayDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc, URL context) { name = parseConfig(sourceDesc, "NAME", () -> L.m("NAME der Datenquelle fehlt")); String mode = parseConfig(sourceDesc, "MODE", () -> L.m("MODE-Angabe der Datenquelle '%1' fehlt", name)); String lcMode = mode.toLowerCase(); if ("so".equals(lcMode)) modeSO = true; else if ("os".equals(lcMode)) modeSO = false; else throw new ConfigurationErrorException( L.m("Fehlerhafte MODE-Angabe bei Datenquelle '%1': MODE \"%2\" ist nicht erlaubt", name, mode)); treatEmptyStringsAsNull = Character.isLowerCase(mode.charAt(1)); source1Name = parseConfig(sourceDesc, "SOURCE", () -> L.m("SOURCE der Datenquelle %1 fehlt", name)); source2Name = parseConfig(sourceDesc, "OVERLAY", () -> L.m("OVERLAY-Angabe der Datenquelle %1 fehlt", name)); 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)); schema1 = new HashSet<>(source1.getSchema()); schema2 = new HashSet<>(source2.getSchema()); schema = new ArrayList<>(schema1); schema.addAll(schema2); 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]; commonMatchColumns = new HashSet<>(); 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(L.m("Spalte \"%1\" ist nicht im Schema", spalte1)); if (!schema2.contains(spalte2)) throw new ConfigurationErrorException(L.m("Spalte \"%1\" ist nicht im Schema", spalte2)); match1[i] = spalte1; match2[i] = spalte2; if (spalte1.equals(spalte2)) { commonMatchColumns.add(spalte1); } } } }
OverlayDatasource extends Datasource { public OverlayDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc, URL context) { name = parseConfig(sourceDesc, "NAME", () -> L.m("NAME der Datenquelle fehlt")); String mode = parseConfig(sourceDesc, "MODE", () -> L.m("MODE-Angabe der Datenquelle '%1' fehlt", name)); String lcMode = mode.toLowerCase(); if ("so".equals(lcMode)) modeSO = true; else if ("os".equals(lcMode)) modeSO = false; else throw new ConfigurationErrorException( L.m("Fehlerhafte MODE-Angabe bei Datenquelle '%1': MODE \"%2\" ist nicht erlaubt", name, mode)); treatEmptyStringsAsNull = Character.isLowerCase(mode.charAt(1)); source1Name = parseConfig(sourceDesc, "SOURCE", () -> L.m("SOURCE der Datenquelle %1 fehlt", name)); source2Name = parseConfig(sourceDesc, "OVERLAY", () -> L.m("OVERLAY-Angabe der Datenquelle %1 fehlt", name)); 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)); schema1 = new HashSet<>(source1.getSchema()); schema2 = new HashSet<>(source2.getSchema()); schema = new ArrayList<>(schema1); schema.addAll(schema2); 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]; commonMatchColumns = new HashSet<>(); 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(L.m("Spalte \"%1\" ist nicht im Schema", spalte1)); if (!schema2.contains(spalte2)) throw new ConfigurationErrorException(L.m("Spalte \"%1\" ist nicht im Schema", spalte2)); match1[i] = spalte1; match2[i] = spalte2; if (spalte1.equals(spalte2)) { commonMatchColumns.add(spalte1); } } } OverlayDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc,
      URL context); }
OverlayDatasource extends Datasource { public OverlayDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc, URL context) { name = parseConfig(sourceDesc, "NAME", () -> L.m("NAME der Datenquelle fehlt")); String mode = parseConfig(sourceDesc, "MODE", () -> L.m("MODE-Angabe der Datenquelle '%1' fehlt", name)); String lcMode = mode.toLowerCase(); if ("so".equals(lcMode)) modeSO = true; else if ("os".equals(lcMode)) modeSO = false; else throw new ConfigurationErrorException( L.m("Fehlerhafte MODE-Angabe bei Datenquelle '%1': MODE \"%2\" ist nicht erlaubt", name, mode)); treatEmptyStringsAsNull = Character.isLowerCase(mode.charAt(1)); source1Name = parseConfig(sourceDesc, "SOURCE", () -> L.m("SOURCE der Datenquelle %1 fehlt", name)); source2Name = parseConfig(sourceDesc, "OVERLAY", () -> L.m("OVERLAY-Angabe der Datenquelle %1 fehlt", name)); 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)); schema1 = new HashSet<>(source1.getSchema()); schema2 = new HashSet<>(source2.getSchema()); schema = new ArrayList<>(schema1); schema.addAll(schema2); 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]; commonMatchColumns = new HashSet<>(); 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(L.m("Spalte \"%1\" ist nicht im Schema", spalte1)); if (!schema2.contains(spalte2)) throw new ConfigurationErrorException(L.m("Spalte \"%1\" ist nicht im Schema", spalte2)); match1[i] = spalte1; match2[i] = spalte2; if (spalte1.equals(spalte2)) { commonMatchColumns.add(spalte1); } } } OverlayDatasource(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(); }
OverlayDatasource extends Datasource { public OverlayDatasource(Map<String, Datasource> nameToDatasource, ConfigThingy sourceDesc, URL context) { name = parseConfig(sourceDesc, "NAME", () -> L.m("NAME der Datenquelle fehlt")); String mode = parseConfig(sourceDesc, "MODE", () -> L.m("MODE-Angabe der Datenquelle '%1' fehlt", name)); String lcMode = mode.toLowerCase(); if ("so".equals(lcMode)) modeSO = true; else if ("os".equals(lcMode)) modeSO = false; else throw new ConfigurationErrorException( L.m("Fehlerhafte MODE-Angabe bei Datenquelle '%1': MODE \"%2\" ist nicht erlaubt", name, mode)); treatEmptyStringsAsNull = Character.isLowerCase(mode.charAt(1)); source1Name = parseConfig(sourceDesc, "SOURCE", () -> L.m("SOURCE der Datenquelle %1 fehlt", name)); source2Name = parseConfig(sourceDesc, "OVERLAY", () -> L.m("OVERLAY-Angabe der Datenquelle %1 fehlt", name)); 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)); schema1 = new HashSet<>(source1.getSchema()); schema2 = new HashSet<>(source2.getSchema()); schema = new ArrayList<>(schema1); schema.addAll(schema2); 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]; commonMatchColumns = new HashSet<>(); 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(L.m("Spalte \"%1\" ist nicht im Schema", spalte1)); if (!schema2.contains(spalte2)) throw new ConfigurationErrorException(L.m("Spalte \"%1\" ist nicht im Schema", spalte2)); match1[i] = spalte1; match2[i] = spalte2; if (spalte1.equals(spalte2)) { commonMatchColumns.add(spalte1); } } } OverlayDatasource(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();  }