private static void translateCreateToWith(String sql, KylinConfig config) throws IOException { Pair<String, String> translated = translateCreateToWithInternal(sql); String identifier = translated.getFirst(); String sql1 = translated.getSecond(); TempStatementManager manager = TempStatementManager.getInstance(config); if (manager.getTempStatement(identifier) == null || !manager.getTempStatement(identifier).equals(sql1)) { manager.updateTempStatement(identifier, sql1); } }
public void removeTempStatement(String statementId) throws IOException { removeTempStatement(TempStatementEntity.DEFAULT_SESSION_ID, statementId); }
static TempStatementManager newInstance(KylinConfig config) throws IOException { return new TempStatementManager(config); }
public void updateTempStatement(String sessionId, String statementId, String statement) throws IOException { try (AutoLock l = lock.lockForWrite()) { TempStatementEntity entity = new TempStatementEntity(sessionId, statementId, statement); entity = prepareToOverwrite(entity, getTempStatEntity(sessionId, statementId)); updateTempStatementWithRetry(entity, 0); } }
private static String appendWith(String sql, KylinConfig config) { if (!config.isConvertCreateTableToWith() || isWith(sql)) { return sql; } String[] splits = sql.split("\\W+"); StringBuilder builder = new StringBuilder(); Set<String> appended = new HashSet<>(); TempStatementManager manager = TempStatementManager.getInstance(config); for (String s : splits) { if (manager.getTempStatement(s) != null && !appended.contains(s)) { appended.add(s); if (appended.size() == 1) { builder.append(WITH); } else { builder.append(","); } builder.append(manager.getTempStatement(s)).append(" "); } } return builder.append(sql).toString(); } }
@Test public void testUpdateTempStatement() throws IOException { TempStatementManager manager = TempStatementManager.getInstance(getTestConfig()); manager.updateTempStatement("temp_table1", "AAAAA"); Assert.assertEquals(2, manager.reloadAllTempStatement().size()); Assert.assertEquals("AAAAA", manager.getTempStatement("temp_table1")); } }
@Test public void testAddTempStatement() throws IOException { TempStatementManager manager = TempStatementManager.getInstance(getTestConfig()); manager.updateTempStatement("temp_table3", "AAAAA"); Assert.assertEquals(3, manager.reloadAllTempStatement().size()); }
@Test public void testRemoveTempStatement() throws IOException { TempStatementManager manager = TempStatementManager.getInstance(getTestConfig()); manager.removeTempStatement("temp_table1"); Assert.assertEquals(1, manager.reloadAllTempStatement().size()); }
public String getTempStatement(String statementId) { return getTempStatement(TempStatementEntity.DEFAULT_SESSION_ID, statementId); }
public void updateTempStatement(String statementId, String statement) throws IOException { updateTempStatement(TempStatementEntity.DEFAULT_SESSION_ID, statementId, statement); }
private void updateTempStatementWithRetry(TempStatementEntity entity, int retry) throws IOException { try { crud.save(entity); } catch (WriteConflictException ise) { logger.warn("Write conflict to update temp statement" + entity.statementId + " at try " + retry + ", will retry..."); if (retry >= 7) { logger.error("Retried 7 times till got error, abandoning...", ise); throw ise; } TempStatementEntity reload = crud.reload(entity.resourceName()); entity = prepareToOverwrite(entity, reload); updateTempStatementWithRetry(entity, ++retry); } }
@Test public void testGetInstance() { Assert.assertNotNull(TempStatementManager.getInstance(getTestConfig())); }
private TempStatementManager(KylinConfig cfg) throws IOException { this.config = cfg; this.tmpStatMap = new CaseInsensitiveStringCache<>(config, "temp_statement"); this.crud = new CachedCrudAssist<TempStatementEntity>(getStore(), ResourceStore.TEMP_STATMENT_RESOURCE_ROOT, TempStatementEntity.class, tmpStatMap) { @Override protected TempStatementEntity initEntityAfterReload(TempStatementEntity t, String resourceName) { return t; // noop } }; crud.reloadAll(); // touch lower level metadata before registering my listener Broadcaster.getInstance(config).registerListener(new TempStatementSyncListener(), "temp_statement"); }
public String getTempStatement(String sessionId, String statementId) { TempStatementEntity entity = getTempStatEntity(sessionId, statementId); return entity == null ? null : entity.statement; }
private static String appendWith(String sql, KylinConfig config) { if (!config.isConvertCreateTableToWith() || isWith(sql)) { return sql; } String[] splits = sql.split("\\W+"); StringBuilder builder = new StringBuilder(); Set<String> appended = new HashSet<>(); TempStatementManager manager = TempStatementManager.getInstance(config); for (String s : splits) { if (manager.getTempStatement(s) != null && !appended.contains(s)) { appended.add(s); if (appended.size() == 1) { builder.append(WITH); } else { builder.append(","); } builder.append(manager.getTempStatement(s)).append(" "); } } return builder.append(sql).toString(); } }
public void updateTempStatement(String sessionId, String statementId, String statement) throws IOException { try (AutoLock l = lock.lockForWrite()) { TempStatementEntity entity = new TempStatementEntity(sessionId, statementId, statement); entity = prepareToOverwrite(entity, getTempStatEntity(sessionId, statementId)); updateTempStatementWithRetry(entity, 0); } }
public String getTempStatement(String statementId) { return getTempStatement(TempStatementEntity.DEFAULT_SESSION_ID, statementId); }
public void updateTempStatement(String statementId, String statement) throws IOException { updateTempStatement(TempStatementEntity.DEFAULT_SESSION_ID, statementId, statement); }
private void updateTempStatementWithRetry(TempStatementEntity entity, int retry) throws IOException { try { crud.save(entity); } catch (WriteConflictException ise) { logger.warn("Write conflict to update temp statement" + entity.statementId + " at try " + retry + ", will retry..."); if (retry >= 7) { logger.error("Retried 7 times till got error, abandoning...", ise); throw ise; } TempStatementEntity reload = crud.reload(entity.resourceName()); entity = prepareToOverwrite(entity, reload); updateTempStatementWithRetry(entity, ++retry); } }
private TempStatementManager(KylinConfig cfg) throws IOException { this.config = cfg; this.tmpStatMap = new CaseInsensitiveStringCache<>(config, "temp_statement"); this.crud = new CachedCrudAssist<TempStatementEntity>(getStore(), ResourceStore.TEMP_STATMENT_RESOURCE_ROOT, TempStatementEntity.class, tmpStatMap) { @Override protected TempStatementEntity initEntityAfterReload(TempStatementEntity t, String resourceName) { return t; // noop } }; crud.reloadAll(); // touch lower level metadata before registering my listener Broadcaster.getInstance(config).registerListener(new TempStatementSyncListener(), "temp_statement"); }