2016-01-27 68 views
12

Tôi rất quan tâm bởi GraphQL cho một giải pháp phân tích (nghĩ về một webapp hiển thị đồ thị). Nhưng tôi không thể tìm thấy bất kỳ ví dụ nào về GraphQL sử dụng hàm tổng hợp. Đây là khía cạnh chính của hầu hết các truy vấn được thực hiện bởi giao diện người dùng của tôi.Hỗ trợ chức năng tổng hợp trong GraphQL

Đối với giải pháp của mình, chúng tôi có 3 cuộc gọi phụ trợ điển hình.

  1. Tìm kiếm
  2. tổng hợp
  3. Time Series

Hãy nói rằng chúng ta có loại này quy định tại GraphQL

type Person { 
    name: String 
    age: Int 
    create_time: Date 
} 
  1. Tìm kiếm

Điều này dường như được xử lý tốt bởi GraphQL. Không có câu hỏi ở đây.

ví dụ: Tìm tuổi của người có tên Bob { Person (tên: "Bob") { tuổi } }

  1. tổng hợp

Đây là trường hợp điển hình Tôi muốn hiển thị thông tin trong Biểu đồ hình tròn. Vì vậy, hãy nói rằng tôi muốn đếm số lượng người theo độ tuổi.

Dưới đây sẽ là truy vấn PostgreSQL:

SELECT age, count(*) from Ticket group by age; 

Điều gì sẽ là tương đương trong GraphQL?

  1. Chuỗi thời gian Đây là trường hợp điển hình mà tôi muốn hiển thị thông tin trong BarChart với trục X là thời gian.

ví dụ: Giả sử tôi muốn đếm số lượng người dùng được tạo mỗi giờ.

Dưới đây sẽ là truy vấn PostgreSQL:

SELECT date_trunc('hour', create_time) as create_time_bin, count(*) from Person group by create_time_bin order by create_time_bin ASC; 

Điều gì sẽ là truy vấn tương đương GraphQL?

+1

Chưa kể, bạn so sánh phạm vi cho vô hướng như SELECT * WHERE timestamp>… AND timestamp <…? Hoặc sắp xếp kết quả theo vô hướng? Tôi không thấy bất kỳ thứ gì trong số này. Tôi đang thiếu gì? –

+0

Bạn thêm thông số vào các trường cho phép loại lọc đó. – Ryan

Trả lời

8

GraphQL, vào cuối ngày, phản hồi các loại được xác định của bạn. Bạn chỉ cần đưa dữ liệu đó vào một loại. Cho dù đây là một loại cụ thể cho các truy vấn khác nhau này hoặc các trường cho dữ liệu đó trên các loại hiện có, điều đó tùy thuộc vào bạn nhưng đó là tất cả những gì mà nó chứa xuống. GraphQL đòi hỏi nhiều nỗ lực hơn về mặt xác định loại của bạn và tất cả các truy vấn sẽ trở lại, điều này làm cho nó trở nên cứng nhắc hơn, nhưng ý tưởng ở phía bên kia là một số tính năng thú vị như kiểm tra nội bộ và kiểm tra kiểu. Nếu nó không có vẻ hợp lý để đưa các cấu trúc dữ liệu "ad hoc" đó vào kiểu GraphQL, thì không có bất kỳ điểm cuối nào không phải là GraphQL nếu bạn cần các nguồn dữ liệu khác.

+0

Tôi nghĩ rằng tôi có được những gì bạn đang nói, nhưng tôi nhận được cách thực hiện này sẽ như thế nào. – Damien

+4

@Damien, mọi truy vấn GraphQL được trả lời bởi hàm resolve(). Các tham số truy vấn bạn cung cấp cho truy vấn là các đối số cho hàm này. Hàm resolve() sau đó biến mất và thực hiện bất cứ điều gì bạn muốn, hãy truy lục kết quả của truy vấn SQL từ nơi khác, sau đó bạn có thể tổng hợp dữ liệu đó theo ý muốn và cuối cùng trả về kết quả của câu trả lời cho truy vấn GraphQL . Điểm là: Bạn phải làm việc tập hợp như thể giải quyết() chỉ là một hàm JS khác trả về các số. Nhưng khách hàng truy vấn không cần phải biết hoặc quan tâm. – batjko

1

@Damien, những vấn đề đó không phải là vấn đề của GraphQL.

Bất cứ khi nào bạn muốn làm điều gì đó trong GraphQL bạn phải xác định một loại dữ liệu trở lại, Spec chức năng bạn thực hiện, và đôi khi một loại của dữ liệu đầu vào để nuôi vào chức năng của bạn. Cuối cùng, bạn viết mã để thực hiện công việc.

Thực tế, có vẻ như bạn (viết lại) mã của bạn bằng ngôn ngữ GraphQL.

Hãy ví dụ nơi bạn muốn hiển thị các thông tin trong một biểu đồ hình tròn:

SELECT age, count(*) from Ticket group by age; 

Xác định dữ liệu của bạn trở lại đây là danh sách các độ tuổi và đếm:

type TickGroupByAge { 
     age: Int 
     count: Int 
    } 

Xác định chức năng của bạn hoặc Truy vấn bằng ngôn ngữ GraphQL:

getTicketGroupByAge : [TickGroupByAge]` 

Cuối cùng viết chức năng để thực hiện truy vấn trên:

async function(){ 
    const res = await client.query("SELECT age, count(*) from Ticket group by age"); 
    return res.rows; 
} 

@Ryan Tôi hoàn toàn đồng ý với bạn rằng GraphQL buộc bạn viết nhiều định nghĩa kiểu để giải quyết một tác vụ đơn giản. Vì lý do đó, tôi đã kết thúc việc xây dựng NextQL - GraphQL-liked engine của riêng tôi tương tự như GraphQL nhưng đơn giản hơn.

Dự án của tôi hỗ trợ các định nghĩa kiểu lồng nhau phức tạp, giúp bạn giải phóng rất nhiều định nghĩa vô dụng.

Các vấn đề liên quan