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

br.com.objectos.sql.Level Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2015 Objectos, Fábrica de Software LTDA.
 *
 * 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 br.com.objectos.sql;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeSpec;

/**
 * @author [email protected] (Marcio Endo)
 */
class Level {

  private final String packageName;
  private final int level;

  private final List stepList;

  private final TypeName abstractSimpleSelectWhereTypeName;
  private final TypeName rowTypeName;
  private final TypeName selectNodeTypeName;
  private final TypeName simpleSelectOrderByTypeName;
  private final ClassName simpleSelectWhereClassName;
  private final TypeName simpleSelectWhereTypeName;
  private final ClassName simpleSelectWhereIntClassName;
  private final ClassName simpleSelectWhereLocalDateClassName;
  private final ClassName simpleSelectWhereStringClassName;

  private Level(String packageName, int level, List stepList) {
    this.packageName = packageName;
    this.level = level;
    this.stepList = stepList;

    abstractSimpleSelectWhereTypeName = parameterizedTypeNameLevel("AbstractSimpleSelectWhere");
    rowTypeName = parameterizedTypeNameLevel("Row");
    selectNodeTypeName = ParameterizedTypeName.get(Naming.SelectNode, rowTypeName);
    simpleSelectOrderByTypeName = parameterizedTypeNameLevel("SimpleSelectOrderBy");
    simpleSelectWhereClassName = classNameLevel("SimpleSelectWhere");
    simpleSelectWhereTypeName = parameterizedTypeNameLevel("SimpleSelectWhere");
    simpleSelectWhereIntClassName = classNameLevel("SimpleSelectWhere", "Int");
    simpleSelectWhereLocalDateClassName = classNameLevel("SimpleSelectWhere", "LocalDate");
    simpleSelectWhereStringClassName = classNameLevel("SimpleSelectWhere", "String");
  }

  public static Level of(String packageName, int level) {
    return new Level(
        packageName,
        level,
        range(level)
            .mapToObj(Step::of)
            .collect(Collectors.toList()));
  }

  public static IntStream range(int level) {
    return IntStream.rangeClosed(1, level);
  }

  public TypeName abstractSimpleSelectWhereTypeName() {
    return abstractSimpleSelectWhereTypeName;
  }

  public ClassName className(String simpleName) {
    return ClassName.get(packageName, simpleName);
  }

  public ClassName className(String simpleName, String simpleName2) {
    return ClassName.get(packageName, simpleName, simpleName2);
  }

  public ClassName classNameLevel(String simpleName) {
    return ClassName.get(packageName, simpleName + level);
  }

  public ClassName classNameLevel(String simpleName, String suffix) {
    return ClassName.get(packageName, simpleName + level + suffix);
  }

  public boolean filter(int development) {
    return level != development;
  }

  public Stream generate() {
    return Stream.of(
        AbstractSimpleSelectWhereType.of(this).generate(),
        InsertType.of(this).generate(),
        InsertableRowType.of(this).generate(),
        InsertValuesType.of(this).generate(),
        RowType.of(this).generate(),
        SelectType.of(this).generate(),
        SelectFromType.of(this).generate(),
        SimpleSelectOrderByType.of(this).generate(),
        SimpleSelectQueryType.of(this).generate(),
        SimpleSelectWhereType.of(this).generate(),
        SimpleSelectWhereIntType.of(this).generate(),
        SimpleSelectWhereLocalDateType.of(this).generate(),
        SimpleSelectWhereStringType.of(this).generate());
  }

  public JavaFile generate(TypeSpec type) {
    return JavaFile.builder(packageName, type)
        .skipJavaLangImports(true)
        .build();
  }

  public ParameterizedTypeName parameterizedTypeName(ClassName className, TypeName... more) {
    Stream stepStream = stepList.stream().map(Step::t);
    Stream moreStream = Stream.of(more);
    TypeName[] types = Stream.concat(stepStream, moreStream).toArray(TypeName[]::new);
    return ParameterizedTypeName.get(className, types);
  }

  public ParameterizedTypeName parameterizedTypeNameLevel(String simpleName) {
    return parameterizedTypeName(classNameLevel(simpleName));
  }

  public ParameterizedTypeName parameterizedTypeNameLevel(String simpleName, String suffix) {
    return parameterizedTypeName(classNameLevel(simpleName, suffix));
  }

  public IntStream range() {
    return range(level);
  }

  public TypeName rowTypeName() {
    return rowTypeName;
  }

  public TypeName selectNodeTypeName() {
    return selectNodeTypeName;
  }

  public TypeName simpleSelectOrderByTypeName() {
    return simpleSelectOrderByTypeName;
  }

  public ClassName simpleSelectWhereClassName() {
    return simpleSelectWhereClassName;
  }

  public TypeName simpleSelectWhereTypeName() {
    return simpleSelectWhereTypeName;
  }

  public ClassName simpleSelectWhereIntClassName() {
    return simpleSelectWhereIntClassName;
  }

  public ClassName simpleSelectWhereLocalDateClassName() {
    return simpleSelectWhereLocalDateClassName;
  }

  public ClassName simpleSelectWhereStringClassName() {
    return simpleSelectWhereStringClassName;
  }

  public List stepList() {
    return stepList;
  }

  public  List stepList(Function mapper) {
    return stepList.stream().map(mapper).collect(Collectors.toList());
  }

  public  Stream stepStream(Function mapper) {
    return stepList.stream().map(mapper);
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy