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

org.apache.spark.sql.catalyst.parser.ParserSQL.scala Maven / Gradle / Ivy

package org.apache.spark.sql.catalyst.parser

object ParserSQL {
  /*
  import org.antlr.v4.runtime.{CharStreams, CommonTokenStream}
  case class Deps(tables: List[String], aliases: Map[String, List[String]]) {
    def addTable(name: String): Deps = copy(tables = name :: tables)

    def toAlias(name: String): Deps = Deps.zero.copy(aliases = Map(name.toUpperCase -> this.tables))

    def ++(deps: Deps): Deps = {
      def dealias(name: String): List[String] = aliases.getOrElse(name.toUpperCase, List(name))

      (this, deps) match {
        case (Deps.zero, _) => deps
        case (_, Deps.zero) => this
        case (_, _) =>
          Deps(
            tables ++ deps.tables.flatMap(dealias),
            aliases ++ deps.aliases.mapValues(_.flatMap(dealias))
          )
      }
    }
  }

  object Deps {
    val zero: Deps = Deps(Nil, Map.empty)
  }

  def getTablesName(sql: String): List[String] = {

    val depsBuilder = new SqlBaseParserBaseVisitor[Deps] {
      override def visitTableName(ctx: SqlBaseParser.TableNameContext): Deps =
        super.visitTableName(ctx).addTable(ctx.identifierReference().getText())

      override def visitNamedQuery(ctx: SqlBaseParser.NamedQueryContext): Deps =
        super.visitNamedQuery(ctx).toAlias(ctx.name.getText)

      override def defaultResult(): Deps = Deps.zero
      override def aggregateResult(aggregate: Deps, nextResult: Deps): Deps =
        aggregate ++ nextResult
    }

    def parse(sql: String): List[String] = {
      val lexer = new SqlBaseLexer(
        new UpperCaseCharStream(CharStreams.fromString(sql))
      )
      val tokenStream = new CommonTokenStream(lexer)
      val parser = new SqlBaseParser(tokenStream)
      val parsed = parser.singleStatement()
      val res = depsBuilder.visitSingleStatement(parsed)
      res.tables.distinct
    }

    val sqlWithoutSpecificBQ = sql
      .replaceAll("(?i)except[\\s(]+[^)]*\\)", "")
      .replaceAll("(?i)extract[\\s(]+.*?from.*?[\\s)]*\\)", "dateExtract")
      .replaceAll("(?i)safe_cast[\\s(]+.*?as.*?[\\s)]*\\)", "castField")
      .replaceAll("(?i)\\[[^]]*\\]", "list")
      .replaceAll("(?i)unnest", "")

    val tables = if (sqlWithoutSpecificBQ.nonEmpty) parse(sqlWithoutSpecificBQ) else Nil
    tables.map(_.replaceAll("`", "")) // bigquery project.dataset.table no legacy sql
  }
   */
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy