Skip to content

Commit

Permalink
Added New LargeList API, cleaned up Large Object code
Browse files Browse the repository at this point in the history
  • Loading branch information
khaf committed May 30, 2015
1 parent 416c2cc commit 4f760cd
Show file tree
Hide file tree
Showing 5 changed files with 170 additions and 86 deletions.
170 changes: 133 additions & 37 deletions large_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,91 +22,181 @@ type LargeList struct {
// NewLargeList initializes a large list operator.
func NewLargeList(client *Client, policy *WritePolicy, key *Key, binName string, userModule string) *LargeList {
return &LargeList{
baseLargeObject: newLargeObject(client, policy, key, binName, userModule),
baseLargeObject: newLargeObject(client, policy, key, binName, userModule, "llist"),
}
}

func (ll *LargeList) packageName() string {
return "llist"
}

// Add adds values to the list.
// If the list does not exist, create it using specified userModule configuration.
func (ll *LargeList) Add(values ...interface{}) error {
var err error
if len(values) == 1 {
_, err = ll.client.Execute(ll.policy, ll.key, ll.packageName(), "add", ll.binName, NewValue(values[0]), ll.userModule)
} else {
_, err = ll.client.Execute(ll.policy, ll.key, ll.packageName(), "add_all", ll.binName, ToValueArray(values), ll.userModule)
}
// If the list does not exist, create it
func (ll *LargeList) Add(values ...interface{}) (err error) {
_, err = ll.client.Execute(ll.policy, ll.key, ll.packageName, "add", ll.binName, ToValueArray(values))
return err
}

// Update updates/adds each value in values list depending if key exists or not.
func (ll *LargeList) Update(values ...interface{}) error {
var err error
if len(values) == 1 {
_, err = ll.client.Execute(ll.policy, ll.key, ll.packageName(), "update", ll.binName, NewValue(values[0]), ll.userModule)
} else {
_, err = ll.client.Execute(ll.policy, ll.key, ll.packageName(), "update_all", ll.binName, ToValueArray(values), ll.userModule)
}
func (ll *LargeList) Update(values ...interface{}) (err error) {
_, err = ll.client.Execute(ll.policy, ll.key, ll.packageName, "update", ll.binName, ToValueArray(values))
return err
}

// Remove deletes value from list.
func (ll *LargeList) Remove(value interface{}) error {
_, err := ll.client.Execute(ll.policy, ll.key, ll.packageName(), "remove", ll.binName, NewValue(value))
func (ll *LargeList) Remove(values ...interface{}) (err error) {
_, err = ll.client.Execute(ll.policy, ll.key, ll.packageName, "remove", ll.binName, ToValueArray(values))
return err
}

// Find selects values from list.
func (ll *LargeList) Find(value interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName(), "find", ll.binName, NewValue(value))
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "find", ll.binName, NewValue(value))
if err != nil {
return nil, err
}

if res == nil {
return nil, nil
return []interface{}{}, nil
}
return res.([]interface{}), err
}

// FindThenFilter selects values from list and applies specified Lua filter.
func (ll *LargeList) FindThenFilter(value interface{}, filterName string, filterArgs ...interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName(), "find_then_filter", ll.binName, NewValue(value), ll.userModule, NewValue(filterName), ToValueArray(filterArgs))
func (ll *LargeList) FindThenFilter(value interface{}, filterModule, filterName string, filterArgs ...interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "find", ll.binName, NewValue(value), NewValue(filterModule), NewValue(filterName), ToValueArray(filterArgs))
if err != nil {
return nil, err
}

if res == nil {
return nil, nil
return []interface{}{}, nil
}
return res.([]interface{}), err
}

// Select a range of values from the large list.
func (ll *LargeList) Range(minValue, maxValue interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName(), "range", ll.binName, NewValue(minValue), NewValue(maxValue))
// Select values from the beginning of list up to a maximum count.
func (ll *LargeList) FindFirst(count int) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "find_first", ll.binName, NewValue(count))
if err != nil {
return nil, err
}

if res == nil {
return []interface{}{}, nil
}
return res.([]interface{}), err
}

// Select values from the beginning of list up to a maximum count after applying lua filter.
func (ll *LargeList) FFilterThenindFirst(count int, filterModule, filterName string, filterArgs ...interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "find_first", ll.binName, NewValue(count), NewValue(filterModule), NewValue(filterName), ToValueArray(filterArgs))
if err != nil {
return nil, err
}

if res == nil {
return []interface{}{}, nil
}
return res.([]interface{}), err
}

// Select values from the end of list up to a maximum count.
func (ll *LargeList) FindLast(count int) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "find_last", ll.binName, NewValue(count))
if err != nil {
return nil, err
}

if res == nil {
return []interface{}{}, nil
}
return res.([]interface{}), err
}

// Select values from the end of list up to a maximum count after applying lua filter.
func (ll *LargeList) FilterThenFindLast(count int, filterModule, filterName string, filterArgs ...interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "find_last", ll.binName, NewValue(count), NewValue(filterModule), NewValue(filterName), ToValueArray(filterArgs))
if err != nil {
return nil, err
}

if res == nil {
return []interface{}{}, nil
}
return res.([]interface{}), err
}

// Select values from the begin key up to a maximum count.
func (ll *LargeList) FindFrom(begin interface{}, count int) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "find_from", ll.binName, NewValue(begin), NewValue(count))
if err != nil {
return nil, err
}

if res == nil {
return []interface{}{}, nil
}
return res.([]interface{}), err
}

// Select values from the begin key up to a maximum count after applying lua filter.
func (ll *LargeList) FilterThenFindFrom(begin interface{}, count int, filterModule, filterName string, filterArgs ...interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "find_from", ll.binName, NewValue(begin), NewValue(count), NewValue(filterModule), NewValue(filterName), ToValueArray(filterArgs))
if err != nil {
return nil, err
}

if res == nil {
return nil, nil
return []interface{}{}, nil
}
return res.([]interface{}), err
}

// Select a range of values from the large list.
func (ll *LargeList) RangeThenFilter(minValue, maxValue interface{}, filterName string, filterArgs ...interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName(), "range", ll.binName, NewValue(minValue), NewValue(maxValue), ll.userModule, NewValue(filterName), ToValueArray(filterArgs))
func (ll *LargeList) Range(begin, end interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "find_range", ll.binName, NewValue(begin), NewValue(end))
if err != nil {
return nil, err
}

if res == nil {
return []interface{}{}, nil
}
return res.([]interface{}), err
}

// Select a range of values up to a maximum count from the large list.
func (ll *LargeList) RangeN(begin, end interface{}, count int) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "find_range", ll.binName, NewValue(begin), NewValue(end), NewValue(count))
if err != nil {
return nil, err
}

if res == nil {
return []interface{}{}, nil
}
return res.([]interface{}), err
}

// Select a range of values from the large list then apply filter.
func (ll *LargeList) RangeThenFilter(begin, end interface{}, filterModule string, filterName string, filterArgs ...interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "range", ll.binName, NewValue(begin), NewValue(end), NewValue(0), NewValue(filterModule), NewValue(filterName), ToValueArray(filterArgs))
if err != nil {
return nil, err
}

if res == nil {
return []interface{}{}, nil
}
return res.([]interface{}), err
}

// Select a range of values up to a maximum count from the large list then apply filter.
func (ll *LargeList) RangeNThenFilter(begin, end interface{}, count int, filterModule string, filterName string, filterArgs ...interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "range", ll.binName, NewValue(begin), NewValue(end), NewValue(count), NewValue(filterModule), NewValue(filterName), ToValueArray(filterArgs))
if err != nil {
return nil, err
}

if res == nil {
return nil, nil
return []interface{}{}, nil
}
return res.([]interface{}), err
}
Expand All @@ -117,14 +207,14 @@ func (ll *LargeList) Scan() ([]interface{}, error) {
}

// Filter selects values from list and apply specified Lua filter.
func (ll *LargeList) Filter(filterName string, filterArgs ...interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName(), "filter", ll.binName, ll.userModule, NewValue(filterName), ToValueArray(filterArgs))
func (ll *LargeList) Filter(filterModule, filterName string, filterArgs ...interface{}) ([]interface{}, error) {
res, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "scan", ll.binName, NewValue(filterModule), NewValue(filterName), ToValueArray(filterArgs))
if err != nil {
return nil, err
}

if res == nil {
return nil, nil
return []interface{}{}, nil
}
return res.([]interface{}), err
}
Expand All @@ -139,6 +229,12 @@ func (ll *LargeList) Size() (int, error) {
return ll.size(ll)
}

// Set LDT page size.
func (ll *LargeList) SetPageSize(pageSize int) error {
_, err := ll.client.Execute(ll.policy, ll.key, ll.packageName, "setPageSize", ll.binName, NewValue(pageSize))
return err
}

// GetConfig returns map of list configuration parameters.
func (ll *LargeList) GetConfig() (map[interface{}]interface{}, error) {
return ll.getConfig(ll)
Expand Down
20 changes: 8 additions & 12 deletions large_map.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,31 +30,27 @@ type LargeMap struct {
// NewLargeMap initializes a large map operator.
func NewLargeMap(client *Client, policy *WritePolicy, key *Key, binName string, userModule string) *LargeMap {
return &LargeMap{
baseLargeObject: newLargeObject(client, policy, key, binName, userModule),
baseLargeObject: newLargeObject(client, policy, key, binName, userModule, "lmap"),
}
}

func (lm *LargeMap) packageName() string {
return "lmap"
}

// Put adds an entry to the map.
// If the map does not exist, create it using specified userModule configuration.
func (lm *LargeMap) Put(name interface{}, value interface{}) error {
_, err := lm.client.Execute(lm.policy, lm.key, lm.packageName(), "put", lm.binName, NewValue(name), NewValue(value), lm.userModule)
_, err := lm.client.Execute(lm.policy, lm.key, lm.packageName, "put", lm.binName, NewValue(name), NewValue(value), lm.userModule)
return err
}

// PutMap adds map values to the map.
// If the map does not exist, create it using specified userModule configuration.
func (lm *LargeMap) PutMap(theMap map[interface{}]interface{}) error {
_, err := lm.client.Execute(lm.policy, lm.key, lm.packageName(), "put_all", lm.binName, NewMapValue(theMap), lm.userModule)
_, err := lm.client.Execute(lm.policy, lm.key, lm.packageName, "put_all", lm.binName, NewMapValue(theMap), lm.userModule)
return err
}

// Check existence of key in the map.
func (lm *LargeMap) Exists(keyValue interface{}) (bool, error) {
res, err := lm.client.Execute(lm.policy, lm.key, lm.packageName(), "exists", lm.binName, NewValue(keyValue))
res, err := lm.client.Execute(lm.policy, lm.key, lm.packageName, "exists", lm.binName, NewValue(keyValue))

if err != nil {
return false, err
Expand All @@ -68,7 +64,7 @@ func (lm *LargeMap) Exists(keyValue interface{}) (bool, error) {

// Get returns value from map corresponding with the provided key.
func (lm *LargeMap) Get(name interface{}) (map[interface{}]interface{}, error) {
res, err := lm.client.Execute(lm.policy, lm.key, lm.packageName(), "get", lm.binName, NewValue(name))
res, err := lm.client.Execute(lm.policy, lm.key, lm.packageName, "get", lm.binName, NewValue(name))

if err != nil {
return nil, err
Expand All @@ -82,13 +78,13 @@ func (lm *LargeMap) Get(name interface{}) (map[interface{}]interface{}, error) {

// Remove deletes a value from map given a key.
func (lm *LargeMap) Remove(name interface{}) error {
_, err := lm.client.Execute(lm.policy, lm.key, lm.packageName(), "remove", lm.binName, NewValue(name))
_, err := lm.client.Execute(lm.policy, lm.key, lm.packageName, "remove", lm.binName, NewValue(name))
return err
}

// Scan returns all objects in the map.
func (lm *LargeMap) Scan() (map[interface{}]interface{}, error) {
res, err := lm.client.Execute(lm.policy, lm.key, lm.packageName(), "scan", lm.binName)
res, err := lm.client.Execute(lm.policy, lm.key, lm.packageName, "scan", lm.binName)
if err != nil {
return nil, err
}
Expand All @@ -101,7 +97,7 @@ func (lm *LargeMap) Scan() (map[interface{}]interface{}, error) {

// Filter selects items from the map.
func (lm *LargeMap) Filter(filterName string, filterArgs ...interface{}) (map[interface{}]interface{}, error) {
res, err := lm.client.Execute(lm.policy, lm.key, lm.packageName(), "filter", lm.binName, lm.userModule, NewStringValue(filterName), ToValueArray(filterArgs))
res, err := lm.client.Execute(lm.policy, lm.key, lm.packageName, "filter", lm.binName, lm.userModule, NewStringValue(filterName), ToValueArray(filterArgs))
if err != nil {
return nil, err
}
Expand Down
32 changes: 16 additions & 16 deletions large_object.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ package aerospike

// LargeObject interface defines methods to work with LDTs.
type LargeObject interface {
packageName() string

// Destroy the bin containing LDT.
Destroy() error
// Size returns the size of the LDT.
Expand All @@ -28,11 +26,12 @@ type LargeObject interface {

// Create and manage a large object within a single bin. A large object is last in/first out (LIFO).
type baseLargeObject struct {
client *Client
policy *WritePolicy
key *Key
binName Value
userModule Value
client *Client
policy *WritePolicy
key *Key
binName Value
userModule Value
packageName string
}

// Initialize large large object operator.
Expand All @@ -42,12 +41,13 @@ type baseLargeObject struct {
// key unique record identifier
// binName bin name
// userModule Lua function name that initializes list configuration parameters, pass nil for default large object
func newLargeObject(client *Client, policy *WritePolicy, key *Key, binName string, userModule string) *baseLargeObject {
func newLargeObject(client *Client, policy *WritePolicy, key *Key, binName, userModule string, packageName string) *baseLargeObject {
r := &baseLargeObject{
client: client,
policy: policy,
key: key,
binName: NewStringValue(binName),
client: client,
policy: policy,
key: key,
binName: NewStringValue(binName),
packageName: packageName,
}

if userModule == "" {
Expand All @@ -61,13 +61,13 @@ func newLargeObject(client *Client, policy *WritePolicy, key *Key, binName strin

// Delete bin containing the object.
func (lo *baseLargeObject) destroy(ifc LargeObject) error {
_, err := lo.client.Execute(lo.policy, lo.key, ifc.packageName(), "destroy", lo.binName)
_, err := lo.client.Execute(lo.policy, lo.key, lo.packageName, "destroy", lo.binName)
return err
}

// Return size of object.
func (lo *baseLargeObject) size(ifc LargeObject) (int, error) {
ret, err := lo.client.Execute(lo.policy, lo.key, ifc.packageName(), "size", lo.binName)
ret, err := lo.client.Execute(lo.policy, lo.key, lo.packageName, "size", lo.binName)
if err != nil {
return -1, err
}
Expand All @@ -80,7 +80,7 @@ func (lo *baseLargeObject) size(ifc LargeObject) (int, error) {

// Return map of object configuration parameters.
func (lo *baseLargeObject) getConfig(ifc LargeObject) (map[interface{}]interface{}, error) {
res, err := lo.client.Execute(lo.policy, lo.key, ifc.packageName(), "get_config", lo.binName)
res, err := lo.client.Execute(lo.policy, lo.key, lo.packageName, "get_config", lo.binName)
if err != nil {
return nil, err
}
Expand All @@ -93,7 +93,7 @@ func (lo *baseLargeObject) getConfig(ifc LargeObject) (map[interface{}]interface

// Return list of all objects on the large object.
func (lo *baseLargeObject) scan(ifc LargeObject) ([]interface{}, error) {
ret, err := lo.client.Execute(lo.policy, lo.key, ifc.packageName(), "scan", lo.binName)
ret, err := lo.client.Execute(lo.policy, lo.key, lo.packageName, "scan", lo.binName)
if err != nil {
return nil, err
}
Expand Down
Loading

0 comments on commit 4f760cd

Please sign in to comment.