Tarantool development patches archive
 help / color / mirror / Atom feed
From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
To: tarantool-patches@dev.tarantool.org, babinoleg@mail.ru,
	alexander.turenko@tarantool.org, imun@tarantool.org
Subject: Re: [Tarantool-patches] [PATCH 2/2] tuple: make box.tuple.is() public
Date: Sun, 16 Feb 2020 16:07:27 +0100	[thread overview]
Message-ID: <33c5c23a-b966-b766-be4f-5e4f23665194@tarantool.org> (raw)
In-Reply-To: <a986784a1b577cde5d64caa59a4a91613f37144d.1581790002.git.v.shpilevoy@tarantool.org>

As Oleg noticed, some other tuple methods were public, but
were not documented. I changed the commit message and doc
request to document them too.

================================================================================

tuple: document all box.tuple.* methods

In #4684 it was found that box.tuple.* contained some private
functions: bless(), encode(), and is().

Bless() and encode() didn't make any sense for a user, so they
were hidden into box.internal.tuple.*.

But box.tuple.is() is actually a useful thing. It is harnessed in
the tests a lot, and is likely to be already used by customers,
because it is available in box.tuple.* for a long time. It is a
matter of time when someone will open a doc ticket saying that
box.tuple.is() is not documented. The patch makes it legally
public.

Alongside it was discovered that tuple:next()/ipairs()/slice()/
upsert() were public, but were not documented. The patch carries a
docbot request for them all.

Follow-up #4684

@TarantoolBot document
Title: box.tuple.is()/next()/ipairs()/slice()/upsert()

```Lua
box.tuple.is(object)
```
A function to check whether a given object is a tuple cdata
object. Returns true or false. Never raises nor returns an error.

```Lua
tuple_object:next(pos)
```
An analogue of Lua `next()` function, but for a tuple object.
Although `tuple:next()` is not really efficient, and it is better
to use `tuple:pairs()/ipairs()`.
```
tarantool> t = box.tuple.new({1, 2, 3})
tarantool> ctx, field = t:next()
tarantool> while field do
    print(field)
    ctx, field = t:next(ctx)
end
tarantool>
1 2 3
```

```Lua
tuple_object:ipairs()
```
The same as `tuple_object:pairs()`. Because tuple fields are
integer always.

```Lua
tuple_object:slice(from[, to])
```
Extract tuple fields by a given range. `From` is not included. So
to take fields starting from the first use `from = 0`. `To` is
included and should be > `from`.
```
tarantool> t = box.tuple.new({1, 2, 3})
tarantool> t:slice(0)
---
- 1
- 2
- 3
...

tarantool> t:slice(0, 1)
---
- 1
...

tarantool> t:slice(1, 3)
---
- 2
- 3
...
```

```Lua
tuple_object:upsert()
```
The same as `tuple_object:update()`, but ignores errors. In case
of an error the tuple is left intact, but an error message is
printed. Only client errors are ignored, such as a bad field type,
or wrong field index/name. System errors, such as OOM, are not
ignored and raised just like with normal `update()`. Note, that
only bad operations are ignored. All correct operations are
applied.
```
tarantool> t = box.tuple.new({1, 2, 3})
tarantool> t2 = t:upsert({{'=', 5, 100}})
UPSERT operation failed:
ER_NO_SUCH_FIELD_NO: Field 5 was not found in the tuple
---
...

tarantool> t
---
- [1, 2, 3]
...

tarantool> t2
---
- [1, 2, 3]
...

tarantool> t2 = t:upsert({{'=', 5, 100}, {'+', 1, 3}})
UPSERT operation failed:
ER_NO_SUCH_FIELD_NO: Field 5 was not found in the tuple
---
...

tarantool> t
---
- [1, 2, 3]
...

tarantool> t2
---
- [4, 2, 3]
...
```
See how in the last example one operation is applied, and one is
not.

All methods of `tuple_object` are also available in `box.tuple.*`,
and a tuple needs to be passed explicitly then. Example below:
```
tarantool> t = box.tuple.new({1, 2, 3})
tarantool> box.tuple.slice(t, 0, 1)
---
- 1
...
```

  reply	other threads:[~2020-02-16 15:07 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-15 18:08 [Tarantool-patches] [PATCH 0/2] box.tuple.* cleanup Vladislav Shpilevoy
2020-02-15 18:08 ` [Tarantool-patches] [PATCH 1/2] tuple: hide internal functions from box.tuple.* Vladislav Shpilevoy
2020-03-16 13:15   ` Nikita Pettik
2020-02-15 18:08 ` [Tarantool-patches] [PATCH 2/2] tuple: make box.tuple.is() public Vladislav Shpilevoy
2020-02-16 15:07   ` Vladislav Shpilevoy [this message]
2020-02-17 20:21     ` Oleg Babin
2020-02-17 21:11       ` Vladislav Shpilevoy
2020-03-16 13:19   ` Nikita Pettik
2020-02-15 19:02 ` [Tarantool-patches] [PATCH 0/2] box.tuple.* cleanup Oleg Babin
2020-02-16 15:07 ` Vladislav Shpilevoy
2020-03-01 14:21 ` Igor Munkin
2020-03-15 17:42 ` Vladislav Shpilevoy
2020-03-15 22:38   ` Nikita Pettik
2020-03-16 14:07 ` Kirill Yukhin
2020-03-16 17:48   ` Nikita Pettik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=33c5c23a-b966-b766-be4f-5e4f23665194@tarantool.org \
    --to=v.shpilevoy@tarantool.org \
    --cc=alexander.turenko@tarantool.org \
    --cc=babinoleg@mail.ru \
    --cc=imun@tarantool.org \
    --cc=tarantool-patches@dev.tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH 2/2] tuple: make box.tuple.is() public' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox