JQLBuilder 1.0.8

Additional Details

Released for development purposes.

There is a newer version of this package available.
See the version list below for details.
dotnet add package JQLBuilder --version 1.0.8                
NuGet\Install-Package JQLBuilder -Version 1.0.8                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="JQLBuilder" Version="1.0.8" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add JQLBuilder --version 1.0.8                
#r "nuget: JQLBuilder, 1.0.8"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install JQLBuilder as a Cake Addin
#addin nuget:?package=JQLBuilder&version=1.0.8

// Install JQLBuilder as a Cake Tool
#tool nuget:?package=JQLBuilder&version=1.0.8                

JQL Builder

This repository houses a C# library designed to provide a JQL (Jira Query Language) builder, aiding programmers in constructing JQL queries programmatically.

NOTE: At its current stage, the package is considered alpha, implementing only partial functionality for the Project and Version fields.

However, the library's structure is well-defined. While a comprehensive readme is currently deemed excessive, here are some examples demonstrating how the library is intended to be used, with a focus on operators and query production.

Introduction

The JqlBuilder library provides a fluent interface for constructing Jira Query Language (JQL) queries in a flexible and expressive manner. This README serves as a guide to help you understand how to use the library effectively.

Getting Started

To start building JQL queries, use the JqlBuilder.Query entry point. The library follows a fluent API design, allowing you to chain methods to construct complex queries.

JqlBuilder.Query
    .Where(f => f.Project == "example")
    .And(f => f.Assignee == "john.doe")
    .OrderBy(f => f.Project)
    .ThenByDescending(f => f.Priority)
    .ToString();

Query Construction

The library provides extension methods for constructing various parts of a JQL query:

Filtering

  • Where: Start the query with a filter condition.
  • And: Add an AND condition to the existing filter.
  • Or: Add an OR condition to the existing filter.
JqlBuilder.Query
    .Where(f => f.Project == "example")
    .And(f => f.Assignee == "john.doe")
    .Or(f => f.Status == "In Progress");

Ordering

  • OrderBy: Specify the primary ordering field.
  • OrderByDescending: Specify the primary ordering field in descending order.
  • ThenBy: Add secondary ordering fields.
  • ThenByDescending: Add secondary ordering fields in descending order.
JqlBuilder.Query
    .OrderBy(f => f.Project)
    .ThenByDescending(f => f.Priority)
    .ThenBy(f => f.Assignee);

Building

The ToString method is used to obtain the final JQL query string.

JqlBuilder.Query
    .Where(f => f.Project == "example")
    .And(f => f.Assignee == "john.doe")
    .OrderBy(f => f.Project)
    .ThenByDescending(f => f.Priority)
    .ToString();

Examples:

Below are examples demonstrating the usage of the JqlBuilder library based on the provided test class.

Example 1: Basic Query Construction

JqlBuilder.Query
    .Where(f => f.Project == "CLOVER")
    .And(f => f.Project == 12345)
    .And(f => f.Project.In("CLOVER", 12345))
    .And(f => f.Project.In(func => func.LeadByUser("hulk@avengers.world")) | (f.Project == "CLOVER"))
    .And(f => f.Project.NotIn(func => func.WhereUserHasRole("hulk@avengers.world")))
    .ToString();

Generated JQL:

    project = "CLOVER" AND project = 12345 AND project in ("CLOVER", 12345) AND (project in projectsLeadByUser("hulk@avengers.world") OR project = "CLOVER") AND project not in projectsWhereUserHasRole("hulk@avengers.world")

Example 2: OR Condition with Ordering

JqlBuilder.Query
    .Where(f => f.Project == "CLOVER")
    .Or(f => f.Project == "HEARTH")
    .OrderBy(f => f.Project)
    .ThenByDescending(f => f.Assignee)
    .ToString();

Generated JQL:

    project = "CLOVER" OR project = "HEARTH" order by project asc, assignee desc

Example 3: Ordering Without Filtering

JqlBuilder.Query
    .OrderBy(f => f.Project)
    .ThenByDescending(f => f.Assignee)
    .ThenBy(f => f.Assignee)
    .ToString();

Generated JQL:

    order by project asc, assignee desc, assignee asc

Example 4: Complex Nested Conditions

JqlBuilder.Query
    .Where(f => f.Project == "CLOVER")
    .And(f => (f.Project == 12345) | f.Project.In("CLOVER", 12345))
    .ToString();

Generated JQL:

    project = "CLOVER" AND (project = 12345 OR project in ("CLOVER", 12345))

Example 5: Nested AND and OR Conditions

JqlBuilder.Query
    .Where(f => f.Project == "CLOVER")
    .And(f => (f.Project == 12345) | ((f.Project == "HEARTH") & (f.Project == "SPADE")))
    .ToString();

Generated JQL:

    project = "CLOVER" AND (project = 12345 OR project = "HEARTH" AND project = "SPADE")

Example 6: NOT Conditions

JqlBuilder.Query
    .Where(f => !(f.Project == "CLOVER"))
    .And(f => (f.Project == 12345) | ((f.Project == "HEARTH") & (f.Project == "SPADE")))
    .ToString();

Generated JQL:

    NOT(project = "CLOVER") AND (project = 12345 OR project = "HEARTH" AND project = "SPADE")

Example 7: Double NOT Conditions

JqlBuilder.Query
    .Where(f => !!(f.Project == "CLOVER"))
    .And(f => (f.Project == 12345) | ((f.Project == "HEARTH") & (f.Project == "SPADE")))
    .ToString();

Generated JQL:

    NOT NOT(project = "CLOVER") AND (project = 12345 OR project = "HEARTH" AND project = "SPADE")

Example 8: Double NOT Condition Only

JqlBuilder.Query
    .Where(f => !!(f.Project == "CLOVER"))
    .ToString();

Generated JQL:

    NOT NOT(project = "CLOVER")

Example 9: NULL and NOT EMPTY Conditions

JqlBuilder.Query
    .Where(f => f.Project.Is(v => v.Null))
    .And(f => (f.Project == 12345) | f.Project.IsNot(v => v.Empty))
    .ToString();

Generated JQL:

    project is NULL AND (project = 12345 OR project is not EMPTY)
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.3.0 287 2/18/2024
1.3.0-pre.77b50f4 58 2/18/2024
1.2.0 118 1/30/2024
1.1.5 114 1/28/2024
1.1.4 106 1/28/2024 1.1.4 is deprecated because it has critical bugs.
1.1.3 117 1/28/2024 1.1.3 is deprecated because it has critical bugs.
1.1.2 116 1/28/2024 1.1.2 is deprecated because it has critical bugs.
1.1.1 122 1/28/2024 1.1.1 is deprecated because it has critical bugs.
1.1.0 144 1/28/2024 1.1.0 is deprecated because it has critical bugs.
1.0.92 131 1/20/2024 1.0.92 is deprecated because it has critical bugs.
1.0.92-alpha1.0.d94cc32 66 1/20/2024 1.0.92-alpha1.0.d94cc32 is deprecated.
1.0.91 190 12/23/2023 1.0.91 is deprecated.
1.0.91-alpha1.0.80949c7 100 12/23/2023 1.0.91-alpha1.0.80949c7 is deprecated.
1.0.90 134 12/23/2023 1.0.90 is deprecated.
1.0.90-alpha1.0.7d5d4e8 78 12/23/2023 1.0.90-alpha1.0.7d5d4e8 is deprecated.
1.0.80 141 12/23/2023 1.0.80 is deprecated.
1.0.80-alpha1.2.7d5d4e8 90 12/23/2023 1.0.80-alpha1.2.7d5d4e8 is deprecated.
1.0.80-alpha1.0.66c47d0 89 12/23/2023 1.0.80-alpha1.0.66c47d0 is deprecated.
1.0.72 126 12/23/2023 1.0.72 is deprecated.
1.0.72-alpha.e6eaa37 87 12/23/2023 1.0.72-alpha.e6eaa37 is deprecated.
1.0.71-rc.ffc43be 84 12/23/2023 1.0.71-rc.ffc43be is deprecated.
1.0.70-rc.f8a64fd 89 12/23/2023 1.0.70-rc.f8a64fd is deprecated.
1.0.60-rc.48b70041a5d29a1b4... 90 12/23/2023 1.0.60-rc.48b70041a5d29a1b442488db599a11c4df1fc057 is deprecated.
1.0.50-rc 117 12/23/2023 1.0.50-rc is deprecated.
1.0.43-pre 107 12/23/2023 1.0.43-pre is deprecated.
1.0.42 141 12/23/2023 1.0.42 is deprecated.
1.0.41 134 12/23/2023 1.0.41 is deprecated.
1.0.40 153 12/23/2023 1.0.40 is deprecated.
1.0.20 148 12/22/2023 1.0.20 is deprecated.
1.0.19 136 12/22/2023 1.0.19 is deprecated.
1.0.10 158 12/22/2023 1.0.10 is deprecated.
1.0.9 140 12/22/2023 1.0.9 is deprecated.
1.0.8 146 12/22/2023 1.0.8 is deprecated.
1.0.7 135 12/22/2023 1.0.7 is deprecated.
1.0.1 149 12/22/2023 1.0.1 is deprecated.
1.0.0 130 12/21/2023 1.0.0 is deprecated.