Skip to content

Commit

Permalink
Dubbo2.7.5: Add Page and Prioritized interface (#26)
Browse files Browse the repository at this point in the history
* Add Page Support

* add comment

* Add Comment

* README.md

* Fix review comment

* fix review

* Fix review

* Add priority definition

* Add comments

* Fix review
  • Loading branch information
flycash authored Mar 3, 2020
1 parent 3631266 commit 0356c06
Show file tree
Hide file tree
Showing 5 changed files with 207 additions and 7 deletions.
18 changes: 11 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ A go sdk for [Apache Dubbo-go](github.com/apache/dubbo-go).
## math

* Decimal

## runtime

* GoSafely
> Using `go` in a safe way.
* GoUnterminated
> Run a goroutine in a safe way whose task is long live as the whole process life time.

## runtime

* GoSafely
> Using `go` in a safe way.
* GoUnterminated
> Run a goroutine in a safe way whose task is long live as the whole process life time.
## sync

Expand All @@ -45,3 +45,7 @@ A go sdk for [Apache Dubbo-go](github.com/apache/dubbo-go).

Timer optimization through time-wheel.

## page

Page for pagination. It contains the most common functions like offset, pagesize.

86 changes: 86 additions & 0 deletions page/page.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* 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 gxpage

// Page is the default implementation of Page interface
type Page struct {
requestOffset int
pageSize int
totalSize int
data []interface{}
totalPages int
hasNext bool
}

// GetOffSet will return the offset
func (d *Page) GetOffset() int {
return d.requestOffset
}

// GetPageSize will return the page size
func (d *Page) GetPageSize() int {
return d.pageSize
}

// GetTotalPages will return the number of total pages
func (d *Page) GetTotalPages() int {
return d.totalPages
}

// GetData will return the data
func (d *Page) GetData() []interface{} {
return d.data
}

// GetDataSize will return the size of data.
// it's len(GetData())
func (d *Page) GetDataSize() int {
return len(d.GetData())
}

// HasNext will return whether has next page
func (d *Page) HasNext() bool {
return d.hasNext
}

// HasData will return whether this page has data.
func (d *Page) HasData() bool {
return d.GetDataSize() > 0
}

// New will create an instance
func New(requestOffset int, pageSize int,
data []interface{}, totalSize int) *Page {

remain := totalSize % pageSize
totalPages := totalSize / pageSize
if remain > 0 {
totalPages++
}

hasNext := totalSize-requestOffset-pageSize > 0

return &Page{
requestOffset: requestOffset,
pageSize: pageSize,
data: data,
totalSize: totalSize,
totalPages: totalPages,
hasNext: hasNext,
}
}
42 changes: 42 additions & 0 deletions page/page_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* 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 gxpage

import (
"testing"
)

import (
"github.com/stretchr/testify/assert"
)

func TestNewDefaultPage(t *testing.T) {
data := make([]interface{}, 10)
page := New(121, 10, data, 499)

assert.Equal(t, 10, page.GetDataSize())
assert.Equal(t, 121, page.GetOffset())
assert.Equal(t, 10, page.GetPageSize())
assert.Equal(t, 50, page.GetTotalPages())
assert.Equal(t, data, page.GetData())
assert.True(t, page.HasNext())
assert.True(t, page.HasData())

page = New(492, 10, data, 499)
assert.False(t, page.HasNext())
}
44 changes: 44 additions & 0 deletions page/pager.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* 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 gxpage

// Pager is the abstraction for pagination usage.
type Pager interface {

// GetOffset will return the offset
GetOffset() int

// GetPageSize will return the page size
GetPageSize() int

// GetTotalPages will return the number of total pages
GetTotalPages() int

// GetData will return the data
GetData() []interface{}

// GetDataSize will return the size of data.
// Usually it's len(GetData())
GetDataSize() int

// HasNext will return whether has next page
HasNext() bool

// HasData will return whether this page has data.
HasData() bool
}
24 changes: 24 additions & 0 deletions sort/prioritized.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* 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 gxsort

// Prioritizer is the abstraction of priority.
type Prioritizer interface {
// GetPriority will return the priority
GetPriority() int
}

0 comments on commit 0356c06

Please sign in to comment.