All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.questdb.griffin.engine.functions.eq.EqIPv4FunctionFactory Maven / Gradle / Ivy

/*******************************************************************************
 *     ___                  _   ____  ____
 *    / _ \ _   _  ___  ___| |_|  _ \| __ )
 *   | | | | | | |/ _ \/ __| __| | | |  _ \
 *   | |_| | |_| |  __/\__ \ |_| |_| | |_) |
 *    \__\_\\__,_|\___||___/\__|____/|____/
 * 

* Copyright (c) 2014-2019 Appsicle * Copyright (c) 2019-2023 QuestDB *

* 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.questdb.griffin.engine.functions.eq; import io.questdb.cairo.CairoConfiguration; import io.questdb.cairo.sql.Function; import io.questdb.cairo.sql.Record; import io.questdb.griffin.FunctionFactory; import io.questdb.griffin.PlanSink; import io.questdb.griffin.SqlException; import io.questdb.griffin.SqlExecutionContext; import io.questdb.griffin.engine.functions.NegatableBooleanFunction; import io.questdb.griffin.engine.functions.UnaryFunction; import io.questdb.std.IntList; import io.questdb.std.ObjList; import static io.questdb.std.Numbers.IPv4_NULL; public class EqIPv4FunctionFactory implements FunctionFactory { @Override public String getSignature() { return "=(XX)"; } @Override public boolean isBoolean() { return true; } @Override public Function newInstance( int position, ObjList args, IntList argPositions, CairoConfiguration configuration, SqlExecutionContext sqlExecutionContext ) throws SqlException { final Function a = args.getQuick(0); final Function b = args.getQuick(1); if (!a.isConstant() && b.isConstant()) { return createHalfConstantFunc(b, a); } else if (a.isConstant() && !b.isConstant()) { return createHalfConstantFunc(a, b); } return new EqIPv4FunctionFactory.Func(a, b); } static Function createHalfConstantFunc(Function constFunc, Function varFunc) { int constValue = constFunc.getIPv4(null); if (constValue == IPv4_NULL) { return new EqIPv4FunctionFactory.NullCheckFunc(varFunc); } return new EqIPv4FunctionFactory.ConstCheckFunc(varFunc, constValue); } private static class ConstCheckFunc extends NegatableBooleanFunction implements UnaryFunction { private final Function arg; private final int constant; public ConstCheckFunc(Function arg, int constant) { this.arg = arg; this.constant = constant; } @Override public Function getArg() { return arg; } @Override public boolean getBool(Record rec) { return negated != (arg.getIPv4(rec) == constant); } @Override public void toPlan(PlanSink sink) { sink.val(arg); if (negated) { sink.val('!'); } sink.val('=').val(constant).val('\''); } } static class Func extends AbstractEqBinaryFunction { public Func(Function left, Function right) { super(left, right); } @Override public boolean getBool(Record rec) { return negated != (left.getIPv4(rec) == right.getIPv4(rec)); } @Override public String getName() { if (negated) { return "!="; } else { return "="; } } } public static class NullCheckFunc extends NegatableBooleanFunction implements UnaryFunction { private final Function arg; public NullCheckFunc(Function arg) { this.arg = arg; } @Override public Function getArg() { return arg; } @Override public boolean getBool(Record rec) { return negated != (arg.getIPv4(rec) == IPv4_NULL); } @Override public void toPlan(PlanSink sink) { sink.val(arg); if (negated) { sink.val(" is not null "); } else { sink.val(" is null"); } } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy