/*
 * Copyright 2016-2018 shardingsphere.io.
 * <p>
 * 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.
 * </p>
 */

package io.shardingsphere.core.parsing.parser.context.selectitem;

import com.google.common.base.Optional;
import com.google.common.base.Strings;
import io.shardingsphere.core.parsing.lexer.token.DefaultKeyword;
import io.shardingsphere.core.util.SQLUtil;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

/**
 * Distinct select item.
 *
 * @author panjuan
 */
@Getter
@EqualsAndHashCode
@ToString
@RequiredArgsConstructor
public final class DistinctSelectItem implements SelectItem {
    
    private final String distinctColumnName;
    
    private final Optional<String> alias;

    @Override
    public String getExpression() {
        return Strings.isNullOrEmpty(distinctColumnName) ? DefaultKeyword.DISTINCT.name() : SQLUtil.getExactlyValue(DefaultKeyword.DISTINCT + " " + distinctColumnName);
    }
    
    /**
     * Get column label.
     *
     * @return column label
     */
    public String getColumnLabel() {
        return alias.isPresent() ? alias.get() : getExpression();
    }
}

@@ -710,24 +710,22 @@
 on.base.
-Optional
+Joiner
 ;%0Aimport
@@ -748,23 +748,24 @@
 on.base.
-Strings
+Optional
 ;%0Aimport
@@ -941,55 +941,94 @@
 bok.
-RequiredArgsConstructor;%0Aimport lombok.ToString
+ToString;%0A%0Aimport java.util.Collection;%0Aimport java.util.HashSet;%0Aimport java.util.Set
 ;%0A%0A/
@@ -1122,33 +1122,8 @@
 ing%0A
-@RequiredArgsConstructor%0A
 publ
@@ -1203,22 +1203,27 @@
 e final 
+Set%3C
 String
+%3E
  distinc
@@ -1233,16 +1233,35 @@
 lumnName
+s = new HashSet%3C%3E()
 ;%0A    %0A 
@@ -1300,16 +1300,225 @@
 %3E alias;
+%0A    %0A    public DistinctSelectItem(final Collection%3CString%3E distinctColumnNames, final Optional%3CString%3E alias) %7B%0A        this.distinctColumnNames.addAll(distinctColumnNames);%0A        this.alias = alias;%0A    %7D
 %0A%0A    @O
@@ -1573,37 +1573,24 @@
     
-return Strings.isNullOrEmpty(
+%0A        return 
 dist
@@ -1603,16 +1603,26 @@
 lumnName
+s.isEmpty(
 ) ? Defa
@@ -1706,16 +1706,37 @@
 + %22 %22 + 
+Joiner.on(%22, %22).join(
 distinct
@@ -1745,16 +1745,18 @@
 lumnName
+s)
 );%0A    %7D

use set of distinctColumnNames