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

kz.greetgo.libase.changes.ChangeComparator Maven / Gradle / Ivy

package kz.greetgo.libase.changes;

import kz.greetgo.libase.model.Relation;
import kz.greetgo.libase.model.Table;
import kz.greetgo.libase.model.View;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class ChangeComparator implements Comparator, Serializable {
  @Override
  public int compare(Change o1, Change o2) {

    {
      int c1 = typeCompareFactor(o1);
      int c2 = typeCompareFactor(o2);
      if (c1 != c2) return c1 - c2;
    }

    {
      View v1 = takeView(o1);
      View v2 = takeView(o2);
      if (v1 != null && v2 != null) {

        Set v1deps = getViewDepends(v1);
        Set v2deps = getViewDepends(v2);

        boolean v1dep2 = v1deps.contains(v2.name);
        boolean v2dep1 = v2deps.contains(v1.name);

        if (v1dep2 && !v2dep1) return +1;
        if (v2dep1 && !v1dep2) return -1;

        return depsName(v1).compareTo(depsName(v2));
      }
    }

    return 0;
  }

  final Map depsNameCache = new HashMap<>();

  private String depsName(View v) {
    {
      String ret = depsNameCache.get(v.name);
      if (ret != null) return ret;
    }
    {
      List list = new ArrayList<>(getViewDepends(v));
      Collections.sort(list);
      StringBuilder sb = new StringBuilder();
      for (String name : list) {
        sb.append(name).append('_');
      }
      sb.append(v.name);
      String ret = sb.toString();
      depsNameCache.put(v.name, ret);
      return ret;
    }
  }

  final Map> viewDependsCache = new HashMap<>();

  private Set getViewDepends(View view) {

    {
      Set ret = viewDependsCache.get(view.name);
      if (ret != null) return ret;
    }

    {
      Set ret = new HashSet<>();
      addAllViewDepends(ret, view);
      ret.remove(view.name);
      viewDependsCache.put(view.name, ret);
      return ret;
    }

  }

  private static void addAllViewDepends(Set depends, View view) {
    if (depends.contains(view.name)) return;
    depends.add(view.name);
    for (Relation r : view.dependences) {
      if (r instanceof View) addAllViewDepends(depends, (View) r);
    }
  }

  private static View takeView(Change o) {
    if (!(o instanceof CreateRelation)) return null;
    CreateRelation cr = (CreateRelation) o;
    if (cr.relation instanceof View) return (View) cr.relation;
    return null;
  }

  private static int typeCompareFactor(Change o) {
    if (o instanceof AddTableField) return 1;
    if (o instanceof AlterField) return 2;
    if (o instanceof CreateRelation) {
      CreateRelation cr = (CreateRelation) o;
      if (cr.relation instanceof Table) return 3;
      if (cr.relation instanceof View) return 4;
      return 5;
    }
    if (o instanceof TableComment) return 6;
    if (o instanceof FieldComment) return 7;
    return 8;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy