/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.kylin.cube.model.validation.rule;

import org.apache.kylin.cube.model.CubeDesc;
import org.apache.kylin.cube.model.validation.IValidatorRule;
import org.apache.kylin.cube.model.validation.ValidateContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Validate Dictionary Settings:
 *
 * <ul>
 *     <li> no duplicated dictionary for one column
 *     <li> dictionary can't set both `reuse` and `builder`
 *     <li> transitive `reuse` like "a <- b <- c" is not allowed, force "a <- b, a <- c"
 * </ul>
 */
public class DictionaryRule implements IValidatorRule<CubeDesc> {
    private static final Logger logger = LoggerFactory.getLogger(DictionaryRule.class);

    @Override
    public void validate(CubeDesc cubeDesc, ValidateContext context) {
    }
}
