Skill

GraphQL এর মধ্যে Pagination এবং Filtering

গ্রাফকিউএল (GraphQL) - Web Development

283

গ্রাফকিউএল (GraphQL) এর মধ্যে Pagination এবং Filtering ডেটা লোডিং এবং ব্যবস্থাপনার জন্য গুরুত্বপূর্ণ ফিচার। এটি ক্লায়েন্টদের সাহায্য করে বড় আকারের ডেটা সেটগুলো কার্যকরভাবে এবং দক্ষতার সাথে পরিচালনা করতে, যাতে সার্ভার অতিরিক্ত লোডের মুখে না পড়ে এবং ক্লায়েন্টের জন্য ডেটার প্রসেসিং সহজ হয়। এই ফিচার দুটি সাধারণত API এর পারফরম্যান্স এবং ব্যবহারযোগ্যতা বাড়ানোর জন্য ব্যবহৃত হয়।


Pagination (পেইজিনেশন) কী?

Pagination হল ডেটা সেটের মধ্যে ডেটাকে ভাগ করে নিয়ে বিভিন্ন পৃষ্ঠায় (page) প্রদর্শন করার প্রক্রিয়া। যখন ডেটার পরিমাণ অনেক বড় হয়, তখন একে একেবারে এক পৃষ্ঠায় ফেরত আনলে এটি ক্লায়েন্ট বা সার্ভারের জন্য অসুবিধাজনক হতে পারে। Pagination এর মাধ্যমে, আপনি নির্দিষ্ট সংখ্যক ডেটা একবারে ফেরত পেতে পারেন, যেমন প্রতি পৃষ্ঠায় ২০টি, ৫০টি বা ১০০টি আইটেম।

গ্রাফকিউএলে Pagination করার জন্য সাধারণত দুটি পদ্ধতি ব্যবহৃত হয়:

  1. Offset-based pagination
  2. Cursor-based pagination

Offset-based Pagination

এই পদ্ধতিতে, আপনি ডেটার একটি নির্দিষ্ট অবস্থান (offset) থেকে শুরু করে একটি নির্দিষ্ট সংখ্যা (limit) পর্যন্ত ডেটা ফেরত আনেন।

Schema Example:

type Query {
  posts(page: Int!, pageSize: Int!): [Post]
}

type Post {
  id: ID!
  title: String!
  content: String!
}

Resolver Example:

const resolvers = {
  Query: {
    posts: (parent, { page, pageSize }) => {
      const offset = (page - 1) * pageSize;
      return posts.slice(offset, offset + pageSize);
    }
  }
};

এখানে, page হল পৃষ্ঠার নম্বর এবং pageSize হল প্রতিটি পৃষ্ঠায় থাকা আইটেমের সংখ্যা। আপনি ডেটার নির্দিষ্ট অংশ, যেমন প্রথম ২০টি পোস্ট বা পরবর্তী ২০টি পোস্ট ফেরত আনতে পারবেন।


Cursor-based Pagination

Cursor-based pagination-এ, প্রতিটি ডেটা আইটেমের সাথে একটি cursor (অথবা একটি ইউনিক আইডেন্টিফায়ার) যুক্ত থাকে, যা ক্লায়েন্টকে পরবর্তী বা পূর্ববর্তী আইটেমের দিকে স্থানান্তরিত করতে সাহায্য করে।

Schema Example:

type Query {
  posts(after: String, first: Int): PostConnection
}

type Post {
  id: ID!
  title: String!
  content: String!
}

type PostConnection {
  edges: [PostEdge]
  pageInfo: PageInfo
}

type PostEdge {
  cursor: String
  node: Post
}

type PageInfo {
  hasNextPage: Boolean!
  hasPreviousPage: Boolean!
}

Resolver Example:

const resolvers = {
  Query: {
    posts: (parent, { after, first }) => {
      const startIndex = after ? posts.findIndex(post => post.id === after) + 1 : 0;
      const paginatedPosts = posts.slice(startIndex, startIndex + first);

      return {
        edges: paginatedPosts.map(post => ({
          cursor: post.id,
          node: post
        })),
        pageInfo: {
          hasNextPage: startIndex + first < posts.length,
          hasPreviousPage: startIndex > 0
        }
      };
    }
  }
};

এখানে, after হল পূর্ববর্তী একটি পোস্টের cursor এবং first হল পরবর্তী আইটেমের সংখ্যা। PageInfo ব্যবহার করে আপনি জানতে পারবেন যে আরও পাতা রয়েছে কি না (hasNextPage এবং hasPreviousPage)।


Filtering (ফিল্টারিং) কী?

Filtering হল ডেটাকে কিছু নির্দিষ্ট শর্তের ভিত্তিতে ছেঁকে বা ফিল্টার করে বের করা। এটি ডেটা সেটের মধ্যে নির্দিষ্ট আইটেম খুঁজে বের করার জন্য ব্যবহৃত হয়। গ্রাফকিউএলে ফিল্টারিং সাধারণত বিভিন্ন ফিল্টার অপশন প্রদান করে, যেমন নাম, তারিখ, বিভাগ, ইত্যাদি।

Filtering Example

ধরা যাক, আমাদের পোস্টের একটি তালিকা রয়েছে এবং আমরা ব্যবহারকারীদের পোস্টের শিরোনাম বা কনটেন্টের মধ্যে কিছু শব্দ দিয়ে ফিল্টার করতে চাই।

Schema Example:

type Query {
  posts(title: String, content: String): [Post]
}

type Post {
  id: ID!
  title: String!
  content: String!
}

Resolver Example:

const resolvers = {
  Query: {
    posts: (parent, { title, content }) => {
      let filteredPosts = posts;
      
      if (title) {
        filteredPosts = filteredPosts.filter(post => post.title.includes(title));
      }
      
      if (content) {
        filteredPosts = filteredPosts.filter(post => post.content.includes(content));
      }
      
      return filteredPosts;
    }
  }
};

এখানে, আমরা দুটি ফিল্টার প্রয়োগ করেছি—title এবং content। ক্লায়েন্ট যদি title বা content প্যারামিটার দিয়ে কুয়েরি পাঠায়, তাহলে রেজোলভার সেই শর্ত অনুসারে ডেটা ফিল্টার করবে এবং ফেরত দেবে।


Pagination এবং Filtering একসাথে ব্যবহার করা

গ্রাফকিউএলে pagination এবং filtering একসাথে ব্যবহার করা খুবই সাধারণ। আপনি একটি নির্দিষ্ট কুয়েরি দ্বারা ডেটা ফিল্টার করতে পারেন এবং তারপর সেই ডেটার জন্য পেইজিনেশন প্রয়োগ করতে পারেন।

Schema Example (Pagination + Filtering):

type Query {
  posts(title: String, content: String, page: Int!, pageSize: Int!): [Post]
}

type Post {
  id: ID!
  title: String!
  content: String!
}

Resolver Example (Pagination + Filtering):

const resolvers = {
  Query: {
    posts: (parent, { title, content, page, pageSize }) => {
      let filteredPosts = posts;
      
      if (title) {
        filteredPosts = filteredPosts.filter(post => post.title.includes(title));
      }
      
      if (content) {
        filteredPosts = filteredPosts.filter(post => post.content.includes(content));
      }
      
      const offset = (page - 1) * pageSize;
      return filteredPosts.slice(offset, offset + pageSize);
    }
  }
};

এখানে, প্রথমে title এবং content দিয়ে ডেটা ফিল্টার করা হচ্ছে এবং তারপর page এবং pageSize এর মাধ্যমে পেইজিনেশন প্রয়োগ করা হচ্ছে।


সারাংশ

Pagination এবং Filtering গ্রাফকিউএল-এ ডেটা পরিচালনার জন্য গুরুত্বপূর্ণ ফিচার। Pagination এর মাধ্যমে আপনি ডেটার একটি নির্দিষ্ট অংশ ফিরিয়ে আনতে পারেন, এবং Filtering এর মাধ্যমে নির্দিষ্ট শর্ত অনুসারে ডেটা চয়ন করতে পারেন। একসাথে এই দুটি ফিচার ব্যবহার করে আপনি গ্রাফকিউএল API-তে বড় ডেটা সেট সহজে পরিচালনা এবং অ্যাক্সেস করতে পারবেন, যা সার্ভারের উপর লোড কমাতে সহায়তা করে এবং ক্লায়েন্টের জন্য দ্রুত ডেটা আনার সুবিধা দেয়।

Content added By

গ্রাফকিউএল (GraphQL)-এ Pagination হল এমন একটি কৌশল যার মাধ্যমে আপনি অনেক বড় ডেটা সেটকে ছোট ছোট অংশে বিভক্ত করে পর পর লোড করতে পারেন। এটি বিশেষভাবে দরকারি যখন আপনার API থেকে অনেক ডেটা বের করা হয় এবং তা একসাথে লোড করার ফলে সার্ভারের ওপর চাপ পড়ে। Pagination ক্লায়েন্টকে নির্দিষ্ট পরিমাণ ডেটা এনে পরবর্তী অংশগুলির জন্য অনুরোধ করতে সাহায্য করে।


Pagination কী?

Pagination হল একটি প্রযুক্তি যা ডেটাকে পৃষ্ঠাগুলোর মধ্যে ভাগ করে দেয়, যাতে ডেটার সবগুলো অংশ একসঙ্গে লোড না হয়। এটি API রেসপন্সকে ছোট ছোট অংশে ভাগ করে, যেগুলোর মধ্যে ক্লায়েন্ট একটি নির্দিষ্ট সংখ্যক ডেটা নিয়ে আসতে পারে এবং পরবর্তী অংশের জন্য পরবর্তী অনুরোধ করতে পারে।

GraphQL-এর ক্ষেত্রে, Pagination সাধারণত limit এবং offset বা cursor-based pagination দ্বারা নিয়ন্ত্রিত হয়।

Pagination এর বিভিন্ন পদ্ধতি

গ্রাফকিউএল-এ পেজিনেশন করতে দুটি প্রধান পদ্ধতি রয়েছে:

  1. Limit and Offset Pagination
  2. Cursor-based Pagination

১. Limit and Offset Pagination

Limit and Offset Pagination পদ্ধতিতে, আমরা নির্দিষ্ট সংখ্যক ডেটা (limit) এবং কোথা থেকে ডেটা শুরু হবে (offset) নির্ধারণ করি। এটি ডেটাকে পৃষ্ঠা ভিত্তিকভাবে ভাগ করে দেয়, যেখানে ক্লায়েন্ট প্রথম পৃষ্ঠা থেকে নির্দিষ্ট সংখ্যক ডেটা নিয়ে আসে এবং তারপর পরবর্তী পৃষ্ঠা বা অংশের জন্য অনুরোধ করতে পারে।

Example:

ধরা যাক, আপনার একটি Post টাইপ আছে এবং আপনি একটি কুয়েরি করতে চান যা প্রথম ১০টি পোস্ট রিটার্ন করবে। পরবর্তীতে পরবর্তী ১০টি পোস্টের জন্য অনুরোধ পাঠানো হবে।

Schema Example:

type Query {
  posts(limit: Int, offset: Int): [Post]
}

type Post {
  id: ID!
  title: String!
  content: String!
}

এখানে, limit এবং offset আর্গুমেন্ট ব্যবহার করে প্রথমে ১০টি পোস্ট এবং তারপর পরবর্তী ১০টি পোস্ট পাওয়া যাবে।

Query Example:

query {
  posts(limit: 10, offset: 0) {
    id
    title
  }
}

এটি প্রথম ১০টি পোস্ট ফেরত দেবে। পরবর্তী পৃষ্ঠার জন্য, আপনি offset পরিবর্তন করে অনুরোধ করতে পারেন:

query {
  posts(limit: 10, offset: 10) {
    id
    title
  }
}

এটি পরবর্তী ১০টি পোস্ট ফেরত দেবে।


২. Cursor-based Pagination

Cursor-based Pagination পদ্ধতি ডেটার জন্য একটি "cursor" প্রদান করে যা প্রতিটি ডেটার একটি ইউনিক আইডেন্টিফায়ার হিসেবে কাজ করে। প্রতিটি ডেটার একটি cursor থাকে যা পরবর্তী ডেটা পেতে ব্যবহৃত হয়। এটি limit and offset এর তুলনায় আরও নির্ভুল এবং দক্ষ, কারণ এটি ডেটার মধ্যে নির্দিষ্ট স্থানে সঠিকভাবে পৌঁছানোর সুবিধা দেয়।

Example:

Schema Example:

type Query {
  posts(first: Int, after: String): PostConnection
}

type PostConnection {
  edges: [PostEdge]
  pageInfo: PageInfo
}

type PostEdge {
  node: Post
  cursor: String
}

type PageInfo {
  endCursor: String
  hasNextPage: Boolean
}

type Post {
  id: ID!
  title: String!
  content: String!
}

এখানে, first (limit) এবং after (cursor) প্যারামিটার ব্যবহার করা হয়েছে। প্রতিটি PostEdge এর মধ্যে একটি cursor থাকে যা পরবর্তী পেজের জন্য ব্যবহার করা হবে।

Query Example:

query {
  posts(first: 10) {
    edges {
      node {
        id
        title
      }
      cursor
    }
    pageInfo {
      endCursor
      hasNextPage
    }
  }
}

Response Example:

{
  "data": {
    "posts": {
      "edges": [
        { "node": { "id": "1", "title": "Post 1" }, "cursor": "cursor1" },
        { "node": { "id": "2", "title": "Post 2" }, "cursor": "cursor2" },
        // ...
      ],
      "pageInfo": {
        "endCursor": "cursor2",
        "hasNextPage": true
      }
    }
  }
}

এখানে, pageInfo এর endCursor পরবর্তী পেজের জন্য প্রয়োজনীয় cursor প্রদান করে, এবং hasNextPage জানায় যে আরও পেজ আছে কিনা।

পরবর্তী পেজের জন্য কুয়েরি:

query {
  posts(first: 10, after: "cursor2") {
    edges {
      node {
        id
        title
      }
    }
    pageInfo {
      endCursor
      hasNextPage
    }
  }
}

এখানে, "cursor2" হল পূর্ববর্তী পেজের শেষ cursor, যা পরবর্তী পেজের শুরু করার জন্য ব্যবহার করা হয়েছে।


Pagination এর প্রয়োজনীয়তা

Pagination ব্যবহারের প্রধান সুবিধা গুলি হলো:

  1. পারফরম্যান্স এবং স্কেলেবিলিটি:
    যখন একটি API অনেক বড় ডেটা সেট ফেরত দেয়, তখন Pagination ক্লায়েন্টকে শুধুমাত্র প্রয়োজনীয় ডেটার অংশ ফেরত নিয়ে আসতে সাহায্য করে। এতে সার্ভারের ওপর চাপ কমে এবং পারফরম্যান্স বৃদ্ধি পায়।
  2. নেটওয়ার্ক ব্যান্ডউইথ সাশ্রয়:
    ডেটার পুরো সেট একবারে না নিয়ে, ক্লায়েন্ট নির্দিষ্ট পৃষ্ঠা বা অংশের ডেটা আনে, যা নেটওয়ার্ক ব্যান্ডউইথ সাশ্রয় করে।
  3. ব্যবহারকারীর অভিজ্ঞতা:
    Pagination ব্যবহার করলে ব্যবহারকারী বড় ডেটা সেটের মধ্যে সহজে নেভিগেট করতে পারে। এটি দ্রুত এবং আরও নিয়ন্ত্রিত ডেটা প্রদানের মাধ্যমে ব্যবহারকারীর অভিজ্ঞতাকে উন্নত করে।
  4. ডেটার সঠিক প্রদর্শন:
    বড় ডেটা সেটের ক্ষেত্রে Pagination ডেটাকে একটি সুশৃঙ্খল এবং নিয়মিত পদ্ধতিতে দেখাতে সাহায্য করে, যা ক্লায়েন্ট এবং ব্যবহারকারী উভয়ের জন্য উপকারী।

সারাংশ

Pagination হল একটি প্রক্রিয়া যা ডেটা বড় সেট থেকে ছোট ছোট অংশে বিভক্ত করে লোড করতে সাহায্য করে। Limit and Offset এবং Cursor-based Pagination হল দুটি প্রধান পদ্ধতি যা গ্রাফকিউএল API-তে ব্যবহার করা হয়। Pagination ব্যবহার করার মাধ্যমে, ক্লায়েন্ট সহজেই প্রয়োজনীয় ডেটার একটি অংশের জন্য অনুরোধ করতে পারে এবং সার্ভারের কর্মক্ষমতা ও নেটওয়ার্ক ব্যান্ডউইথ সাশ্রয় করতে সাহায্য করে। এটি বড় ডেটা সেটের সাথে কাজ করতে পারফরম্যান্স উন্নত করতে এবং ব্যবহারকারীর অভিজ্ঞতা বৃদ্ধি করতে সহায়ক।

Content added By

গ্রাফকিউএল (GraphQL)-এ Pagination হল একটি গুরুত্বপূর্ণ ফিচার, যা ডেটা একাধিক পৃষ্ঠায় ভাগ করে ক্লায়েন্টের কাছে পাঠানোর জন্য ব্যবহৃত হয়। যখন ডেটার পরিমাণ খুব বড় হয়, তখন একযোগে সব ডেটা ফেরত পাঠানো কার্যকরী নয়। Pagination এর মাধ্যমে ডেটার ছোট ছোট অংশ সরবরাহ করা হয়, যাতে ক্লায়েন্ট একবারে একটি নির্দিষ্ট পরিমাণ ডেটা দেখতে পারে।

গ্রাফকিউএল-এ দুটি প্রধান Pagination কৌশল ব্যবহৃত হয়: Offset-Based Pagination এবং Cursor-Based Pagination


Offset-Based Pagination

Offset-Based Pagination হল সবচেয়ে প্রচলিত এবং সাধারণ Pagination পদ্ধতি। এই পদ্ধতিতে, ডেটা একটি নির্দিষ্ট পরিমাণে বিভক্ত করা হয় এবং ক্লায়েন্টের পক্ষে পরবর্তী বা পূর্ববর্তী ডেটা পাওয়ার জন্য একটি skip এবং limit অথবা offset এবং limit প্যারামিটার ব্যবহার করা হয়। সাধারণত, একটি skip প্যারামিটার ব্যবহার করে নির্দিষ্ট পরিমাণ ডেটা উপেক্ষা করা হয় এবং limit প্যারামিটার ব্যবহার করে কতগুলি ফলাফল ফেরত আসবে তা নির্ধারণ করা হয়।

উদাহরণ:

ধরা যাক, একটি Post টাইপ আছে, যার মধ্যে id, title, এবং content রয়েছে, এবং আপনি একটি posts কুয়েরি তৈরি করতে চান যেখানে ডেটা পেজিনেট করা হবে।

Schema:

type Post {
  id: ID!
  title: String!
  content: String!
}

type Query {
  posts(skip: Int, limit: Int): [Post]
}

এখন, আপনি যখন কুয়েরি করবেন:

query {
  posts(skip: 0, limit: 10) {
    id
    title
    content
  }
}

এখানে:

  • skip: ডেটার কোন অংশ উপেক্ষা করা হবে (এই ক্ষেত্রে 0 থেকে শুরু)।
  • limit: কতগুলি পোস্ট ফেরত আসবে (এই ক্ষেত্রে 10টি পোস্ট)।

Offset-Based Pagination এর সুবিধা:

  1. সহজ Implement করা যায়, কারণ এটি একটি সাধারণ কুয়েরি এবং ফলাফল পাওয়ার জন্য সহজ প্যারামিটার ব্যবহার করে।
  2. ইউজার ইন্টারফেস এ সহজে প্রয়োগ করা যায়।

অসুবিধা:

  1. ডেটা পরিবর্তন হলে সমস্যা হতে পারে: যদি কোনও পোস্ট মুছে যায় বা নতুন পোস্ট যোগ করা হয়, তবে পরবর্তী পৃষ্ঠার ডেটা সঠিকভাবে ফেরত আসতে পারে না। এর ফলে skip এবং limit এর মান সঠিকভাবে কাজ না করার সম্ভাবনা থাকে।
  2. বৃহৎ ডেটা সেটের জন্য কম্প্লেক্স হতে পারে, কারণ প্রতিবার নতুন ডেটা ফেরত পাওয়ার জন্য সার্ভারকে skip করার সংখ্যা হিসাব করতে হয়।

Cursor-Based Pagination

Cursor-Based Pagination একটি উন্নত পদ্ধতি, যা ডেটার নির্দিষ্ট পয়েন্ট বা cursor ব্যবহার করে পরবর্তী বা পূর্ববর্তী ডেটা অ্যাক্সেস করতে সহায়ক হয়। প্রতিটি ডেটা রেকর্ডের সাথে একটি cursor থাকে, যা একটি নির্দিষ্ট ডেটার অবস্থান নির্দেশ করে। ক্লায়েন্ট cursor ব্যবহার করে পরবর্তী পৃষ্ঠায় পৌঁছাতে পারে। এটি সাধারণত ডেটার অর্ডার বজায় রাখতে এবং offset-based pagination এর সমস্যা এড়াতে সাহায্য করে।

উদাহরণ:

ধরা যাক, আমাদের Post টাইপের ডেটা রয়েছে এবং আমরা cursor-based pagination ব্যবহার করতে চাই।

Schema:

type Post {
  id: ID!
  title: String!
  content: String!
  cursor: String!  # Cursor ফিল্ড
}

type PageInfo {
  hasNextPage: Boolean!
  hasPreviousPage: Boolean!
  endCursor: String
  startCursor: String
}

type PostConnection {
  edges: [Post]
  pageInfo: PageInfo
}

type Query {
  posts(first: Int, after: String, last: Int, before: String): PostConnection
}

এখানে:

  • first এবং after প্যারামিটারগুলি প্রথম কয়েকটি পোস্টের জন্য ব্যবহার করা হয়, এবং পরবর্তী পৃষ্ঠার জন্য cursor ব্যবহার করা হয়।
  • last এবং before প্যারামিটারগুলি পূর্ববর্তী পৃষ্ঠা দেখতে সহায়ক হয়।

Cursor-Based Pagination Query Example:

query {
  posts(first: 5, after: "cursor_value") {
    edges {
      id
      title
      content
      cursor
    }
    pageInfo {
      hasNextPage
      hasPreviousPage
      endCursor
      startCursor
    }
  }
}

এখানে:

  • first: প্রথম 5টি পোস্ট পেতে নির্দেশ করে।
  • after: যে পোস্টের পর থেকে নতুন পোস্ট শুরু হবে, তার cursor।
  • endCursor: সর্বশেষ পোস্টের cursor, যা পরবর্তী পৃষ্ঠার জন্য ব্যবহৃত হবে।
  • hasNextPage: যদি পরবর্তী পৃষ্ঠা থাকে তাহলে true হবে।
  • hasPreviousPage: পূর্ববর্তী পৃষ্ঠা থাকলে true হবে।

Cursor-Based Pagination এর সুবিধা:

  1. ডেটা অর্ডার সঠিক রাখা: ডেটার অবস্থান ও সময় পরিবর্তনের কারণে cursor-based pagination ডেটার অর্ডার এবং সঠিকতা বজায় রাখে।
  2. পোস্ট মুছে ফেলা বা যোগ করা হলে সমস্যার সমাধান: cursor-based pagination ডেটার যেকোনো পরিবর্তন (যেমন নতুন ডেটা যোগ করা বা পুরোনো ডেটা মুছে ফেলা) সহ কাজ করতে পারে, কারণ এটি একটি নির্দিষ্ট cursor পয়েন্ট ব্যবহার করে।

অসুবিধা:

  1. কিছুটা জটিল: offset-based pagination এর তুলনায় এটি কিছুটা জটিল হতে পারে, বিশেষ করে ডেটা রিটার্ন করার প্রক্রিয়া এবং cursor তৈরির জন্য অতিরিক্ত লজিক প্রয়োজন।
  2. গ্রাফকিউএল স্কিমা আরও জটিল: cursor-based pagination বাস্তবায়ন করতে আপনাকে আরো জটিল স্কিমা এবং pageInfo এর মতো অতিরিক্ত ফিল্ড যুক্ত করতে হয়।

সারাংশ

Offset-Based Pagination এবং Cursor-Based Pagination দুটি জনপ্রিয় কৌশল গ্রাফকিউএল পেজিনেটিংয়ে ব্যবহৃত হয়। Offset-Based Pagination সহজ এবং দ্রুত বাস্তবায়নযোগ্য হলেও, এতে ডেটার পরিবর্তনের কারণে সমস্যা সৃষ্টি হতে পারে। অপরদিকে, Cursor-Based Pagination ডেটার অবস্থান নির্ধারণের মাধ্যমে সঠিক ফলাফল প্রদান করে এবং পরিবর্তিত ডেটার ক্ষেত্রে আরও নির্ভরযোগ্য, তবে এটি কিছুটা জটিল। গ্রাফকিউএল-এ এই দুটি কৌশল ডেটার পৃষ্ঠায় বিভক্তি এবং ক্লায়েন্টের প্রয়োজন অনুযায়ী ডেটা সরবরাহের ক্ষেত্রে অত্যন্ত কার্যকরী।

Content added By

গ্রাফকিউএল (GraphQL)-এ Filtering এবং Sorting ডেটা ম্যানেজমেন্টের গুরুত্বপূর্ণ অংশ, যা ডেটা সহজে এবং দ্রুত কার্যকরভাবে প্রক্রিয়া এবং বিশ্লেষণ করতে সহায়ক। Filtering এবং Sorting এর মাধ্যমে আপনি ডেটা বেছে নিতে এবং সাজাতে সক্ষম হন, যা কার্যকরভাবে ডেটার প্রক্রিয়াকরণে সহায়ক। এই ধারণাগুলি মূলত Query স্তরে ব্যবহৃত হয়, যাতে ডেটার নির্দিষ্ট অংশ বা একে সাজানো যায়।


Filtering (ফিল্টারিং)

Filtering হল ডেটা থেকে কিছু নির্দিষ্ট মান বের করার প্রক্রিয়া, যেমন একটি নির্দিষ্ট তারিখ, নাম বা মানের সীমা ভিত্তিক ডেটা নির্বাচন করা। GraphQL-এ আপনি বিভিন্ন ফিল্ডের মাধ্যমে ডেটাকে filter করতে পারেন।

Filtering উদাহরণ

ধরা যাক, আমাদের একটি Post টাইপ আছে, এবং আমরা title অথবা date অনুযায়ী ডেটা ফিল্টার করতে চাই। আমাদের স্কিমা এমন হতে পারে:

type Post {
  id: ID!
  title: String!
  content: String!
  date: String!
}

type Query {
  posts(filter: PostFilter): [Post]
}

input PostFilter {
  title: String
  date: String
}

এখানে, আমরা একটি PostFilter ইনপুট টাইপ তৈরি করেছি, যা title এবং date ফিল্টার হিসেবে ব্যবহার করা যাবে।

Filtering কুয়েরি

এখন, আপনি posts কুয়েরির মাধ্যমে ফিল্টার করা ডেটা চেয়ে নিতে পারেন। যেমন:

query {
  posts(filter: { title: "GraphQL", date: "2024-01-01" }) {
    id
    title
    content
    date
  }
}

এখানে:

  • title: আমরা title এর মধ্যে "GraphQL" শব্দের পোস্ট চাচ্ছি।
  • date: আমরা "2024-01-01" তারিখের পোস্টগুলি চাচ্ছি।

এটি শুধুমাত্র সেই পোস্টগুলি ফেরত আনবে যেগুলির শিরোনাম "GraphQL" এবং তারিখ "2024-01-01"।


Sorting (সাজানো)

Sorting হল ডেটা একটি নির্দিষ্ট অর্ডারে সাজানোর প্রক্রিয়া। আপনি ডেটা সময়, নাম, সংখ্যা, বা অন্য কোনো মানের ভিত্তিতে সাজাতে পারেন। GraphQL-এ, আপনি ফিল্টারিংয়ের পাশাপাশি ডেটা sort করতে পারেন, যেমন ascending বা descending অর্ডারে সাজানো।

Sorting উদাহরণ

ধরা যাক, আমাদের Post টাইপের date অনুযায়ী ডেটা সাজানোর প্রয়োজন। আমরা স্কিমায় একটি নতুন ইনপুট টাইপ যোগ করব যা sort এর নির্দেশনা দেবে।

enum SortOrder {
  ASC
  DESC
}

input PostSort {
  field: String!
  order: SortOrder!
}

type Query {
  posts(filter: PostFilter, sort: PostSort): [Post]
}

এখানে:

  • SortOrder: এটি একটি enum যা ASC (Ascending) এবং DESC (Descending) মান গ্রহণ করবে।
  • PostSort: এটি field (যেমন date বা title) এবং order (যেমন ASC বা DESC) গ্রহণ করে।

Sorting কুয়েরি

এখন, আপনি posts কুয়েরির মাধ্যমে ডেটা সাজাতে পারবেন। যেমন:

query {
  posts(sort: { field: "date", order: ASC }) {
    id
    title
    content
    date
  }
}

এখানে:

  • field: আমরা date ফিল্ড অনুযায়ী সাজাতে চাচ্ছি।
  • order: আমরা সাজাতে চাচ্ছি ascending অর্ডারে (অর্থাৎ পুরানো পোস্ট প্রথমে আসবে)।

এই কুয়েরি পুরানো পোস্টগুলো প্রথমে সাজিয়ে দেখাবে।


Filtering এবং Sorting একসাথে ব্যবহার

এখন, আপনি একই কুয়েরিতে Filtering এবং Sorting একসাথে ব্যবহার করতে পারেন। যেমন, আপনি যদি title অনুযায়ী ফিল্টার করতে চান এবং date অনুযায়ী সাজাতে চান, তাহলে কুয়েরি এইভাবে দেখতে হবে:

query {
  posts(filter: { title: "GraphQL" }, sort: { field: "date", order: DESC }) {
    id
    title
    content
    date
  }
}

এখানে:

  • filter: আমরা title "GraphQL" এর পোস্টগুলি ফিল্টার করতে চাচ্ছি।
  • sort: আমরা date অনুযায়ী descending অর্ডারে সাজাতে চাই, যাতে নতুন পোস্টগুলো প্রথমে আসে।

Server-Side Filtering and Sorting

গ্রাফকিউএল-এর Filtering এবং Sorting এর জন্য সঠিক রেজোলভার তৈরি করা গুরুত্বপূর্ণ। এটি সাধারণত সার্ভারে query parameters হিসেবে filter এবং sort গ্রহণ করে এবং ডেটাবেসে বা ডেটা সোর্সে এই শর্ত অনুযায়ী ডেটা রিটার্ন করে।

নিচে একটি সাধারণ রেজোলভার উদাহরণ দেওয়া হলো যা filter এবং sort ব্যবহার করে ডেটা ফেরত আনে:

const resolvers = {
  Query: {
    posts: (parent, { filter, sort }, context, info) => {
      let posts = [
        { id: "1", title: "GraphQL Basics", content: "Learn GraphQL", date: "2024-01-01" },
        { id: "2", title: "Advanced GraphQL", content: "Master GraphQL", date: "2024-02-01" },
        // আরো পোস্ট
      ];

      // Filtering
      if (filter) {
        if (filter.title) {
          posts = posts.filter(post => post.title.includes(filter.title));
        }
        if (filter.date) {
          posts = posts.filter(post => post.date === filter.date);
        }
      }

      // Sorting
      if (sort) {
        posts = posts.sort((a, b) => {
          if (sort.field === "date") {
            if (sort.order === "ASC") {
              return new Date(a.date) - new Date(b.date);
            } else {
              return new Date(b.date) - new Date(a.date);
            }
          }
          return 0;
        });
      }

      return posts;
    }
  }
};

এখানে:

  1. Filtering: প্রথমে filter চেক করা হয়, এবং তারপর title এবং date এর উপর ফিল্টার প্রযোজ্য করা হয়।
  2. Sorting: এরপর, sort চেক করা হয় এবং date অনুযায়ী সাজানো হয় ASC বা DESC অর্ডারে।

সারাংশ

Filtering এবং Sorting গ্রাফকিউএল-এ ডেটা ম্যানেজমেন্টের গুরুত্বপূর্ণ উপাদান। Filtering ডেটাকে নির্দিষ্ট মানের ভিত্তিতে চয়ন করতে সাহায্য করে, এবং Sorting ডেটাকে একটি নির্দিষ্ট অর্ডারে সাজানোর সুযোগ দেয়। আপনি এই দুটি কার্যকলাপ একসাথে ব্যবহার করতে পারেন, এবং সার্ভার সাইডে রেজোলভার ব্যবহার করে ডেটা প্রক্রিয়া করে সঠিক ফলাফল পেতে পারেন। GraphQL-এ filter এবং sort ব্যবহার করে আপনি দ্রুত এবং কার্যকরভাবে ডেটা ম্যানেজ করতে পারবেন।

Content added By

গ্রাফকিউএল (GraphQL)-এ Pagination এবং Filtering ব্যবহার করে ডেটা সঠিকভাবে এবং দক্ষভাবে প্রদর্শন করা হয়। এই দুটি ফিচার ব্যবহার করলে গ্রাহকরা সহজে প্রয়োজনীয় ডেটা খুঁজে পেতে পারে, এবং সার্ভারের উপর অতিরিক্ত লোডও কমে। তবে, সঠিকভাবে Pagination এবং Filtering পরিচালনার জন্য কিছু Best Practices মেনে চলা প্রয়োজন।


Pagination কী?

Pagination হল ডেটা একটি নির্দিষ্ট পরিমাণে ভাগ করে ফলাফল প্রদর্শন করার প্রক্রিয়া। যখন বড় আকারের ডেটা থাকে, তখন এটি একবারে পাঠানো অস্বাস্থ্যকর এবং কার্যকারিতার জন্য ক্ষতিকর হতে পারে। Pagination ব্যবহারের মাধ্যমে আপনি ডেটা একটি নির্দিষ্ট সংখ্যা বা পেজের মাধ্যমে ভাগ করে ফলাফল পাঠাতে পারেন।

Filtering কী?

Filtering ডেটা থেকে প্রয়োজনীয় তথ্য বের করে আনার পদ্ধতি। গ্রাফকিউএলে, আপনি বিভিন্ন ফিল্টার ব্যবহার করে ডেটাকে কাস্টমাইজ করতে পারেন, যেমন ডেটার বিশেষ শর্তের ওপর ভিত্তি করে ডেটা বের করা, যেমন age > 30 বা name = "John"


Pagination Best Practices

১. Cursor-based Pagination ব্যবহার করুন (Relay-style pagination)

Cursor-based pagination (বা Relay-style pagination) একটি অত্যন্ত জনপ্রিয় এবং কার্যকর পদ্ধতি। এই পদ্ধতিতে, আপনি ডেটার "cursor" ব্যবহার করেন, যা একটি নির্দিষ্ট পজিশনের সূচক হিসেবে কাজ করে। এটি স্ট্যাটিক পেজিনেশন (যেমন ১, ২, ৩) এর তুলনায় আরও নির্ভরযোগ্য এবং স্কেলেবল।

Cursor-based Pagination Schema Example:

type Query {
  users(first: Int, after: String): UserConnection
}

type UserConnection {
  edges: [UserEdge]
  pageInfo: PageInfo
}

type UserEdge {
  cursor: String
  node: User
}

type PageInfo {
  hasNextPage: Boolean
  hasPreviousPage: Boolean
}

এখানে:

  • first: কতগুলো ইউজার রিটার্ন করতে চান।
  • after: এর আগে থাকা শেষ ইউজারের cursor (পেজিনেশন চালানোর জন্য)।
  • UserConnection: একটি কাস্টম টাইপ যা ইউজারের ডেটা এবং পেজিনেশন সম্পর্কিত তথ্য ধারণ করে।
  • PageInfo: পেজিনেশনের তথ্য, যেমন hasNextPage এবং hasPreviousPage

Resolver Example:

const resolvers = {
  Query: {
    users: async (_, { first, after }) => {
      const users = await getUsersFromDatabase();
      const startIndex = after ? users.findIndex(user => user.cursor === after) + 1 : 0;
      const paginatedUsers = users.slice(startIndex, startIndex + first);
      const pageInfo = {
        hasNextPage: startIndex + first < users.length,
        hasPreviousPage: startIndex > 0
      };
      return {
        edges: paginatedUsers.map(user => ({ cursor: user.cursor, node: user })),
        pageInfo
      };
    }
  }
};

Cursor-based Pagination এর সুবিধা:

  • স্কেলেবিলিটি: ডেটার বড় পরিমাণে স্কেল করা সহজ।
  • অর্ডারিং: সঠিক অর্ডারে ডেটা ফেরত পাওয়া যায়, এবং ডুপ্লিকেট এন্ট্রি এড়ানো যায়।
  • পারফরম্যান্স: বড় ডেটাসেটের ক্ষেত্রে cursor pagination দ্রুত এবং কার্যকরী।

Filtering Best Practices

১. Flexible Filtering System ব্যবহার করুন

একটি শক্তিশালী এবং নমনীয় ফিল্টারিং সিস্টেম তৈরি করা জরুরি, যাতে ক্লায়েন্টরা তাদের চাহিদা অনুযায়ী ডেটা ফিল্টার করতে পারে। উদাহরণস্বরূপ, age, name, status বা যেকোনো কাস্টম ফিল্ডের ওপর ভিত্তি করে ফিল্টার করা যেতে পারে।

Filtering Example Schema:

type Query {
  users(filter: UserFilter): [User]
}

input UserFilter {
  name: String
  age: Int
  status: String
}

এখানে:

  • filter: এটি একটি ইনপুট টাইপ যা ইউজারের জন্য বিভিন্ন ফিল্টার গ্রহণ করবে।
  • UserFilter: এর মাধ্যমে নাম, বয়স, বা স্ট্যাটাসের ওপর ভিত্তি করে ইউজারের ডেটা ফিল্টার করা যাবে।

Resolver Example:

const resolvers = {
  Query: {
    users: async (_, { filter }) => {
      let users = await getUsersFromDatabase();

      if (filter) {
        if (filter.name) {
          users = users.filter(user => user.name === filter.name);
        }
        if (filter.age) {
          users = users.filter(user => user.age === filter.age);
        }
        if (filter.status) {
          users = users.filter(user => user.status === filter.status);
        }
      }
      return users;
    }
  }
};

Flexible Filtering এর সুবিধা:

  • কাস্টমাইজেশন: গ্রাহকরা তাদের প্রয়োজন অনুসারে ডেটা ফিল্টার করতে পারে।
  • নমনীয়তা: বিভিন্ন ডেটা ফিল্ডের জন্য ফিল্টার প্রয়োগ করা সম্ভব।
  • বহু ফিল্টার: একাধিক ফিল্টার একসাথে ব্যবহার করা যায়।

Pagination এবং Filtering একত্রে ব্যবহার

অনেক সময় Pagination এবং Filtering একত্রে ব্যবহৃত হয়। উদাহরণস্বরূপ, আপনি ইউজারদের একটি নির্দিষ্ট বয়সের ওপর ভিত্তি করে ফিল্টার করতে চান এবং তারপরে পেজিনেশন করতে চান।

Pagination and Filtering Schema Example:

type Query {
  users(filter: UserFilter, first: Int, after: String): UserConnection
}

এখানে, একই কুয়েরির মধ্যে filter, first, এবং after প্যারামিটারগুলো ব্যবহৃত হচ্ছে।

Resolver Example:

const resolvers = {
  Query: {
    users: async (_, { filter, first, after }) => {
      let users = await getUsersFromDatabase();

      if (filter) {
        if (filter.name) {
          users = users.filter(user => user.name === filter.name);
        }
        if (filter.age) {
          users = users.filter(user => user.age === filter.age);
        }
      }

      const startIndex = after ? users.findIndex(user => user.cursor === after) + 1 : 0;
      const paginatedUsers = users.slice(startIndex, startIndex + first);
      const pageInfo = {
        hasNextPage: startIndex + first < users.length,
        hasPreviousPage: startIndex > 0
      };
      return {
        edges: paginatedUsers.map(user => ({ cursor: user.cursor, node: user })),
        pageInfo
      };
    }
  }
};

এখানে, filter এবং pagination একসাথে ব্যবহার করা হয়েছে। প্রথমে ডেটা ফিল্টার করা হচ্ছে, তারপর pagination প্রক্রিয়া অনুসরণ করে ডেটা ভাগ করা হচ্ছে।


সারাংশ

Pagination এবং Filtering গ্রাফকিউএল-এ ডেটার প্রক্রিয়া এবং কর্মক্ষমতা উন্নত করার জন্য গুরুত্বপূর্ণ টুলস। Best Practices অনুসরণ করে, আপনি cursor-based pagination ব্যবহার করে বড় ডেটাসেট ম্যানেজ করতে পারেন এবং flexible filtering সিস্টেমের মাধ্যমে ক্লায়েন্টদের তাদের প্রয়োজনীয় ডেটা দ্রুত খুঁজে পেতে সাহায্য করতে পারেন। Pagination এবং Filtering একত্রে ব্যবহার করার মাধ্যমে ডেটা অনুসন্ধান আরও কার্যকরী, স্কেলযোগ্য এবং নমনীয় হয়ে ওঠে।

Content added By
Promotion

Are you sure to start over?

Loading...