public static boolean visit(MappingVisitor visitor, SQLSelectQueryBlock x) {
    if (x.getSelectList().size() == 0) {
      fillSelectList(visitor, x);
    }

    if (x.getSelectList().size() == 1) {
      if (x.getSelectList().get(0).getExpr() instanceof SQLAllColumnExpr) {
        x.getSelectList().clear();
        fillSelectList(visitor, x);
      }
    }

    if (x.getFrom() == null) {
      Entity firstEntity = visitor.getFirstEntity();
      SQLExprTableSource from =
          new SQLExprTableSource(new SQLIdentifierExpr(firstEntity.getName()));
      x.setFrom(from);
    }

    for (SQLSelectItem item : x.getSelectList()) {
      item.setParent(x);
    }

    return true;
  }
  public static boolean visit(MappingVisitor visitor, SQLIdentifierExpr x) {
    String propertyName = x.getName();

    Property property = null;
    for (Entity entity : visitor.getEntities().values()) {
      property = entity.getProperty(propertyName);
      if (property != null) {
        break;
      }
    }

    if (property == null) {
      throw new DruidMappingException("property not found : " + propertyName);
    }

    String dbColumName = property.getDbColumnName();
    x.setName(dbColumName);

    if (x.getParent() instanceof SQLSelectItem) {
      SQLSelectItem selectItem = (SQLSelectItem) x.getParent();
      if (selectItem.getAlias() == null) {
        selectItem.setAlias('"' + property.getName() + '"');
      }
    }

    return false;
  }
  public static void fillSelectList(MappingVisitor visitor, SQLSelectQueryBlock x) {
    Entity entity = visitor.getFirstEntity();

    for (Property item : entity.getProperties().values()) {
      x.getSelectList()
          .add(
              new SQLSelectItem(new SQLIdentifierExpr(item.getName()), '"' + item.getName() + '"'));
    }
  }
  public static boolean visit(MappingVisitor visitor, SQLExprTableSource x) {
    SQLExpr expr = x.getExpr();

    if (expr instanceof SQLIdentifierExpr) {
      SQLIdentifierExpr tableExpr = (SQLIdentifierExpr) expr;
      String entityName = tableExpr.getName();

      Entity entity = visitor.getEntity(entityName);

      if (entity == null) {
        throw new DruidMappingException("entity not foudn : " + entityName);
      }

      tableExpr.setName(entity.getTableName());
    }

    if (x.getAlias() != null) {
      visitor.getTableSources().put(x.getAlias(), x);
    }

    return false;
  }
  protected void setUp() throws Exception {
    Entity entity = new Entity();
    entity.setName("设备");
    entity.setDescription("Device");
    entity.setTableName("device");

    entity.addProperty(new Property("编号", "", "serviceTag"));
    entity.addProperty(new Property("IP地址", "", "ip"));

    engine.addEntity(entity);
  }
 public static void setDataSource(MappingEngine engine, SQLInsertStatement stmt) {
   if (stmt.getTableSource() == null) {
     Entity entity = engine.getFirstEntity();
     stmt.setTableSource(new SQLIdentifierExpr(entity.getName()));
   }
 }