/** * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.horizondb.db.parser.builders; import io.horizondb.db.Configuration; import io.horizondb.db.HorizonDBException; import io.horizondb.db.databases.DatabaseManager; import io.horizondb.db.parser.HqlBaseListener; import io.horizondb.db.parser.HqlParser.BetweenPredicateContext; import io.horizondb.db.parser.HqlParser.CreateDatabaseContext; import io.horizondb.db.parser.HqlParser.CreateTimeSeriesContext; import io.horizondb.db.parser.HqlParser.DropDatabaseContext; import io.horizondb.db.parser.HqlParser.DropTimeSeriesContext; import io.horizondb.db.parser.HqlParser.FieldDefinitionContext; import io.horizondb.db.parser.HqlParser.FieldsDefinitionContext; import io.horizondb.db.parser.HqlParser.InPredicateContext; import io.horizondb.db.parser.HqlParser.InsertContext; import io.horizondb.db.parser.HqlParser.PredicateContext; import io.horizondb.db.parser.HqlParser.RecordDefinitionContext; import io.horizondb.db.parser.HqlParser.RecordsDefinitionContext; import io.horizondb.db.parser.HqlParser.SelectContext; import io.horizondb.db.parser.HqlParser.SelectListContext; import io.horizondb.db.parser.HqlParser.SimplePredicateContext; import io.horizondb.db.parser.HqlParser.TimeSeriesOptionContext; import io.horizondb.db.parser.HqlParser.UseDatabaseContext; import io.horizondb.db.parser.HqlParser.WhereClauseContext; import io.horizondb.db.parser.MsgBuilder; import io.horizondb.model.protocol.Msg; import io.horizondb.model.protocol.MsgHeader; import java.io.IOException; import org.antlr.v4.runtime.misc.NotNull; /** * <code>MsgBuilder</code> that dispatch to the proper builder based on the received callback. */ public final class MsgBuilderDispatcher extends HqlBaseListener implements MsgBuilder { /** * The database configuration. */ private final Configuration configuration; /** * The database manager. */ private final DatabaseManager databaseManager; /** * The original request header. */ private final MsgHeader requestHeader; /** * The name of the database on which the query must be executed. */ private final String databaseName; /** * The builder to which the calls must be dispatched. */ private MsgBuilder builder; /** * Creates a dispatcher. * * @param configuration the database configuration * @param requestHeader the original request header * @param databaseName the name of the database on which the query must be executed */ public MsgBuilderDispatcher(Configuration configuration, DatabaseManager databaseManager, MsgHeader requestHeader, String databaseName) { this.configuration = configuration; this.databaseManager = databaseManager; this.requestHeader = requestHeader; this.databaseName = databaseName; } /** * {@inheritDoc} */ @Override public void enterCreateDatabase(@NotNull CreateDatabaseContext ctx) { this.builder = new CreateDatabaseMsgBuilder(this.requestHeader); this.builder.enterCreateDatabase(ctx); } /** * {@inheritDoc} */ @Override public void exitUseDatabase(@NotNull UseDatabaseContext ctx) { this.builder.exitUseDatabase(ctx); } /** * {@inheritDoc} */ @Override public void exitCreateDatabase(@NotNull CreateDatabaseContext ctx) { this.builder.exitCreateDatabase(ctx); } /** * {@inheritDoc} */ @Override public void enterFieldsDefinition(@NotNull FieldsDefinitionContext ctx) { this.builder.enterFieldsDefinition(ctx); } /** * {@inheritDoc} */ @Override public void exitFieldsDefinition(@NotNull FieldsDefinitionContext ctx) { this.builder.exitFieldsDefinition(ctx); } /** * {@inheritDoc} */ @Override public void enterRecordDefinition(@NotNull RecordDefinitionContext ctx) { this.builder.enterRecordDefinition(ctx); } /** * {@inheritDoc} */ @Override public void exitRecordDefinition(@NotNull RecordDefinitionContext ctx) { this.builder.exitRecordDefinition(ctx); } /** * {@inheritDoc} */ @Override public void enterFieldDefinition(@NotNull FieldDefinitionContext ctx) { this.builder.enterFieldDefinition(ctx); } /** * {@inheritDoc} */ @Override public void exitFieldDefinition(@NotNull FieldDefinitionContext ctx) { this.builder.exitFieldDefinition(ctx); } /** * {@inheritDoc} */ @Override public void enterRecordsDefinition(@NotNull RecordsDefinitionContext ctx) { this.builder.enterRecordsDefinition(ctx); } /** * {@inheritDoc} */ @Override public void exitRecordsDefinition(@NotNull RecordsDefinitionContext ctx) { this.builder.exitRecordsDefinition(ctx); } /** * {@inheritDoc} */ @Override public void exitCreateTimeSeries(@NotNull CreateTimeSeriesContext ctx) { this.builder.exitCreateTimeSeries(ctx); } /** * {@inheritDoc} */ @Override public void enterUseDatabase(@NotNull UseDatabaseContext ctx) { this.builder = new UseDatabaseMsgBuilder(this.requestHeader); this.builder.enterUseDatabase(ctx); } /** * {@inheritDoc} */ @Override public void enterCreateTimeSeries(@NotNull CreateTimeSeriesContext ctx) { this.builder = new CreateTimeSeriesMsgBuilder(this.configuration, this.databaseManager, this.requestHeader, this.databaseName); this.builder.enterCreateTimeSeries(ctx); } /** * {@inheritDoc} */ @Override public void enterDropDatabase(@NotNull DropDatabaseContext ctx) { this.builder = new DropDatabaseMsgBuilder(this.databaseManager, this.requestHeader, this.databaseName); this.builder.enterDropDatabase(ctx); } /** * {@inheritDoc} */ @Override public void enterDropTimeSeries(@NotNull DropTimeSeriesContext ctx) { this.builder = new DropTimeSeriesMsgBuilder(this.databaseManager, this.requestHeader, this.databaseName); this.builder.enterDropTimeSeries(ctx); } /** * {@inheritDoc} */ @Override public void enterTimeSeriesOption(@NotNull TimeSeriesOptionContext ctx) { this.builder.enterTimeSeriesOption(ctx); } /** * {@inheritDoc} */ @Override public void enterSelect(@NotNull SelectContext ctx) { this.builder = new SelectMsgBuilder(this.databaseManager, this.requestHeader, this.databaseName); this.builder.enterSelect(ctx); } /** * {@inheritDoc} */ @Override public void exitSelect(@NotNull SelectContext ctx) { this.builder.exitSelect(ctx); } /** * {@inheritDoc} */ @Override public void exitWhereClause(@NotNull WhereClauseContext ctx) { this.builder.exitWhereClause(ctx); } /** * {@inheritDoc} */ @Override public void enterWhereClause(@NotNull WhereClauseContext ctx) { this.builder.enterWhereClause(ctx); } /** * {@inheritDoc} */ @Override public void enterPredicate(@NotNull PredicateContext ctx) { this.builder.enterPredicate(ctx); } /** * {@inheritDoc} */ @Override public void exitPredicate(@NotNull PredicateContext ctx) { this.builder.exitPredicate(ctx); } /** * {@inheritDoc} */ @Override public void enterSimplePredicate(@NotNull SimplePredicateContext ctx) { this.builder.enterSimplePredicate(ctx); } /** * {@inheritDoc} */ @Override public void enterInPredicate(@NotNull InPredicateContext ctx) { this.builder.enterInPredicate(ctx); } /** * {@inheritDoc} */ @Override public void enterBetweenPredicate(@NotNull BetweenPredicateContext ctx) { this.builder.enterBetweenPredicate(ctx); } /** * {@inheritDoc} */ @Override public void enterSelectList(@NotNull SelectListContext ctx) { this.builder.enterSelectList(ctx); } /** * {@inheritDoc} */ @Override public void enterInsert(@NotNull InsertContext ctx) { this.builder = new InsertMsgBuilder(this.databaseManager, this.requestHeader, this.databaseName); this.builder.enterInsert(ctx); } /** * {@inheritDoc} */ @Override public Msg<?> build() throws IOException, HorizonDBException { return this.builder.build(); } }