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

com.outworkers.phantom.builder.query.Parts.scala Maven / Gradle / Ivy

/*
 * Copyright 2013 - 2020 Outworkers Ltd.
 *
 * 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 com.outworkers.phantom.builder.query

import com.outworkers.phantom.builder.QueryBuilder
import com.outworkers.phantom.builder.query.engine.{CQLQuery, MergeList, QueryPart}
import com.outworkers.phantom.builder.syntax.CQLSyntax

sealed abstract class CQLQueryPart[Part <: CQLQueryPart[Part]](
  override val queries: Seq[CQLQuery]
) extends QueryPart[Part](queries) {

  override def mergeList(list: Seq[CQLQuery]): MergeList = new MergeList(list)
}

sealed class UsingPart(override val queries: Seq[CQLQuery] = Seq.empty) extends CQLQueryPart[UsingPart](queries) {
  override def qb: CQLQuery = {
    if (queries.nonEmpty) {
      QueryBuilder.Update.usingPart(queries)
    } else {
      CQLQuery.empty
    }
  }

  override def instance(l: Seq[CQLQuery]): UsingPart = new UsingPart(l)
}

object UsingPart {
  def empty: UsingPart = new UsingPart()
}

sealed class WherePart(
  override val queries: Seq[CQLQuery] = Seq.empty
) extends CQLQueryPart[WherePart](queries) {
  override def qb: CQLQuery = QueryBuilder.Update.clauses(queries)

  override def instance(list: Seq[CQLQuery]): WherePart = new WherePart(list)
}

object WherePart {
  def empty: WherePart = new WherePart(Nil)
}

sealed class LimitedPart(override val queries: Seq[CQLQuery] = Seq.empty) extends CQLQueryPart[LimitedPart](queries) {
  override def qb: CQLQuery = QueryBuilder.Update.clauses(queries)

  override def instance(l: Seq[CQLQuery]): LimitedPart = new LimitedPart(l)
}

object LimitedPart {
  def empty: LimitedPart = new LimitedPart(Nil)
}

sealed class OrderPart(override val queries: Seq[CQLQuery] = Seq.empty) extends CQLQueryPart[OrderPart](queries) {
  override def qb: CQLQuery = queries match {
    case Seq() => CQLQuery.empty
    case _ => QueryBuilder.Select.Ordering.orderBy(queries)
  }

  override def instance(l: Seq[CQLQuery]): OrderPart = new OrderPart(l)
}

object OrderPart {
  def empty: OrderPart = new OrderPart(Nil)
}

sealed class FilteringPart(override val queries: Seq[CQLQuery] = Seq.empty) extends CQLQueryPart[FilteringPart](queries) {
  override def qb: CQLQuery = QueryBuilder.Update.clauses(queries)

  override def instance(l: Seq[CQLQuery]): FilteringPart = new FilteringPart(l)
}

object FilteringPart {
  def empty: FilteringPart = new FilteringPart()
}

sealed class SetPart(override val queries: Seq[CQLQuery] = Seq.empty) extends CQLQueryPart[SetPart](queries) {

  def appendConditionally(qb: CQLQuery, flag: Boolean): SetPart = {
    if (flag) {
      append(qb)
    } else {
      this
    }
  }

  override def qb: CQLQuery = queries match {
    case Seq() => CQLQuery.empty
    case _ => QueryBuilder.Update.set(QueryBuilder.Update.chain(queries))
  }

  override def instance(l: Seq[CQLQuery]): SetPart = new SetPart(l)
}

object SetPart {
  def empty: SetPart = new SetPart()
}

sealed class CompareAndSetPart(override val queries: Seq[CQLQuery] = Seq.empty) extends CQLQueryPart[CompareAndSetPart](queries) {
  override def qb: CQLQuery = QueryBuilder.Update.clauses(queries)

  override def instance(l: Seq[CQLQuery]): CompareAndSetPart = new CompareAndSetPart(l)
}

object CompareAndSetPart {
  def empty: CompareAndSetPart = new CompareAndSetPart()
}

sealed class ColumnsPart(override val queries: Seq[CQLQuery] = Seq.empty) extends CQLQueryPart[ColumnsPart](queries) {
  override def qb: CQLQuery = QueryBuilder.Insert.columns(queries)

  override def instance(l: Seq[CQLQuery]): ColumnsPart = new ColumnsPart(l)
}

object ColumnsPart {
  def empty: ColumnsPart = new ColumnsPart()
}

sealed class ValuePart(override val queries: Seq[CQLQuery] = Seq.empty) extends CQLQueryPart[ValuePart](queries) {
  override def qb: CQLQuery = QueryBuilder.Insert.values(queries)

  override def instance(l: Seq[CQLQuery]): ValuePart = new ValuePart(l)
}

object ValuePart {
  def empty: ValuePart = new ValuePart()
}

sealed class LightweightPart(override val queries: Seq[CQLQuery] = Seq.empty) extends CQLQueryPart[LightweightPart](queries) {
  override def qb: CQLQuery = QueryBuilder.Update.clauses(queries)

  override def instance(l: Seq[CQLQuery]): LightweightPart = new LightweightPart(l)
}

object LightweightPart {
  def empty: LightweightPart = new LightweightPart()
}

sealed class WithPart(override val queries: Seq[CQLQuery] = Seq.empty) extends CQLQueryPart[WithPart](queries) {
  override def qb: CQLQuery = QueryBuilder.Alter.withOptions(queries)

  override def instance(l: Seq[CQLQuery]): WithPart = new WithPart(l)
}

object WithPart {
  def empty: WithPart = new WithPart()
}

sealed class OptionPart(override val queries: Seq[CQLQuery] = Seq.empty) extends CQLQueryPart[OptionPart](queries) {
  override def qb: CQLQuery = QueryBuilder.Utils.options(queries)

  override def instance(l: Seq[CQLQuery]): OptionPart = new OptionPart(l)

  def option(key: String, value: String): OptionPart = {
    append {
      QueryBuilder.Utils.option(
        CQLQuery.escape(key),
        CQLSyntax.Symbols.colon,
        value
      )
    }
  }

  def option(key: String, value: Boolean): OptionPart = {
    option(key, CQLQuery.escape(value.toString))
  }
}

object OptionPart {

  def apply(qb: CQLQuery): OptionPart = new OptionPart(qb :: Nil)

  def empty: OptionPart = new OptionPart()
}


sealed class AlterPart(
  override val queries: Seq[CQLQuery] = Seq.empty
) extends CQLQueryPart[AlterPart](queries) {
  override def qb: CQLQuery = {
    if (queries.nonEmpty) {
      QueryBuilder.Alter.alter(queries)
    } else {
      CQLQuery.empty
    }
  }

  override def instance(list: Seq[CQLQuery]): AlterPart = new AlterPart(list)
}

object AlterPart {
  def empty: AlterPart = new AlterPart(Nil)
}

sealed class AddPart(
  override val queries: Seq[CQLQuery] = Seq.empty
) extends CQLQueryPart[AddPart](queries) {
  override def qb: CQLQuery = {
    if (queries.nonEmpty) {
      QueryBuilder.Alter.addAll(queries)
    } else {
      CQLQuery.empty
    }
  }

  override def instance(list: Seq[CQLQuery]): AddPart = new AddPart(list)
}

object AddPart {
  def empty: AddPart = new AddPart(Nil)
}


sealed class RenamePart(
  override val queries: Seq[CQLQuery] = Seq.empty
) extends CQLQueryPart[RenamePart](queries) {
  override def qb: CQLQuery = {
    if (queries.nonEmpty) {
      QueryBuilder.Alter.rename(queries)
    } else {
      CQLQuery.empty
    }
  }

  override def instance(list: Seq[CQLQuery]): RenamePart = new RenamePart(list)
}

object RenamePart {
  def empty: RenamePart = new RenamePart(Nil)
}

sealed class DropPart(
  override val queries: Seq[CQLQuery] = Seq.empty
) extends CQLQueryPart[DropPart](queries) {
  override def qb: CQLQuery = {
    if (queries.nonEmpty) {
      QueryBuilder.Alter.dropAll(queries)
    } else {
      CQLQuery.empty
    }
  }

  override def instance(list: Seq[CQLQuery]): DropPart = new DropPart(list)
}

object DropPart {
  def empty: DropPart = new DropPart(Nil)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy