<!--
/**
 * 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.
 */
-->
<!-- rules used by hbase kafka proxy to route mutations to kafka topics-->
<rules>
<!--
this rule would route all mutations from table default:mytable mycf to mykafkatopic

<rule action="route" table="default:mytable" topic="mykafkatopic"/>

this rule would route all mutations from column family mycf of table default:mytable to
mykafkatopic

<rule action="route" table="default:mytable" columnFamily="mycf" topic="mykafkatopic"/>

this rule would route all mutations from qualifier myqualifier in column family mycf of table
default:mytable to mykafkatopic

<rule action="route" table="default:mytable" columnFamily="mycf" qualifier="myqualifier"
topic="mykafkatopic"/>

this rule would route all mutations from all qualifiers in column family mycf of table
default:mytable to mykafkatopic that start with myqualifier

<rule action="route" table="default:mytable" columnFamily="mycf" qualifier="myqualifier*"
topic="mykafkatopic"/>

this rule would route all mutations from all qualifiers in column family mycf of table
default:mytable to mykafkatopic that contain myqualifier

<rule action="route" table="default:mytable" columnFamily="mycf" qualifier="*myqualifier*"
topic="mykafkatopic"/>

when used together, these rules would route all mutations from column family mycf of table
default:mytable to mykafkatopic except the ones from myqualifier

<rule action="drop" table="default:mytable" columnFamily="mycf" qualifier="myqualifier"
topic="mykafkatopic"/>
<rule action="route" table="default:mytable" columnFamily="mycf" topic="mykafkatopic"/>

when used together, these rules would route all mutations from column family mycf of table
default:mytable to mykafkatopic except the ones that contain secretb in the qualifier name

<rule action="drop" table="default:mytable" columnFamily="mycf" qualifier="*secret*"
topic="mykafkatopic"/>
<rule action="route" table="default:mytable" columnFamily="mycf" topic="mykafkatopic"/>
-->
</rules>
