// 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.
= Table Views

Apache Ignite 3.0 Alpha introduces the key-value API to access cached data via built-in table views.

[NOTE]
====
Please note that the key-value API requires using a case sensitive collation for the database object names and parsing a string argument of the name that is passed through the API.

See the examples below:

* String values:
+
[source,text]
----
// Creates PUBLIC.MYTABLE.
CREATE TABLE MyTable (id INT, val INT);

// Returns PUBLIC.MYTABLE.
ignite.tables().table("public.mytable"); ->

// Creates PUBLIC.MyTable.
CREATE TABLE \"MyTable\" (id INT, val INT); ->

// Returns PUBLIC.MyTable.
ignite.tables().table("public.\"MyTable\""); ->
----

* Tuples or columns:
+
[source,text]
----
// Creates PUBLIC.MYTABLE (ID, Id, VAL).
CREATE TABLE MyTable (id INT, \"Id\" INT, val INT);

Tuple tuple = ...

// Returns ID column's value.
tuple.value("id")

// Returns ID column's value.
tuple.value("Id")

// Returns Id column's value.
tuple.value("\"Id\"")
----

====

== Key-Value View

This table view maps key objects to value objects. The view cannot contain duplicate key objects; each key object can map to at most one value object.

=== Running an Example

Examples are shipped as a separate Maven project, which is located in the `examples` folder. `KeyValueViewExample` demonstrates the usage of the key-value view.

To start running `KeyValueViewExample`, please refer to its link:https://github.com/apache/ignite-3/blob/main/examples/src/main/java/org/apache/ignite/example/table/KeyValueViewExample.java[JavaDoc,window=_blank] for instructions.

== Record View

This table view provides methods to access table records.

=== Running an Example

Examples are shipped as a separate Maven project, which is located in the `examples` folder. `RecordViewExample` demonstrates the usage of the record view.

To start running `RecordViewExample`, please refer to its link:https://github.com/apache/ignite-3/blob/main/examples/src/main/java/org/apache/ignite/example/table/RecordViewExample.java[JavaDoc,window=_blank] for instructions.

== Record Binary View

NOTE: This is a table view implementation for the binary objects.

You can use binary objects to access the cached data. The benefit of using binary objects is that you avoid deserialization, which is important if you access objects from a server node that does not have the object’s class representation.

For more information on record binary view, please see the following link:https://github.com/apache/ignite-3/blob/main/modules/table/src/main/java/org/apache/ignite/internal/table/RecordBinaryViewImpl.java[implementation example,window=_blank].